ANTLR4词法分析器规则,确保表达式不以字符结尾

时间:2019-02-07 21:30:42

标签: antlr4 lexer

在以下示例中,我有一种语法需要匹配:

Event Fired Rules

在此示例中,我需要将“ some-Text”和“ more-Text”匹配为一个lexer规则,而将“->”作为另一个规则的ANTLR4 lexer规则。

我使用下面显示的词法分析器规则作为起点,但是麻烦的是,NAMEDELMENT规则中允许使用“-”字符,这会使第一个NAMEDELEMENT匹配变为“ some-Text-”,然后导致EDGE规则无法捕获“->”。

我正在寻找一种方法,以确保在NAMEDELEMENT规则(或其他产生期望结果的替代方法)中,不将'-'作为最后一个字符捕获。

some-Text->more-Text

我正在尝试使用上面的谓词来查找“-”和“>”的序列,但似乎不起作用。实际上,它似乎根本不做任何事情,因为无论有没有谓词都可以获得相同的解析结果。

解析器规则如下,其中我匹配“选择器”规则:

EDGE
    :   '->'
    ;

NAMEDELEMENT  
    :   ('a'..'z'|'A'..'Z'|'_'|'@') ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'-')* { _input.LA(1) != '-' && _input.LA(2) != '>' }?
    ;

谢谢!

2 个答案:

答案 0 :(得分:0)

在处理了几个小时之后,我有了一个可以使用的语法,尽管我看不出它在功能上与原始问题中的内容有何不同。

(我使用无注释版本,以便可以在生成的词法分析器中放置一个断点,以确保相等性测试正确评估。)

NAMEDELEMENT  
    //: [a-zA-Z_@] [a-zA-Z_-]* { String.fromCharCode(this._input.LA(1)) != ">" }? 
    : [a-zA-Z_@] [a-zA-Z_-]* { (function(a){
            var c = String.fromCharCode(a._input.LA(1));
            return c != ">";
        })(this)
    }? 
    ;

我的目标语言是JavaScript,谓词的注释和未注释形式都可以正常工作。

答案 1 :(得分:0)

尝试一下:

NAMEDELEMENT
 : [a-zA-Z_@] ( '-' {_input.LA(1) != '>'}? | [a-zA-Z0-9_] )*
 ;

不确定_input.LA(1) != '>'是否适合JavaScript运行时,但是在Java中,它可以正确地将"some-->more"标记为"some-""->""more"