Gar*_*luk 9 assembly parsing z80 lexical-analysis
我对编写汇编程序的概念非常陌生,即使在阅读了大量材料之后,我仍然难以绕过几个概念.
将源文件实际分解为令牌的过程是什么?我相信这个过程叫做lexing,我已经搜索了一些有意义的实际代码示例,但我找不到一个如此简单的代码示例非常受欢迎;)
在解析时,是否需要在树上向上或向下传递信息?我问的原因如下,采取:
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节点是否根据操作数返回不同的东西,或者它是返回某些东西的操作数?这是如何实现的?如果时间允许,更简单的代码示例将是非常好的.
那么,你真正想要一个在寄存器上操作的指令的树的结构和一个包含偏移量位移和索引寄存器的存储器寻址模式看起来像这样:
INSTRUCTION-----+
| | |
OPCODE REG OPERAND
| |
OFFSET INDEXREG
Run Code Online (Sandbox Code Playgroud)
是的,你想要在树上上下传递值.用于正式指定此类值传递的方法称为"属性语法",并使用值传递和对这些值的计算来为您的语言(在您的情况下,您的汇编语法)修饰语法.有关更多背景信息,请参阅Wikipedia上的属性语法.
在你问的一个相关问题中,我讨论了一个工具DMS,它处理表达式语法和构建树.作为语言处理工具,DMS完全面对树信息流问题的上下相同.作为一种高端语言操作工具,它可以直接处理属性语法计算,这不应该让您感到惊讶.
小智 6
没有必要构建一个解析树.Z80操作码非常简单.它们由操作码和0,1或2个操作数组成,以逗号分隔.您只需要使用非常简单的解析器将操作码拆分为(最多3个)组件 - 不需要树.