ANTLR:解决非LL(*)问题
在EBNF中假设以下规则:ANTLR:解决非LL(*)问题,antlr,Antlr,在EBNF中假设以下规则: <datum> --> <simple datum> | <compound datum> <simple datum> --> <boolean> | <number> | <character> | <string> | <symbol> <symbol> --> <identifier> <com
<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_前缀数据
;
不知道何时应使用“子”-产生式规则a或B匹配数据。您需要这样做:
列表
:“(”(datum+(“.”datum)?)?”//也匹配:“(“datum*”)”
|ABBREV_前缀数据
;
list : '(' ')'
| '(' datum+ ('.' datum )? ')'
| ABBREV_PREVIX_DATUM
;