HY。我正在尝试使用JavaCC(汇编程序)将解析器从汇编代码(Microcontroller 8051)转换为Machine COde。我已经阅读了有关javaCC语法及其结构的方式,但我有一个两难选择例如,我有ADD
指令:
`ADD A,Rn` or `ADD A,@Ri`
并且每个人都有一个机器代码(hexa代码)ex:ADD A,R0
转换为28H。
我也可以得到MOV
指令:
MOV A,Rn
或MOV A,@Ri
但我也有MOV data_addr,Rn
和MOV R6,#data
等等。
现在我的问题是我如何在2条指令之间做出这种区别。我定义了这样的标记:
Token{
<IN_MOV :"mov">
|<IN_ADD:"add"
}
我无法为每个标记定义函数来指定特定行为,因为我有很多指令。要说token.image==.equals("mov"), then go on one direction to the specific behaviour
它有点多,你不觉得吗?....所以我是几乎卡住了。我不知道该走的路
谢谢你的帮助。!
答案 0 :(得分:3)
你似乎对词法分析师的期望太高了。词法分析器是一个有限状态机,而解析器则不是。
因此词法分析器应该为指令(MOV
,ADD
,...)和操作数的标记生成标记。词法分析者不应该试图过于聪明,并期望特定操作数用于特定指令。
现在,解析器可以期望指令和操作数的特定组合。例如,您只能接受带有@
指令的MOV
个操作数,这样任何其他操作数都会导致解析异常。
如果需要进一步验证指令和操作数的组合,则必须在制作代码中进行。例如,您可以将两个相同的操作数视为某些指令的错误;这在制作中很难表达,但在代码中很容易表达。
如果您需要进一步验证,例如通过检测无效的指令序列,那么您将不得不在整个产品中维护一个状态,甚至构建一个AST并在解析完成后对其进行处理。
答案 1 :(得分:0)
有关汇编代码解析器中需要编写的大量示例,请参阅此complete assembly language grammar。