编写Z80汇编程序 - lexing ASM并使用组合构建解析树?

Gar*_*luk 9 assembly parsing z80 lexical-analysis

我对编写汇编程序的概念非常陌生,即使在阅读了大量材料之后,我仍然难以绕过几个概念.

  1. 将源文件实际分解为令牌的过程是什么?我相信这个过程叫做lexing,我已经搜索了一些有意义的实际代码示例,但我找不到一个如此简单的代码示例非常受欢迎;)

  2. 在解析时,是否需要在树上向上或向下传递信息?我问的原因如下,采取:

    LD BC,nn

一旦标记化(???),它需要变成以下的解析树

  ___ LD ___
  |        |
 BC        nn
Run Code Online (Sandbox Code Playgroud)

现在,当遍历此树时,它需要生成以下机器代码:

01 n n
Run Code Online (Sandbox Code Playgroud)

如果说明是:

LD DE,nn
Run Code Online (Sandbox Code Playgroud)

然后输出需要是:

11 n n
Run Code Online (Sandbox Code Playgroud)

这意味着它提出了问题,LD节点是否根据操作数返回不同的东西,或者它是返回某些东西的操作数?这是如何实现的?如果时间允许,更简单的代码示例将是非常好的.

我最感兴趣的是学习一些原始流程,而不是查看先进的现有工具,所以在将我发送给YaccFlex之前请记住这一点.

Ira*_*ter 9

那么,你真正想要一个在寄存器上操作的指令的树的结构和一个包含偏移量位移和索引寄存器的存储器寻址模式看起来像这样:

    INSTRUCTION-----+
    |      |        |
  OPCODE  REG     OPERAND
                  |     |
                OFFSET  INDEXREG
Run Code Online (Sandbox Code Playgroud)

是的,你想要在树上上下传递值.用于正式指定此类值传递的方法称为"属性语法",并使用值传递和对这些值的计算来为您的语言(在您的情况下,您的汇编语法)修饰语法.有关更多背景信息,请参阅Wikipedia上的属性语法.

你问的一个相关问题中,我讨论了一个工具DMS,它处理表达式语法和构建树.作为语言处理工具,DMS完全面对树信息流问题的上下相同.作为一种高端语言操作工具,它可以直接处理属性语法计算,这不应该让您感到惊讶.

  • 当递归下降工作时,它工作得很好.但它只适用于不能快速更改的适度大小的语法(当你构建DSL时有时语法确实快速改变)并且不需要任何前瞻或任何类型信息来解析解析(你心爱的C++有一个坏的)这是预见问题).当您不在该窗口中时,更强大(读取"完全无上下文")解析引擎更好,并且完整语法的明确规范使得修改和维护更容易.一旦你有这样的机器,它也容易杀死gnats,你应该. (2认同)

小智 6

没有必要构建一个解析树.Z80操作码非常简单.它们由操作码和0,1或2个操作数组成,以逗号分隔.您只需要使用非常简单的解析器将操作码拆分为(最多3个)组件 - 不需要树.

  • @Gary如果你想让生活变得复杂,你可以这样做.我编写了几个汇编程序(虽然不是Z80的汇编程序),它们通常可以通过简单的标记方案(我在答案中建议)和表达式评估程序轻松实现,以评估地址和其他表达式.表达式evlauator可以使用树(尽管根据我的经验,基于堆栈就足够了)但是不需要将解析树作为基本数据结构. (2认同)