Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 从汇编语言到机器代码的JavaCC解析器——指令分离问题_Assembly_Parser Generator_Javacc - Fatal编程技术网

Assembly 从汇编语言到机器代码的JavaCC解析器——指令分离问题

Assembly 从汇编语言到机器代码的JavaCC解析器——指令分离问题,assembly,parser-generator,javacc,Assembly,Parser Generator,Javacc,HY.我正在尝试使用JavaCC(汇编程序)制作一个解析器,将汇编代码(微控制器8051)转换为机器代码。我已经阅读了JavaCC语法及其结构方式,但我遇到了一个难题。例如,我有ADD指令: `ADD A,Rn` or `ADD A,@Ri` 对于每一个,我都有一个机器代码(hexa代码),例如:adda,R0转换为28H。 我还可以使用MOV指令: mova,Rn或mova,@Ri但我也有MOV data\u addr,Rn和movr6,#data等等 现在我的问题是如何在两条指

HY.我正在尝试使用JavaCC(汇编程序)制作一个解析器,将汇编代码(微控制器8051)转换为机器代码。我已经阅读了JavaCC语法及其结构方式,但我遇到了一个难题。例如,我有
ADD
指令:

`ADD A,Rn`   or   `ADD  A,@Ri` 
对于每一个,我都有一个机器代码(hexa代码),例如:
adda,R0
转换为28H。 我还可以使用
MOV
指令:
mova,Rn
mova,@Ri
但我也有
MOV data\u addr,Rn
movr6,#data
等等

现在我的问题是如何在两条指令之间进行区分。如果我这样定义我的标记:
Token{


| 似乎你对lexer期望太高了。lexer是一个有限状态机,而解析器不是

因此,lexer应该为指令(
MOV
ADD
,…)和操作数生成标记。lexer不应该试图太聪明,期望特定指令使用特定操作数


现在,解析器可以预期指令和操作数的特定组合。例如,您只能接受带有
MOV
指令的
@
操作数,因此任何其他操作数都将导致解析异常

如果需要进一步验证指令和操作数的组合,则必须在产品代码中进行验证。例如,对于某些指令,您可以将两个相同的操作数视为错误;这在产品代码中很难表达,但在代码中却很简单


如果您需要进一步验证,例如通过检测无效的指令序列,那么您必须在整个产品中保持一个状态,或者甚至构建一个AST并在解析完成后对其进行处理。

有关您需要在解析器中为汇编代码编写的各种内容的大量示例,请参见此

“例如,MOV指令只能接受@operans,因此任何其他操作数都会导致解析异常。”我怎么做?我识别标记,就是它,然后识别参数,然后我只陈述我的情况?@Alexander您可以定义
MOV()
生产如下:
。或者,您可以在更通用的
指令()的代码中实现这一点。因此,基本上我为每条指令定义了一个解析器函数,wright?
Mov()
将具有
,并且我将在更高级别调用这些函数,如
Instr(){Mov()| And()| etc}
@Alexander确实如此。通过这种方式,您可以轻松指定每指令语法(操作数的数量、允许的操作数类型等)以及代码中可能的特殊处理(例如禁止某些操作数值的组合)。