1

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

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

并且对于他们每个人,我都有一个 Machine code (hexa code)ex:ADD A,R0转换为 28H 。而且我也可以得到MOV指令:
MOV A,Rn或者MOV A,@Ri但我也有 MOV data_addr,Rn等等 MOV R6,#data

现在我的问题是我如何在两条指令之间做出这种区别。假设我这样定义我的标记: 我无法为每个标记定义函数来指定特定行为的函数,因为我有很多指令。说这是一个很少,你不觉得吗?....所以我几乎被卡住了。我不知道该怎么走。 谢谢你的帮助。!
Token{
<IN_MOV :"mov">
|<IN_ADD:"add"
}

token.image==.equals("mov"), then go on one direction to the specific behaviour

4

2 回答 2

3

看来您对词法分析器的期望过高。词法分析器是有限状态机,而解析器不是。

因此,词法分析器应该为指令(MOV, ADD, ...)生成标记,并为操作数生成标记。词法分析器不应该尝试太聪明并期望特定操作数用于特定指令。

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

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

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

于 2011-03-15T15:39:41.977 回答
0

有关您需要在解析器中为汇编代码编写的大量示例,请参阅此完整的汇编语言语法。

于 2011-03-19T17:36:14.367 回答