Antlr 语法谓词不起作用

Antlr 语法谓词不起作用,antlr,predicate,antlr3,Antlr,Predicate,Antlr3,第一条规则永远不起作用。它应该处理类似“ID1.ID2.ID3.ID4.ID5”的内容。 但其他规则也如预期的那样起作用。怎么了 grammar testInt; data_source: (ID '.' ID '.' ID ('.' ID)+)=>program_ref | (ID '.' ID '.' ID)=>var_ref | (ID '.' ID)=>program_ref | resource; program_ref: ID

第一条规则永远不起作用。它应该处理类似“ID1.ID2.ID3.ID4.ID5”的内容。 但其他规则也如预期的那样起作用。怎么了

grammar testInt;

data_source:
     (ID '.' ID '.' ID ('.' ID)+)=>program_ref
    | (ID '.' ID '.' ID)=>var_ref
    | (ID '.' ID)=>program_ref
    | resource;

program_ref: ID ('.' ID)+;
var_ref:    ID '.' ID '.' ID;
resource:   ID;

ID:  (LETTER | ('_'(LETTER | DIGIT))) ('_'? (LETTER | DIGIT))*;
WSFULL:(' '|'\r'|'\t'|'\u000C'|'\n') {$channel=HIDDEN;};

fragment LETTER: (('a'..'z') | ('A'..'Z'));
fragment DIGIT: '0'..'9';

ANTLR似乎首先尝试在
program\u ref
之前匹配
var\u ref
,因为后者可能只匹配2个
ID
,其中
var\u ref
匹配3个,解析器贪婪地匹配令牌


我想这只是一个假人(你的一部分)语法:您试图解决的是一个真实世界的问题吗?

看起来ANTLR首先尝试在
program\u-ref
之前匹配
var\u-ref
,因为后者可能只匹配2个
ID
,其中
var\u-ref
匹配3,解析器贪婪地匹配令牌


我假设这只是一个虚拟的语法(你的语法的一部分):你想解决现实世界中的问题吗?

是的,这是我在结构化文本语言中遇到的实际问题的简化版本。它的语法有时很模棱两可。@Overdose,啊,那是完全不同的事情!:)是的,这是我对结构化文本语言真正问题的简化版本。它的语法有时很模棱两可。@Overdose,啊,那是完全不同的事情!:)