boost.spirit 2 を使用して式の行番号を保存する
-
22-09-2019 - |
質問
Boost.Spirit 2 を使用して、スクリプト変換ユーティリティ (拡張診断情報用) を実行する予定です。
ライン情報などのサポートもありつつ。解析エラーについて、Qi で正常に解析された式の行番号を保存するにはどうすればよいですか?
解決
メーリングリストによると、 スピリット.クラシック 位置反復子 と一緒に使用することもできます スピリット2.
に関する記事もあります iter_pos-parser で 精神-ブログ。
テストする時間ができたら更新します。
他のヒント
質問に気づくのが遅かったのですが、とりあえず付け加えさせてください。別の回答で INI ファイル パーサーのサンプルを書きました。
これは「単純な」セマンティックアクションを使用します。 line_pos_iterator
.
これが私の努力の成果です: https://gist.github.com/1425972
- いつ
POSITIONINFO == 0
- 入力はストリーミングです
- 出力は生の文字列です(まあ、
map<string, map<string, string> >
セクションの場合)
いつ
POSITIONINFO == 1
- 入力はバッファリングされます
出力は
textnode_t
:struct textnode_t { int sline, eline, scol, ecol; string_t text; };
これは、結果として、
map<textnode_t, map<textnode_t, textnode_t> >
は、個々のテキスト ノードをマークする (行、列) の開始点と終了点を正確に報告できます。
こちらは縮小版のデモです。完全な説明と広範なテストケースについては、を参照してください。 オリジナルのアンサー または次のコード ギットハブ
デモ入力
[Cat1]
name1=100 #skipped
name2=200 \#not \\skipped
name3= dhfj dhjgfd
デモ出力 (POSITIONINFO == 0)
Parse success!
[Cat1]
name1 = 100
name2 = 200 \#not \\skipped
name3 = dhfj dhjgfd
デモ出力 (POSITIONINFO == 1)
Parse success!
[[L:1,C2 .. L1,C6:Cat1]]
[L:2,C2 .. L2,C7:name1] = [L:2,C8 .. L2,C12:100 ]
[L:6,C2 .. L6,C7:name2] = [L:6,C8 .. L6,C27:200 \#not \\skipped]
[L:7,C2 .. L7,C7:name3] = [L:7,C11 .. L7,C22:dhfj dhjgfd]
ここでする phrase_parse
関数がスローする例外を使用する方法について説明し、他の有用な製品です。
資料では、このようなエラーメッセージを取得する方法について説明します:
Exception: parse error at file STDIN line 1 column 10
'123,42.0,a,1.4'
^- here
所属していません StackOverflow