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';
4

1 回答 1

1

var_ref看起来 ANTLR之前首先尝试匹配,program_ref因为后者可能仅匹配 2匹配 3ID的位置var_ref,并且解析器贪婪地匹配令牌。

我认为这只是一个虚拟(您的一部分)语法:您是否正在尝试解决现实世界的问题?

于 2012-05-11T17:59:41.373 回答