2012-04-17 2 views
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時間以上を試みている。

答えて

1

「パラメータの前に関数名を教えてください」とはどういう意味ですか?現在、endfunが表示され、さまざまなパラメータルールの後にある関数ルールが縮小されるまで、関数名は出力されません。通常の手法は、ルールは、関数のルールで使用可能なもののリストを生成に関して持っていることです。...

terms: terms ',' term { $$ = append_list($1, $3); } 
    | term { $$ = create_singleton_list($1); } 
    ; 

term: VARIABLE { $$ = new VariableTerm($1); } 

代わりに、あなただけのものを印刷したい場合、

function: funcname startfun endfun {cout << "Bison ending a function " << $1 << endl;} 
     ; 

funcname: NAME { cout << "Starting a function " << ($$ = $1) << endl; } 
     | NEGNAME { cout << "Starting a negative function " << ($$ = $1) << endl; } 
     ; 
+0

私は、リストを使用していないので、パラメータの前に関数名を処理できるようにしたいと思っていましたが、置換ツリー私はむしろそれをリストに入れて転送するよりもむしろツリーに直接置きます。代わりの方法は私の問題を解決しました。 – user381261

関連する問題