2016-03-20 4 views
0

BNFCでコンパイラを作成しようとしています。抽象構文木を生成するためにBNFCを使用するつもりです。しかし、私はそのためのエラーを取得していると私は理由を把握することはできません。そこには多くのドキュメントがないようです。BNFC規則の悪い強制。

は、ここで私は取得していますエラーです:

ここ
Bad coercion in rule _. Prog ::= Block 
Bad coercion in rule _. Declarations ::= Declaration ";" Declarations 
Bad coercion in rule _. Declarations ::= 
Bad coercion in rule _. Declaration ::= Var_declaration 
Bad coercion in rule _. Declaration ::= Fun_declaration 
Bad coercion in rule _. Type ::= "int" 
Bad coercion in rule _. Type ::= "real" 
Bad coercion in rule _. Type ::= "bool" 
Bad coercion in rule _. Array_dimensions ::= "[" Expr "]" Array_dimensions 
Bad coercion in rule _. Array_dimensions ::= 
Bad coercion in rule _. Fun_block ::= Declarations Fun_body 
Bad coercion in rule _. Param_list ::= "(" Parameters ")" 
Bad coercion in rule _. Parameters ::= Basic_declaration More_parameters 
Bad coercion in rule _. Parameters ::= 
Bad coercion in rule _. More_parameters ::= "," Basic_declaration More_parameters 
Bad coercion in rule _. More_parameters ::= 
Bad coercion in rule _. Basic_declaration ::= Ident Basic_array_dimensions ":" Type 
Bad coercion in rule _. Basic_array_dimensions ::= 
Bad coercion in rule _. Program_body ::= "begin" Prog_stmts "end" 
Bad coercion in rule _. Fun_body ::= "begin" Prog_stmts "return" Expr ";" "end" 
Bad coercion in rule _. Prog_stmts ::= Prog_stmt ";" Prog_stmts 
Bad coercion in rule _. Prog_stmts ::= 
Bad coercion in rule _. Identifier ::= Ident Array_dimensions 
Bad coercion in rule _. Expr ::= Bint_term 
Bad coercion in rule _. Bint_term ::= Bint_factor 
Bad coercion in rule _. Bint_factor ::= Int_expr Compare_op Int_expr 
Bad coercion in rule _. Bint_factor ::= Int_expr 
Bad coercion in rule _. Int_expr ::= Int_expr Addop Int_term 
Bad coercion in rule _. Int_expr ::= Int_term 
Bad coercion in rule _. Int_term ::= Int_term Mulop Int_factor 
Bad coercion in rule _. Int_term ::= Int_factor 
Bad coercion in rule _. Int_factor ::= "(" Expr ")" 
Bad coercion in rule _. Modifier_list ::= "(" Arguments ")" 
Bad coercion in rule _. Modifier_list ::= Array_dimensions 
Bad coercion in rule _. Arguments ::= Expr More_arguments 
Bad coercion in rule _. Arguments ::= 
Bad coercion in rule _. More_arguments ::= "," Expr More_arguments 
Bad coercion in rule _. More_arguments ::= 

がBNFCファイルのサンプルです:

_.Prog ::= Block; 

M_Prog. Block ::= Declarations Program_body; 

_.Declarations ::= Declaration ";" Declarations; 
_. Declarations ::= ; 

_. Declaration ::= Var_declaration; 
_. Declaration ::= Fun_declaration; 

M_Var. Var_declaration ::= "var" Ident Array_dimensions ":" Type; 

_. Type ::= "int"; 
_. Type ::= "real"; 
_. Type ::= "bool"; 

_. Array_dimensions ::= "[" Expr "]" Array_dimensions; 
_. Array_dimensions ::=; 

M_Fun. Fun_declaration ::= "fun" Ident Param_list ":" Type "{" Fun_block "}"; 

_. Fun_block ::= Declarations Fun_body; 

_. Param_list ::= "(" Parameters ")"; 

_. Parameters ::= Basic_declaration More_parameters; 
_. Parameters ::= ; 

_. More_parameters ::= "," Basic_declaration More_parameters; 
_. More_parameters ::= ; 

_. Basic_declaration ::= Ident Basic_array_dimensions ":" Type; 

_. Basic_array_dimensions ::= "[" "]" Basic_array_dimensions; 
_. Basic_array_dimensions ::=; 

それは私が間違って_.ラベルを使用していますということのようです。しかし、マニュアルには1行か2行しか書かれていません。私はここで間違って何をしていますか? documentationから

+2

ドキュメントを手助けすることはできません。大きな文章を試してみる前に "bnfc"を渡すための1〜2の規則で文法を学び、その結果をあなたが見つけることのできる文法の例と比較することをお勧めします。 (オピニオン:ひどく文書化されたツールがあれば、別のツールを選ぶだろう。便宜のため、時間を節約するためにパーサジェネレータを選んだのだろうか?)。 –

答えて

1

下線は、当然の値の型は、引数の型と同じである一引数コンストラクタの代替品としてのみ意味があります。

これは、ルールの右側に1つの非終端記号があり、その非終端記号が左側のサイトと同じである場合にのみ_を使用できることを意味します。だから_. A ::= "(" A ")" ; のような何かを行うことができますが、_. A ::= "(" B ")" ;でも_. A ::= "(" A A ")" ;でもありません。

あなたの例では、すべてのルールにラベルを付けることをお勧めします。_はほとんどの場合、ASTを簡略化するために使用されます。

ところで、lists of thingsのシンタックスショートカットもあります。