Lexer规则歧义
本文关键字:歧义 规则 Lexer | 更新日期: 2023-09-27 18:02:32
所以我正在构建一个语法来解析c++
头文件。
我只写了头文件的语法,我不打算为实现写任何语法。
我的问题是,如果一个方法是在头文件中实现的,而不是仅仅定义。
Foo bar()
{
//some code
};
我只是想将bar
的实现与
BLOCK
: '{' INTERNAL_BLOCK*? '}'
;
fragment INTERNAL_BLOCK
: BLOCK
| ~('}')
;
但是这会干扰任何其他包含{ ... }
的语法,因为这将始终匹配两个大括号之间的内容。当存在歧义时,是否有办法指定使用哪个令牌?
注。我不知道BLOCK
的语法是否有效,但你得到了要点。
所以,重要的解析器规则是:
method : mType mTypeName LPAREN RPAREN BLOCK ; // simplified
unknown : . ;
词法分析器生成的未作为方法规则的一部分匹配的BLOCK令牌将出现在解析树中未知的上下文节点中。分析方法上下文节点,忽略未知节点