2009-07-05 12 views
4

私はLaTeXをMathMLに変換するBison/Flexプログラムを作成しています。現時点では、機能(すなわち\ sqrtの、\のFRAC、など)を扱うことは、すべての機能Flexはbisonとの文字列一致を返すことができます

\\frac   {return FUNC_FRAC;} 

のトークンによって、次のように動作し、説明にその役割を果たしているバックバイソンにトークンFUNC_FRACを通過します

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

しかし、これは私がトークンの潜在的に無制限の数を定義し、両立する必要があることを意味します。このサブツリーの私がしたいことは、このようなものであり、書かれたようには動作しません。

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

とバイソンで:Flexで

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

答えて

6

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

あなたが値にFlexでの語彙素(マッチした文字列)を見つけることができます。

yytext 

をだからあなたが行うことができます:

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

などがあります。 yylval構造体には..あなたは、トークン型を過ぎて評価するために使用しているものは何でもバイソン組合/にIIRCに関するので、私はバイソンでオートマトンを中断しますトークン型以外のものを返すバイソン

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

を持っているかもしれません。 Bisonのアクションは、次のようなアクセスが可能です。

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

などです。これ以上の説明と私はおそらくドキュメントを繰り返し始めるでしょう。相談すること:

  1. ドラゴンブック(いつものように)(入門のための偉大な)C
  2. Bison docs
  3. Flex docs

グッドラック

  • 現代コンパイラの実装
  • +0

    oh boy。 yytextのもの。私が大学を覚えている –

    +2

    質問が表示されないようにしたいと思っています...私は古いプロジェクトを終了させます;) –

    +0

    LexとYaccの書籍には、関数のサポートを追加する簡単な電卓の例があり、各関数を呼び出して、上記のTOK_IDスタイルを使用して、yacc/bisonにテーブルを作成します。これは、create_id_node –