6

LaTeX を MathML に変換する Bison/Flex プログラムを作成しています。現時点では、関数 (つまり、\sqrt、\frac など) の処理は、すべての関数のトークンを使用して、次のように機能します。

\\frac         {return FUNC_FRAC;}

そして、トークン FUNC_FRAC を bison に渡します。bison は、このサブツリーの説明でその役割を果たします。

function: FUNC_FRAC LBRACE atom RBRACE LBRACE atom RBRACE {$$ = "<mfrac>" + $3 + $6 + "</mfrac>";}

しかし、これは、潜在的に無制限の数のトークンを定義してジャグリングする必要があることを意味します。私がやりたいのは、このようなもので、書かれているようには機能しません。フレックス:

\\[A-Za-z]+[0-9]*  {return the-matched-string;}

そしてバイソンで:

function: "\frac" LBRACE atom RBRACE LBRACE atom RBRACE {$$ = "<mfrac>" + $3 + $6 + "</mfrac>";}
4

1 に答える 1

7

Flex は抽象トークン値を Bison に返す必要があります。

Flex の値の語彙素 (一致した文字列) を見つけることができます。

yytext

したがって、次のことができます。

{id}    { yylval->strval=strdup(yytext); return(TOK_ID); }

などなど。構造体はyylval、IIRCをバイソンユニオン/トークンタイプを超えて評価するために使用しているものに関連付けます..だから私はバイソンにあるかもしれません

%union {
    char *strval;
    int intval;
    node node_val;
}

トークン型以外のものを返すと、Bison のオートマトンが壊れます。あなたの Bison アクションは、次のようなものにアクセスできます。

id_production: TOK_ID
    { 
        $<node_val>$ = create_id_node(yylval.strval);
        xfree(yylval.strval); // func makes a copy, so we are cool.
    }

等々。これ以上の説明があれば、おそらくドキュメントを繰り返し始めるでしょう。相談事項:

  1. ドラゴンブック(いつものように)
  2. C での最新のコンパイラの実装 (入門に最適)
  3. バイソンのドキュメント
  4. フレックス ドキュメント

幸運を

于 2009-07-05T21:02:23.107 に答える