0

我必须将此 EBNF 翻译成野牛:

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

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

当我翻译赋值、if、while 语句和 proc_func_ 时,bison 没有错误。然而,当我在野牛中输入这个时,翻译复合语句:

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

有一个减少/减少错误。

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

提前致谢。

4

1 回答 1

0

所以你有一种 Pascal 语言,其中分号是语句分隔符,而不是终止符。

我认为这BQUESTIONMARK是您的分号 (";") 的标记。

我认为您最好使用一个需要第一个语句的产品,然后是另一个提供可选附加语句的左递归产品。

我可能误读了一些东西,但你的语法允许state是 epsilon (null) 和stm,我认为这是你的 reduce/reduce 错误的根源。

我会像这样解决这个问题:

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 ;
于 2012-06-20T14:00:44.010 回答