C# Antlr 4 Lexer规则歧义

C# Antlr 4 Lexer规则歧义,c#,antlr,antlr4,lexer,C#,Antlr,Antlr4,Lexer,因此,我正在构建一个语法来解析c++头文件 我只为头文件编写了语法,不打算为实现编写任何语法 我的问题是,如果一个方法是在头中实现的,而不是仅仅定义的 Foo bar() { //some code }; 我只想将bar的实现与 BLOCK : '{' INTERNAL_BLOCK*? '}' ; fragment INTERNAL_BLOCK : BLOCK | ~('}') ; 但这会干扰任何其他语法,包括{…},因为这将始终匹配两个大

因此,我正在构建一个语法来解析
c++
头文件

我只为头文件编写了语法,不打算为实现编写任何语法

我的问题是,如果一个方法是在头中实现的,而不是仅仅定义的

Foo bar()
{
    //some code
};
我只想将
bar
的实现与

BLOCK 
    : '{' INTERNAL_BLOCK*? '}'
    ;

fragment INTERNAL_BLOCK
    : BLOCK
    | ~('}')
    ;
但这会干扰任何其他语法,包括
{…}
,因为这将始终匹配两个大括号之间的内容。当存在歧义时,是否仍需要指定要使用的令牌


p、 我不知道
的语法是否有效,但你知道要点。

因此,重要的解析器规则是:

method  : mType mTypeName LPAREN RPAREN BLOCK ; // simplified
unknown : . ;
lexer生成的块标记(作为方法规则的一部分不匹配)将出现在未知上下文节点的解析树中。分析方法上下文节点并忽略未知节点