0

Yacc/Bison の引数リストを表すベクトルにオブジェクトを追加したいと考えています。次の文法規則があります。

argument_list:  expression 
                {
                 //push back object representing expression onto arglist vector
                }

                |
                expression ',' argument_list
                {
                 //same here
                };

型宣言でargument_listをベクトルとして宣言できないため、これについてどうすればよいかわかりません。次のようなルールを使用して、メソッドを表す AST ノードを作成するメソッドにこのベクトルを渡したいと思います。

arg_method_invocation: IDENT PERIOD IDENT LPAR argument_list RPAR 
              { 
              $$=new MethodCallStatement(yylineno,new MethodCallExpression(yylineno,$1,$3, $5 ));
                     if ($$==NULL)
                     fatal("method stmt: ", "error method stmt call");
              }

これは可能ですか?私はコンパイラの設計に慣れていないため、このアプローチは実行できない場合があります。どんな提案でも大歓迎です。

4

1 に答える 1

0

左再帰にするだけです:

argument_list:  expression 
            {
              $$ = new vector();
              $$.add($1); // or whatever the API is
            }

            |
            argument_list ',' expression
            {
             $1.add($3); // ditto
            };

argument_listとして宣言できない理由がわかりませんvector。ここで %type および %union ディレクティブを参照していると思いますか? そうでない場合は、そのようにします。

于 2012-04-10T01:12:53.130 に答える