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

时间:2011-03-15 14:59:35

标签: assembly parser-generator javacc

HY。我正在尝试使用JavaCC(汇编程序)将解析器从汇编代码(Microcontroller 8051)转换为Machine COde。我已经阅读了有关javaCC语法及其结构的方式,但我有一个两难选择例如,我有ADD指令:

`ADD A,Rn`   or   `ADD  A,@Ri` 

并且每个人都有一个机器代码(hexa代码)ex:ADD A,R0转换为28H。  我也可以得到MOV指令:
        MOV A,RnMOV A,@Ri但我也有MOV data_addr,RnMOV R6,#data等等。

现在我的问题是我如何在2条指令之间做出这种区别。我定义了这样的标记:
     Token{
<IN_MOV :"mov">
|<IN_ADD:"add"
}

我无法为每个标记定义函数来指定特定行为,因为我有很多指令。要说token.image==.equals("mov"), then go on one direction to the specific behaviour它有点多,你不觉得吗?....所以我是几乎卡住了。我不知道该走的路 谢谢你的帮助。!

2 个答案:

答案 0 :(得分:3)

你似乎对词法分析师的期望太高了。词法分析器是一个有限状态机,而解析器则不是。

因此词法分析器应该为指令(MOVADD,...)和操作数的标记生成标记。词法分析者不应该试图过于聪明,并期望特定操作数用于特定指令。

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

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

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

答案 1 :(得分:0)

有关汇编代码解析器中需要编写的大量示例,请参阅此complete assembly language grammar