我为MOS 6502微处理器编写了一个带有预处理器的汇编程序。汇编程序输出正确的二进制,预处理器执行常量替换、包含和条件包含。问题是保留包含的文件的文件位置。此时,预处理程序在包含文件之前和之后发出文件指令。下面是一个例子。
Proggie.asm
JSR init
JSR loop
JSR end
%include "Init.asm"
%include "Loop.asm"
%include "End.asm"Init.asm
init:
LDX #$00
RTSLoop.asm
loop:
INX
CPX #$05
BNE loop
RTSEnd.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指令告诉词法分析器刚刚输入或退出了一个文件。文件路径后面的数字表示分析器是否分别进入或退出给定的文件。我的词法分析器可以处理这个。当告诉当前的行号时,它仍然有点。
所以我的问题是:这是要走的路吗?或者我还能用另一种算法?
发布于 2015-03-11 16:50:14
Gcc的预处理器制作的线路控制指令如下:
# 122 "/usr/include/x86_64-linux-gnu/bits/types.h" 2 3 4在这里,122是文件/usr/include/x86_64-linux-gnu/bits/types.h中的行号。包括行号意味着下游的lexer不需要跟踪包含堆栈来判断它在哪一行。
行的其余部分是标志,它们类似于您的方法,添加了几个特定于gcc的标志:
这些允许下游的lexer跟踪包含堆栈,如果它愿意,gcc这样做,以便产生更多的信息(或至少更多的文字)错误信息。
我认为在预处理器维护堆栈的情况下,逻辑更容易一些,但这并没有产生太大的差别,特别是如果您还想在错误消息中生成“包括在”注释中。
https://stackoverflow.com/questions/28986472
复制相似问题