0
を機能とパラメータを解析:バイソンは、私はflexとbisonとパーサを書いて、これまでのところフレックスのため、これらのトークンを持っています間違った順序で
[ \t\n] ;
(x[0-9]+) {
yylval.var = strdup(yytext);
return VARIABLE;
}
~(x[0-9]+) {
yylval.var = strdup(yytext);
return NEG_VARIABLE;
}
[a-zA-Z0-9]+ {
yylval.name = strdup(yytext);
return NAME;
}
~[a-zA-Z0-9]+ {
yylval.name = strdup(yytext);
return NEG_NAME;
}
[\{\},\(\)] { return yytext[0];}
. ;
とバイソンのためにこれらの解析ルールは以下のとおりです。
fol:
clauses {cout << "Done with file"<<endl;}
;
clauses:
clauses clause
| clause
;
clause:
startc terms endc
;
startc:
'{' {cout << "Bison found start of clause" << endl;}
;
endc:
'}' {cout << "Bison found end of clause" << endl;}
;
function:
NAME startfun endfun {cout << "Bison found a function " << $1 << endl;}
|NEG_NAME startfun endfun {cout << "Bison found a negative function " << $1 << endl;}
;
startfun:
'(' {cout << "Bison found start of params" << endl;}
;
endfun:
terms ')' {cout << "Bison found a function end" << endl;}
;
terms:
terms ',' term
| term
;
term:
VARIABLE {cout << "Bison found a variable "<< $1 << endl;}
| NEG_VARIABLE {cout << "Bison found a negative variable " << $1 << endl;}
| NAME {cout << "Bison found a constant " << $1 << endl;}
|function
;
これはすべて機能しますが、ファンクションを解析するときは最初にパラメータ とparensを解析し、最後に関数名を与えます。私はこれを回避することができますが、私は不連続な集合として関数を格納しているので、それは私の人生をより困難にして、私は、ルートを作成し、代わりにそれらを結合する関数の名前を得ることができるまで、それを直接作成することです。
Bisonにパラメータの前に関数名を与える方法を私に教えてもらえますか?私は運がない1時間以上を試みている。
私は、リストを使用していないので、パラメータの前に関数名を処理できるようにしたいと思っていましたが、置換ツリー私はむしろそれをリストに入れて転送するよりもむしろツリーに直接置きます。代わりの方法は私の問題を解決しました。 – user381261