2017-03-12 4 views
0

yaccを使用しており、構文木を渡す値の理解に問題があるyaccのコンパイラをCに書いています。Yacc複数の値をツリーに渡す方法

は、私は、関数など

x = f(3+4, 2*5); 

どのように値を渡すために$$=...を使用する内部のパラメータ一部のようなものをモデル化することになっている

arg_list : exp 
| arg_list ',' exp; 

のような文法のラインを持っていると仮定します第二の命令の木?私は$$=$1+$3のようなものを2つの値の合計を渡すように設定し、最初の命令には$$=$1を設定できることを知っています。しかし、関連していなければ、どうすれば複数の値を渡すことができますか?私は3+42*5で何も操作していないので、別々の計算ですが、両方を渡したいと思います。あるいは、yaccの仕組みを誤解していますか?

unionsを使用してオンラインでいくつかのものを見つけましたが、コンパイルに問題がありました。

私はどのような方法で

%union { 
struct pair { 
    char *s_value; 
    int i_value; 
    char op_value; 
} pair; 
int single_int; 
} 

を使用することになっているだろうか?私は実際にunionが何をしているのか分かりません。非常に単純なyacclexファイルを提供し、複数の無関係な値を渡す例をコンパイルして示すことができれば幸いです。私はオンラインで見つけられないようです。

+0

[意味値に関するバイソンマニュアル](https://www.gnu.org/software/bison/manual/bison.html#Semantic-Values)。しかしそれはバイソンの '%union'指令だけを説明しています。 (理解するのは重要ですが、あなたの質問には直接関係しません。)複数の値を保持できる何らかの種類のデータ構造を構築する必要があります。また、要件を明確にする必要があります。コンパイルや評価をしていますか?値の集まり、または解析ノードのコレクションが必要な場合があります... – rici

+0

再利用できるグローバルなリンクリストを意味しますか?私はリンクされたリストの頭にポインタを渡すと私は上記の私は順番にリンクされたリストのすべてのノードのすべての要素を抽出する必要がありますか?そんなことを意味しますか? – domoremath

+0

「何かそんなもの」。しかし、グローバルを失う。 – rici

答えて

0

簡素な説明のためにhttp://www-rohan.sdsu.edu/~stremler/2003_CS530/YaccAndLex.htmlを参照してください。

ビルドする必要があるのは、%unionを持つツリーのようなものです。

%code requires{ 
struct Node { 
    struct Node* others;  
    <<<something that can hold EXP symbol>>>; 
    }; 
} 
%union { 

<<<anything you want more>>>; 
struct Node *node; 
} 

文法:

arg_list : exp { $$=$1 } 
| arg_list ',' exp; { 
         struct Node nd; 
         nd.others=$1; 
         nd.<<exp>>= $3; 
         $$=nd; 
        } 

これは、構造体のノードのツリーを構築します。 https://ruby-hacking-guide.github.io/yacc.html

関連する問題