我试图匹配具有相同开头但最终不同的东西,例如:
' +'东西+
' +' | ' - ' | ' /' | ' *'什么东西不同的东西是什么
我的以下代码是:
something: // rule for something here
rule1: '+' something+
rule2: OPERATOR something something somethingDifferentAtTheEnd
ruleForSomethingDifferent: // goes here
OPERATOR: '+' | '-' | '/' | '*'
问题是我无法使其发挥作用,我似乎总是得到无关的输入'当我通过以' +'开头的rule2时出错(它试图匹配第一个并失败,因为它有一个不同的东西,但它不会落到第二个规则......
答案 0 :(得分:1)
词法分析者将消耗所有' +'字符在到达解析器之前,因此rule1
会混淆Antlr - 可能在生成解析器/词法分析器时出现错误或警告,并且可能为什么运行时错误消息似乎没有多少感。在继续之前应纠正所有代错误和警告。
在匹配规则中,始终首先选择匹配最长令牌序列的规则。
这很可能是你想要的:
rule1 : Plus a+ ;
rule2 : operator a a b ;
a : .... ;
b : .... ;
operator : Plus | Minus | Div | Star ;
Plus : '+' ;
Minus: '-' ;
Div : '/' ;
Star : '*' ;