我已为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指令告诉词法分析器刚刚输入或退出文件。文件路径后面的数字表示分析仪是分别进入还是退出给定文件。我的词法分析器有点适用。告诉当前行号时仍然有点儿。
所以我的问题是:这是要走的路吗?或者我可以使用另一种算法吗?
答案 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的标志:
这些允许下游词法分析器根据需要跟踪包含堆栈,并且gcc词法分析器这样做是为了产生更多信息(或至少更多罗嗦)的错误消息。
我认为预处理器维护堆栈的逻辑更容易,但它并没有产生很大的差异,特别是如果你也想要生成"包含在&#中34;错误消息中的注释。