Flex は一致する文字列を bison に返すことができます
-
23-08-2019 - |
質問
LaTeX を MathML に変換する Bison/Flex プログラムを作成しています。現時点では、関数を扱っています(つまり、\sqrt、\frac など) は、関数ごとにトークンを使用して次のように動作します。
\\frac {return FUNC_FRAC;}
そして、トークン FUNC_FRAC を 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>";}
解決
Flex は抽象トークン値を Bison に返す必要があります。
Flex では次の値で語彙素 (一致した文字列) を見つけることができます。
yytext
そして、次のことができるようになります。
{id} { yylval->strval=strdup(yytext); return(TOK_ID); }
などなど。の yylval
構造体は IIRC を Bison Union/トークンタイプを超えて評価するために使用しているものに関連付けます。だから私はBisonにいるかもしれない
%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.
}
等々。これ以上説明すると、おそらくドキュメントを繰り返すことになります。相談内容:
- ドラゴンブック(いつものように)
- C での最新のコンパイラ実装 (入門に最適)
- バイソンのドキュメント
- フレックスドキュメント
幸運を
所属していません StackOverflow