Parsing Antlr不匹配'&燃气轮机';对于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

几天前我开始与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'..'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
    ;