【问题标题】:JavaCC parser from Assembly Language to Machine Code -instruction separation problemJavaCC 解析器从汇编语言到机器码的指令分离问题
【发布时间】:2011-03-15 14:59:34
【问题描述】:

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

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

对于他们每个人,我都有一个机器代码(十六进制代码)例如:ADD A,R0 转换为 28H 。 我也可以使用MOV 指令:
MOV A,RnMOV A,@Ri 但我也有MOV data_addr,RnMOV R6,#data 等等。

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

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

【问题讨论】:

    标签: assembly parser-generator javacc


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • "例如,您只能接受带有 MOV 指令的 @ 操作数,这样任何其他操作数都会导致解析异常。"我怎样才能做到这一点?我识别令牌,就是它,然后我识别参数,然后我只是陈述我的情况?
    • @Alexander 您可以将Mov() 定义如下:&lt;MOV&gt; &lt;AT_OPERAND&gt;。或者,您可以在更通用的 Instruction() 生产代码中执行此操作。
    • 所以基本上我为每条指令定义了一个解析器的函数,对吧? Mov() 将有 &lt;MOV&gt; &lt;logic for the posible operand&gt; ,并且这些函数中的每一个我都会调用更高级别的函数,例如 Instr() {Mov() | And() | etc}
    • @Alexander 确实。通过这种方式,您可以轻松指定每条指令的语法(操作数的数量、允许的操作数类型……)以及可能在代码中进行特殊处理(例如禁止操作数值的某些组合)。
    【解决方案2】:

    请参阅此complete assembly language grammar,了解您需要在解析器中为汇编代码编写的各种示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 2019-12-10
      相关资源
      最近更新 更多