Assembly 从汇编语言到机器代码的JavaCC解析器——指令分离问题
HY.我正在尝试使用JavaCC(汇编程序)制作一个解析器,将汇编代码(微控制器8051)转换为机器代码。我已经阅读了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等等 现在我的问题是如何在两条指
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确实如此。通过这种方式,您可以轻松指定每指令语法(操作数的数量、允许的操作数类型等)以及代码中可能的特殊处理(例如禁止某些操作数值的组合)。