Parsing Antlr不匹配'&燃气轮机';对于include宏
几天前我开始与antlr合作。我想用它来解析#c中的include宏。只有我感兴趣的部分,所有其他部分都无关紧要。在这里,我编写了一个简单的语法文件:Parsing Antlr不匹配'&燃气轮机';对于include宏,parsing,antlr,grammar,lexer,Parsing,Antlr,Grammar,Lexer,几天前我开始与antlr合作。我想用它来解析#c中的include宏。只有我感兴趣的部分,所有其他部分都无关紧要。在这里,我编写了一个简单的语法文件: ... parser part omitted... INCLUDE : '#include'; INCLUDE_FILE_QUOTE: '"'FILE_NAME'"'; INCLUDE_FILE_ANGLE: '<'FILE_NAME'>'; fragment FILE_NAME: ('a'..'z'|'A'..'Z'|'0
... parser part omitted...
INCLUDE : '#include';
INCLUDE_FILE_QUOTE: '"'FILE_NAME'"';
INCLUDE_FILE_ANGLE: '<'FILE_NAME'>';
fragment
FILE_NAME: ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'.'|' ')+;
MACROS: '#'('if' | 'ifdef' | 'define' | 'endif' | 'undef' | 'elif' | 'else' );
//MACROS: '#'('a'..'z'|'A'..'Z')+;
OPERATORS: ('+'|'-'|'*'|'/'|'='|'=='|'!='|'>'|'>='|'<'|'<='|'>>'|'<<'|'<<<'|'|'|'&'|','|';'|'.'|'->'|'#');
... other supporting tokens like ID, WS and COMMENT ...
。。。省略了解析器部分。。。
包括:“#包括”;
包括“文件”引号:“‘文件名’”;
包含文件角度:“”;
片段
文件名:('a''z''a''z''0''9'';
宏:“#”(“if”|“ifdef”|“define”|“endif”|“undef”|“elif”|“else”);
//宏:'#'('a'..'z'|'a'..'z')+;
运算符:(“+”|“-“|”*“|”/“|”=“|”=“|”=“|”!=“|”>“|”=“|””
似乎它试图匹配INCLUDE_FILE_角度,而不是将“;”视为运算符
我听说有一个叫做句法谓词的操作符,但我不知道在这种情况下如何正确使用它
如何以鼓励使用Antlr的方式解决此问题?看起来这里没有太多关于Antlr的活动 不管怎样,我知道了
INCLUDE_MACRO: ('#include')=>'#include';
VERSION_MACRO: ('#version')=>'#version';
OTHER_MACRO:
(
|('#if')=>'#if'
|('#ifndef')=>'#ifndef'
|('#ifdef')=>'#ifdef'
|('#else')=>'#else'
|('#elif')=>'#elif'
|('#endif')=>'#endif'
);
这只解决了问题的前一半。其次,不能使用INCLUDE_FILE_角度来匹配#INCLUDE指令中所需的字符串。
“”标记会产生歧义,必须从lexer中分解为基本标记或使用更高级的上下文感知检查。我不熟悉后面的技术,因此我在解析器规则中写了以下内容:
include_statement :
INCLUDE_MACRO include_file
-> ^(INCLUDE_MACRO include_file);
include_file
: STRING
| LEFT_ANGLE(INT|ID|OPERATORS)+RIGHT_ANGLE
;
虽然这是可行的,但无可否认,它看起来很丑陋。
我希望有经验的用户可以评论更好的解决方案
include_statement :
INCLUDE_MACRO include_file
-> ^(INCLUDE_MACRO include_file);
include_file
: STRING
| LEFT_ANGLE(INT|ID|OPERATORS)+RIGHT_ANGLE
;