トークンを別のものに置き換えた後、bison や flex に強制的にスキャンを再開させる方法はありますか?
私の特定の例は、特定の単語/文字列の置換です。hello
の単語をに置き換えたい場合echo hello
、flex または bison を置き換えてから再度解析を開始するにはどうすればよいですかhello
(1 つではなく 2 つの単語を取得するため)。したがって、次のようになります。
- トークン WORD (文字列型) を取得します。
- の場合
hello
、トークン値をecho hello
- 入力全体の解析を再開します (現在は
echo hello
) - トークン取得 WORD (
echo
) - トークン取得 WORD (
hello
)
のような非常に魅力的な関数を見てきましyyrestart()
たが、特にその関数が実際に何を達成するのかはよくわかりません。どんな助けでも大歓迎です、ありがとう!
2010 年 4 月 23 日更新
私が最終的に使用したハックアンドスラッシュ ソリューションの 1 つは、word
通過するそれぞれについて、「エイリアス」配列をチェックすることです。にエイリアスがある場合word
は、単語の値を (たとえば を使用して) 置き換え、フラグstrcopy($1,aliasval)
をマークします。aliasfound
入力の行全体が 1 回解析されると、aliasfound
フラグが true の場合yy_scan_string()
、バッファの状態を展開されたエイリアスを持つ入力に切り替え、YYACCEPT
.
そのため、メイン関数に飛び出しyyparse()
、バッファがまだ文字列を指している状態で再度呼び出します。これは、エイリアスが見つからなくなるまで続きます。すべての文法アクションが完了したら、呼び出しyyrestart(stdin)
て「通常」モードに戻ります。
エイリアス値を使用して単語を効果的に展開し、stdin
(または他の方法に) 挿入し、基本的にすべてのエイリアス (ネストされていても) を展開する方法を誰かが知っていれば、それは素晴らしいことです。yypush_buffer_state()
私はとyypop_buffer_state()
、 と一緒にいじっていましyy_switch_to_buffer()
たが、継続的な解析作業で「インライン」置換を得ることができませんでした...