ANTLR:解决非LL(*)问题

时间:2011-06-11 17:53:47

标签: antlr

假设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 
     ;

产生相同的错误。对我来说,主要问题是一个规则有一个+而另一个规则使用*,所以左因子并不像通常那么简单。

2 个答案:

答案 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
     ;