假设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>*)
对于列表规则,ANTLR语法如下:
list : '(' datum+ '.' datum ')'
| '(' datum* ')'
| ABBREV_PREFIX datum
;
为prts 1,2预测非LL(*)决策错误。 我试图重构这个陈述,但却无法起床。
例如:
list : '(' datum* (datum'.' datum)? ')'
| ABBREV_PREFIX datum
;
产生相同的错误。对我来说,主要问题是一个规则有一个+而另一个规则使用*,所以左因子并不像通常那么简单。
答案 0 :(得分:1)
您的列表规则:
// A B
// | |
list // | |
: '(' datum* (datum '.' datum)? ')'
| ABBREV_PREFIX datum
;
通过“子”生产规则 A 或 B ,不知道datum
何时匹配。你需要这样做:
list
: '(' (datum+ ('.' datum)?)? ')' // also matches: '(' datum* ')'
| ABBREV_PREFIX datum
;
答案 1 :(得分:0)
怎么样:
list : '(' ')'
| '(' datum+ ('.' datum )? ')'
| ABBREV_PREVIX_DATUM
;