EBNF到Bison - 减少/减少错误

时间:2012-06-20 02:00:06

标签: bison ebnf reduce-reduce-conflict

我必须将这个EBNF翻译成野牛:

<compound-statement> ::= begin [ <statement> ( ; <statement> )*] end

<statement> ::= 
| <assignment>
| <if-statement>
| <while-statement>
| <proc-func-call>
| <compound-statement>

当我翻译assignement时,if,while语句和proc_func_在野牛中没有错误。但是,当我在野牛中键入它时,翻译复合语句:

compound_statement : BEGINKEY state ENDKEY ;
state : | statement stm ;
stm : | BQUESTIONMARK statement stm ;

存在减少/减少错误。

有人可以向我解释,为什么会出现减少/减少错误,因为它对我没有意义。我真的很感激。

提前致谢。

1 个答案:

答案 0 :(得分:0)

所以你有一个Pascal-ish语言,分号是一个语句分隔符,而不是终结符。

我认为BQUESTIONMARK是分号的标记(“;”)。

我认为你最好用一个需要第一个语句的制作,然后另一个左递归制作提供 可选的附加声明。

我可能会误读某些内容,但你的语法允许state为epsilon(null)以及stm,我认为这是源代码 减少/减少错误。

我会解决这个问题:

compound_statement : BEGINKEY first_statement statements ENDKEY
                   | BEGINKEY first_statement ENDKEY
                   ;

first_statement : statement ;

statement : assignment
          | if_statement
          | while_statement
          | proc_func_call
          | compound_statement
          ;

statements : statements statement_with_semi
           | statement_with_semi
           ;

statement_with_semi : BQUESTIONMARK statement ;