2011-05-11 5 views
11

インデントなどを使用する非常に複雑な設定ファイル用のパーサーを作成しています.Lexを使用して入力をトークンに分割することを決定しました。問題は、Qiエラー報告ツール(on_error)を、文字ではなくトークンのストリームで動作するパーサで使用する例が見つからないことです。Boost.Spirit:Lex + Qiエラー報告

on_errorで使用されるエラーハンドラは、エラーが入力ストリーム内のどこにあるかを正確に示すことができるものがあります。すべての例では、イテレータのペアからstd::stringを作成して印刷します。しかし、もしLexが使われるならば、イテレータは文字ではなくトークンのシーケンスに対するイテレータです。私のプログラムでは、無効なイテレータタイプに気づく前に、これはstd::stringコンストラクタでハングするようになりました。

私は、トークンがその値として入力ストリームに一対のイテレータを保持できることを理解しています。これはデフォルトの属性タイプです(タイプがlex::lexertl::token<>の場合)。しかし、私のトークンに構文解析に便利なもの(intstd::stringなど)が含まれていれば、それらのイテレータは失われます。

QiでLexを使用しているときに、入力ストリーム内の位置を示す人にやさしいエラーメッセージを生成するにはどうすればよいですか?そのような使用の例はありますか?

ありがとうございました。

+0

@justsomebody編集のおかげで:) – sehe

答えて

10

ご返信ありがとうございますが、達成しようとしているもののまともな例を準備するのに時間がかかりました。私はSpiritに新しいレクサーの例を追加しました:conjure_lexer。これは、小さなプログラミング言語を実装しているconjure(Qi)のサンプルの修正版です。主な違いは、純粋なQi文法の代わりにレクサーを使用していることです。

新しいconjure_lexerの例では、いくつかのことを示しています A)は、既存のtokenタイプを拡張する新しいposition_tokenクラスを使用しています。それは常に(トークンID、トークン値などの通常の情報に加えて)対応する一致した入力シーケンスを指すイテレータのペアを格納します。 b)この位置情報をエラー報告のために使用しています( c)。また、行に沿って、レクサーを使用して文法を単純化する方法を示します。

新しい例はSVN(トランク)にあり、Boost V1.47(すぐにリリース予定)で利用可能になります。このディレクトリにあります:$ BOOST_ROOT/libs/spirit/example/qi/compiler-tutorial/conjure_lexer。

+0

ありがとう、Hartmut! –

+2

ちょうどアップデート:この例はSVNで、conjure2に改名されました。 – hkaiser

関連する問題