Lexer规则歧义

本文关键字:歧义 规则 Lexer | 更新日期: 2023-09-27 18:02:32

所以我正在构建一个语法来解析c++头文件。

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

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

Foo bar()
{
    //some code
};

我只是想将bar的实现与

相匹配
BLOCK 
    : '{' INTERNAL_BLOCK*? '}'
    ;
fragment INTERNAL_BLOCK
    : BLOCK
    | ~('}')
    ;

但是这会干扰任何其他包含{ ... }的语法,因为这将始终匹配两个大括号之间的内容。当存在歧义时,是否有办法指定使用哪个令牌?

注。我不知道BLOCK的语法是否有效,但你得到了要点。

Lexer规则歧义

所以,重要的解析器规则是:

method  : mType mTypeName LPAREN RPAREN BLOCK ; // simplified
unknown : . ;

词法分析器生成的未作为方法规则的一部分匹配的BLOCK令牌将出现在解析树中未知的上下文节点中。分析方法上下文节点,忽略未知节点