在以下示例中,我有一种语法需要匹配:
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) != '>' }?
;
谢谢!
答案 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"
。