第一条规则永远不会奏效。它应该处理类似' 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';
答案 0 :(得分:1)
看来ANTLR首先尝试在var_ref
之前匹配program_ref
,因为后者可能只匹配ID
匹配3 var_ref
匹配且解析器匹配令牌的{{1}}
我认为这只是一个虚拟(你的一部分)语法:你想解决一个真实世界的问题吗?