単純な命令型言語のインタープリターを 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 を使用して正しく解析しませんか?