预处理代码的词法分析

时间:2015-03-11 12:19:32

标签: language-agnostic preprocessor lexical-analysis

我已为MOS 6502微处理器编写了带有预处理器的汇编程序。汇编程序吐出正确的二进制文件,预处理程序执行常量替换,包含和条件包含。问题是保留包含文件的文件位置。此时,预处理器在包含文件之前和之后发出文件指令。这是一个例子。

Proggie.asm

JSR init
JSR loop
JSR end

%include "Init.asm"

%include "Loop.asm"

%include "End.asm"

Init.asm

init:
    LDX #$00
    RTS

Loop.asm

loop:
    INX
    CPX #$05
    BNE loop
    RTS

End.asm

end:
    BRK

预处理结果

%file "D:\Proggie.asm" 1
    JSR init
    JSR loop
    JSR end

%file "D:\Init.asm" 1
init:
    LDX #$00
    RTS%file "D:\Init.asm" 2

%file "D:\Loop.asm" 1
loop:
    INX
    CPX #$05
    BNE loop
    RTS%file "D:\Loop.asm" 2

%file "D:\End.asm" 1
end:
    BRK%file "D:\End.asm" 2
%file "D:\Proggie.asm" 2

这个想法来自GCC预处理器产生的输出。 %file指令告诉词法分析器刚刚输入或退出文件。文件路径后面的数字表示分析仪是分别进入还是退出给定文件。我的词法分析器有点适用。告诉当前行号时仍然有点儿。

所以我的问题是:这是要走的路吗?或者我可以使用另一种算法吗?

1 个答案:

答案 0 :(得分:1)

Gcc的预处理器制作行控制指令,如下所示:

# 122 "/usr/include/x86_64-linux-gnu/bits/types.h" 2 3 4

此处,122是文件/usr/include/x86_64-linux-gnu/bits/types.h中的行号。包括行号意味着下游词法分析器不需要跟踪包含堆栈以便告知它在哪条线路上。

该行的其余部分是标志,与您的方法类似,并添加了几个特定于gcc的标志:

  • ' 1'这表示新文件的开始。
  • ' 2'这表示返回文件(包含其他文件后)。
  • ' 3'这表示以下文本来自系统头文件,因此应禁止某些警告。
  • ' 4'这表明以下文本应被视为包含在隐含的" C"'''块。

这些允许下游词法分析器根据需要跟踪包含堆栈,并且gcc词法分析器这样做是为了产生更多信息(或至少更多罗嗦)的错误消息。

我认为预处理器维护堆栈的逻辑更容易,但它并没有产生很大的差异,特别是如果你也想要生成"包含在&#中34;错误消息中的注释。