2012-01-30 14 views
1

私はlexを使用することを強く要求しています。lexとyaccの入力ストリームを切り替える

フレックスユーティリティ(yy_switch_buffer、yy_create_buffer ...)に存在するlexのようなAPIを開発して、複数のバッファを切り替えることができます。私は私が含まれたファイルにバッファを切り替える必要があり#includeトークンに遭遇したとき、たとえば

  • これは今まで私のための主要な難しさです。だから最初は現在の解析アクション(私はfclose(yyin)が失敗しました)を中断しなければなりませんパーサーは現在全体のyyinを完了します。メインファイルで使用されている構造体(例えば)を格納するためにインクルードされたファイルを解析する必要があるため、うまくいきません。

質問:パーサーをすぐに中断するにはどうすればよいですか? yyin = fopen(somefile, "r");を使用して新しいバッファを定義すれば十分ですか?

+0

切り替える方法の例を提供フレックスドキュメントの一部である「入力ファイルを含め、」なぜ、あなたは痛みを通過する必要があります他の場所で既に実装されているものを再実装するか? –

+0

@JonathanLeffler私は選択肢がありません。複数のプラットフォーム(solaris、aix、win)のソリューションを開発していますが、ネイティブのlex既存のソリューションに問題が発生する可能性があるため、 – Aymanadou

+0

それはほとんど意味がありません。ネイティブ 'lex'には問題があるかもしれないので、それを使う必要がありますか?一つのマシンで 'flex'を使ってコンパイルし、Flexから生成された転送されたCソースだけでなく、ネイティブマシン上のFlexライブラリ(' -lfl')をコンパイルするだけです。しかし、「フレックス」はそれらのマシンに軽く輸送することができます。 WindowsにはネイティブのLexはありません。 MKS Lex&YaccまたはCygwinをFlexで使用することもできます(文法が必要な場合はBisonも使用できます)。 –

答えて

1

全くやりなければ、それを扱うのは難しいでしょう。 AFAIK、Lexは、yywrap()を呼び出すと、入力ストリームをEOF(リアルまたはシミュレート)で切り替えることができます。

'include'ディレクティブが見つかったら、現在のストリームでEOFを偽造してから、yywrap()に新しいファイルの入力が含まれるように修正してから、届くとインクルードされたファイルのEOFには、元の入力ストリームから入力を元の位置に復元するyywrap()があります。明らかに、これは、包含レベルの数を任意に制限しない限り、ネストされたインクルード(すべて動作する場合)で機能します。

+0

はい、yylineno:を使用してインクルードされたファイルを解析した後、メインファイルの解析リカバリの問題のために何かを準備しました。#include指令の行数。 – Aymanadou

+0

yylex()は私のためにファイルの終わりをシミュレートできますか?私はyylexの戻り値を操作することができれば簡単だろうか? – Aymanadou

+1

あなたは 'input()'関数IIRCを使っています。あなたはLexでそれを行うことができます。あなたはFlexではできません。したがって、あなたの書き換えられた 'input()'関数は、EOFをいつ返すかについて制御コードからコマンドを受け取る必要があります。 'yywrap()'コードも制御コードと同期します。もちろん、 'yylex()'も生成されますが、パターンを認識した後にアクションを実行したり、適切なサポート関数を呼び出すことで(別の)文法が "OK - インクルード;入力ファイルの切り替え"あなたが必要とすることをLexサポートコードに指示するコマンドを入力します。 –

1

POSIXのlexでこれを行うにはポータブルな方法はありませんWindowsシステムに移植フレックスツールを見つけることができます - 異なる実装は、彼らが対処する方法の異なる内部アレンジを持っており、入力バッファ、および字句の間に、現在処理中のトークンより先に読み込んで、入力の束をバッファしている可能性があります。したがって、現在バッファされているものを保存し、別の入力に切り替えてから、#includeなどでバッファリングされたものを復元する必要があります(次のように読み込まれます)。これはまさにflexのバッファ管理呼び出しが対象ですが、lexの使用を主張する場合は、これらのルーチンを移植して、サポートする必要があるlexのバージョンの内部を理解する必要があります。

関連する問題