10

Boost.Spirit 2を使用して(拡張診断情報用の)スクリプト変換ユーティリティを実行することを計画しています。

エラーの解析のための行情報などのサポートはありますが、Qiで正常に解析された式の行番号を保存するにはどうすればよいですか?

4

3 に答える 3

4

メーリングリストによると、Spirit.Classic 位置イテレータはSpirit2でも使用できます。Spiritブログのiter_pos-parserに関する
記事もあります。

テストする時間ができたら更新します。

于 2010-02-01T09:50:10.873 に答える
2

質問に遅れて気づいたことに気づきましたが、とにかくこれを追加させてください。私は別の答えで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> >が個々のテキストノードをマークする(line、col)開始点と終了点を正確に報告できることを意味します。

これが縮小されたデモです。完全な説明と広範なテストケースについては、元の回答またはgithubのコードを参照してください。

デモ入力

[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]
于 2012-05-19T08:58:12.353 に答える
0

これphrase_parseは、関数がスローする例外の使用方法を説明するもう1つの便利な記事です。

この記事では、次のようなエラーメッセージを取得する方法について説明しています。

Exception: parse error at file STDIN line 1 column 10
'123,42.0,a,1.4'
          ^- here
于 2012-05-19T02:35:37.243 に答える