gpt4 book ai didi

c - Antlr4 预处理器语法与 C 语法集成

转载 作者:太空宇宙 更新时间:2023-11-04 04:13:19 25 4
gpt4 key购买 nike

我是 Antlr4 的新手。我正在使用 Antlr4 和 antlr4 adaptor解析 C 文件并生成 PSI 树。

我知道 C 预处理器应该处理 #include 和 #define 部分并将结果传递给 C 词法分析器和 C 解析器。但我需要为 C.g4 解析 #include 和 #define | , 这样我的插件就可以在没有预处理器的情况下处理 C 文件。

我调查了这个link并尝试了解决方案,但是当它遇到预处理器语句以外的其他内容时,它就无法解决。

示例 C 代码

#include <stdio.h>

int main()
{
int i,j;
for(i=1;i<=9;)
{
for(j=1;j<=9;j)
{
if(i>=j)
{
printf("%d*%d=%d ",j,i,j*i);
}
j++;
}
printf("\n");
i++;
}
return 0;
}

结果树是这样的

enter image description here

你可以在图像中看到,在 include block 之后,所有元素都不是树。

我删除了示例 C 代码中的 #include 行,并使用了原始的 C.g4语法,它可以像下面这样解析一个好的 PSI 树:

enter image description here

谁能帮我改进语法打击?这样我的语法就可以在不使用任何预处理器的情况下将#include 和#define 解析为 PSI 树中的预处理器 block 。

谢谢

Whitespace
: [ \t]+
-> channel(HIDDEN)
;
Newline
: ( '\r' '\n'?
| '\n'
)
-> channel(HIDDEN)
;

BlockComment
: '/*' .*? '*/'
;

LineComment
: '//' ~[\r\n]*
;


IncludeBlock
: '#' Whitespace? 'include' ~[\r\n]*
;

DefineStart
: '#' Whitespace? 'define'
;

DefineBlock
: DefineStart (~[\\\r\n] | '\\\\' '\r'? '\n' | '\\'. )*
;

MultiDefine
: DefineStart MultiDefineBody
;

MultiDefineBody
: [\\] [\r\n]+ MultiDefineBody
| ~[\r\n]
;

preprocessorDeclaration
: includeDeclaration
| defineDeclaration
;

includeDeclaration
: IncludeBlock
;

defineDeclaration
: DefineBlock | MultiDefine
;

comment
: BlockComment
| LineComment
;

declaration
: declarationSpecifiers initDeclaratorList ';'
| declarationSpecifiers ';'
| staticAssertDeclaration
| preprocessorDeclaration
| comment
;

最佳答案

我尝试并解决了我自己的问题。

诀窍是换行符应该像下面这个语法一样被跳过,它不应该使用 channel(HIDDEN)。

Newline
: ( '\r' '\n'?
| '\n'
)
-> channel(HIDDEN)
;

应该改为

Newline
: ( '\r' '\n'?
| '\n'
)
-> skip
;

好的PSI树是下面这样的

good PSI tree with #include and #define

反正我不是很明白channel(HIDDEN)和skip的区别。

关于c - Antlr4 预处理器语法与 C 语法集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54822851/

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