0

この EBNF を bison に変換する必要があります。

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

削減/削減エラーがあります。

なぜreduce/reduceエラーがあるのか​​ 、それは私には意味がないので、誰かが私に説明してもらえますか。とても感謝しております。

前もって感謝します。

4

1 に答える 1

0

したがって、セミコロンがターミネータではなくステートメントの区切りであるパスカル風の言語があります。

BQUESTIONMARKそれがセミコロン (";") のトークンだと思います。

最初のステートメントを必要とする 1 つのプロダクションと、オプションの追加ステートメントを提供する別の左再帰プロダクションが最適だと思います。

私は何かを誤解しているかもしれませんが、あなたの文法ではstateと同様にイプシロン (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 に答える