gpt4 book ai didi

c# - 将预处理层添加到 ANTLR4 而不删除 token 的偏移量

转载 作者:太空宇宙 更新时间:2023-11-03 12:27:33 25 4
gpt4 key购买 nike

我目前正在尝试为 c# 在 ANTLR4 中实现一个预处理器,但在查找有关此的任何信息时遇到了很多麻烦。遗憾的是,我对 C# 项目的 GitHub 资源的挖掘并没有真正成功......

我的目标是保留 token 偏移量(这样列和行就不会被预处理流抛出)举例粗略说明:

 #define foo(bar) foobar(bar + bar * bar / 0.2)
int smthng = 2;
smthng += foo(12); //the ; should be at the same spot like the macro was a function

希望你能给我指出正确的文档或在某处提供一个简单的示例解决方案

亲切的问候,马可

PS 请注意:我不寻求将已预处理的流传递给 ANTLR4 的解决方案,因为这会扰乱代码的偏移量。

最佳答案

预处理指令解析有两种策略:

  • 一步处理
  • 两步处理

第二种方式不适合您,因为文本位置会因宏扩展而损坏。

使用第一种方法,您可以在单个通用词法分析器中对预处理器指令进行标记化,从而保存正确的文本位置。

参见 Objective-C grammar和一个 One-step Processing “在 Objective-C 中解析预处理器指令”一文中的部分:

One-step processing involves the simultaneous parsing of directives and tokens of the primary language. ANTLR introduces a system of channels isolating tokens by their type. For example, tokens of the primary language and hidden tokens (whitespaces and comments). The directive tokens can be added to a separate named channel.

在某些情况下,指令 token 也可以包含在公共(public) channel 中。比较方便。参见 token NS_OPTIONS 和规则 enumSpecifier 例如:

enumSpecifier
: 'enum' (identifier? ':' typeName)? (identifier ('{' enumeratorList '}')? | '{' enumeratorList '}')
| ('NS_OPTIONS' | 'NS_ENUM') LP typeName ',' identifier RP '{' enumeratorList '}'
;

您还可以将预处理器指令解析为简单的字符串,然后再解析它:定义:'#define' ~[\r\n]*

Swiftify , Objective-C to Swift converter,我们使用的是一步处理的方式。我很快就会更新 Objective-C 语法。

关于c# - 将预处理层添加到 ANTLR4 而不删除 token 的偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44080987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com