11

単純な Lisp/scheme のようなコードを解析しようとしていました

E.g. (func a (b c d) )

それからツリーを構築すると、使用せずに C で解析を行うことができますbison(つまり、 flexトークンを返すためだけに使用し、再帰を使用してツリーを構築します)。しかし、bison文法では、リストを構築するコードをどこに追加すればよいか (すなわち、どのルールを終端記号の蓄積に関連付け、構築されたリストを親ノードにリンクするか) がわかりません。

私の文法は次のようなものです: Lisp grammar in yacc 文法は正しく、コードを認識できます。

4

1 に答える 1

3

各アトムの現在のリストに要素を追加するコードと、ブラケットを処理するときにリストのツリーを管理するコードを配置しようとしましたか? 他の問題に遭遇しない限り、これが最も簡単な方法のようです。

listend: members ')'        { cur = cur->parent; }
       | ')'                { cur = cur->parent; }
       ;

list: '(' listend           { cur = newList(cur);}
    ;

atom: ID                    { appendAtom(cur, "ID"); }
    | NUM                   { appendAtom(cur, "NUM");}
    | STR                   { appendAtom(cur, "STR");}
    ;

これは、各リスト構造体に親ポイントを保持していることを前提としています。

于 2010-07-08T09:37:37.333 に答える