0

単純な命令型言語のインタープリターを Haskell で書きたいと思います。そのために、まず BNFC ツール ( http://bnfc.digitalgrammars.com/ ) 用にその言語の文法を書きました。

その文法の一部は、次のような算術式専用です。

EAdd.     Expr ::= Expr "+" Expr ;
EMinus.   Expr ::= Expr "-" Expr ;
EMul.     Expr ::= Expr "*" Expr ;
ENum.     Expr ::= Integer ;

それだけで、BNFC ツールを実行し、提供されたスクリプトでテストできます。算術演算を正常に解析します。

ただし、別のセクションを追加すると (タイプとしましょう):

Tint.    Type ::= "int" ;

そして、expr セクションを配置すると、算術演算は解析されなくなります (1 + 2 でテストすると、「解析に失敗しました... [いくつかのトークン] 1 + 2 の前の行 1 で構文エラーが発生しました」と表示されます)。

なぜそれが起こるのですか?修正方法は?

言い換えると:

なぜそのような文法:

TInt.  Type ::=  "int" ;
EAdd.  Expr ::= Expr "+" Expr ;
ENum.  Expr ::= Integer ;

1 + 1はbnfc を使用して正しく解析しませんか?

4

1 に答える 1

0

宣言がない場合entrypoint、bnfc は文法で定義された最初のカテゴリをテスト スクリプトのエントリ ポイントとして使用します。

つまり、ファイルの先頭にを追加すると、bnfc によって生成されたスクリプトはではなくTint. Type ::= "int" ;を解析しようとします。TypeExpr

于 2016-06-05T14:56:01.097 に答える