2012-05-11 131 views
1

第一条规则从不起作用。它应该处理类似'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'; 

回答

1

似乎ANTLR首先尝试program_ref之前匹配var_ref,因为后者可以潜在匹配仅2 ID的其中var_ref比赛3和解析器贪婪地匹配令牌。

我认为这只是一个虚拟的(你的一部分)语法:是否有你想要解决的现实世界问题?

+0

是的,它是结构化文本语言的真正问题的简化版本。它的语法有时很模糊。 – Overdose

+0

http://en.wikipedia.org/wiki/Structured_text – Overdose

+0

@Overdose,啊,这是完全不同的东西! :) –