首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >预处理代码的词法分析

预处理代码的词法分析
EN

Stack Overflow用户
提问于 2015-03-11 12:19:31
回答 1查看 78关注 0票数 0

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

Proggie.asm

代码语言:javascript
复制
JSR init
JSR loop
JSR end

%include "Init.asm"

%include "Loop.asm"

%include "End.asm"

Init.asm

代码语言:javascript
复制
init:
    LDX #$00
    RTS

Loop.asm

代码语言:javascript
复制
loop:
    INX
    CPX #$05
    BNE loop
    RTS

End.asm

代码语言:javascript
复制
end:
    BRK

预处理结果

代码语言:javascript
复制
%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指令告诉词法分析器刚刚输入或退出了一个文件。文件路径后面的数字表示分析器是否分别进入或退出给定的文件。我的词法分析器可以处理这个。当告诉当前的行号时,它仍然有点。

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

EN

回答 1

Stack Overflow用户

发布于 2015-03-11 16:50:14

Gcc的预处理器制作的线路控制指令如下:

代码语言:javascript
复制
# 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的标志:

  • “1”表示新文件的开始。
  • “2”表示返回到一个文件(在包含了另一个文件之后)。
  • “3”表示以下文本来自系统头文件,因此某些警告应该被抑制。
  • '4‘这意味着以下文本应该被视为被包装在一个隐式'extern’C‘块中。

这些允许下游的lexer跟踪包含堆栈,如果它愿意,gcc这样做,以便产生更多的信息(或至少更多的文字)错误信息。

我认为在预处理器维护堆栈的情况下,逻辑更容易一些,但这并没有产生太大的差别,特别是如果您还想在错误消息中生成“包括在”注释中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28986472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档