ANTLR:解决非LL(*)问题

ANTLR:解决非LL(*)问题,antlr,Antlr,在EBNF中假设以下规则: <datum> --> <simple datum> | <compound datum> <simple datum> --> <boolean> | <number> | <character> | <string> | <symbol> <symbol> --> <identifier> <com

在EBNF中假设以下规则:

<datum> --> <simple datum> | <compound datum>
<simple datum> --> <boolean> | <number>
     | <character> | <string> |  <symbol>
<symbol> --> <identifier>
<compound datum> --> <list> | <vector>
<list> --> (<datum>*) | (<datum>+ .  <datum>)
       | <abbreviation>
<abbreviation> --> <abbrev prefix> <datum>
<abbrev prefix> --> ' | ` | , | ,@
<vector> --> #(<datum>*) 
哪一个prdocues针对高度表1,2的非LL(*)决策错误。 我试图重构此语句,但无法找到有效的方法

例如:

list : '(' datum* (datum'.' datum)? ')'
     | ABBREV_PREFIX datum 
     ;
产生相同的错误。我的主要问题是,一个规则使用+而另一个规则使用*所以左因子分解不像通常那样简单。

怎么样:

 list : '(' ')'
     | '(' datum+ ('.' datum )? ')' 
     | ABBREV_PREVIX_DATUM
     ;
您的列表规则:

//A B
//   |       |
列表/||
:“(“基准*(基准)”“基准”?”
|ABBREV_前缀数据
;
不知道何时应使用“子”-产生式规则aB匹配
数据。您需要这样做:

列表
:“(”(datum+(“.”datum)?)?”//也匹配:“(“datum*”)”
|ABBREV_前缀数据
;
 list : '(' ')'
     | '(' datum+ ('.' datum )? ')' 
     | ABBREV_PREVIX_DATUM
     ;