Spirit ::Qi2.4を使用したパーサーの記述に問題があります。次の形式で解析する一連のキーと値のペアがあります<key name>=<value>
。
キー名[a-zA-Z0-9]
の後には、キー名と記号=
の間に空白を入れずに記号を付けることができます。キー名の前にも、常に少なくとも1つのスペースがあります。=
値=
は、 charおよびcodeブロックを含む式を除いて、ほとんどすべてのC式(スペースも可能)にすることができます{ }
。
キーと値のペアのシーケンスの最後に{
記号があります。
この式のパーサーを書くのに苦労しています。キー名の前には常に少なくとも1つのスペースがあり、その後に=
スペースがなく、スペースが含まれていないため、次のように定義しました。
KeyName %= [+char_("a-zA-Z0-9_") >> lit("=")] ;
値はほとんど何でもかまいませんが、文字も含める=
こともできない{
ため、次のように定義しました。
Value %= +(char_ - char_("{=")) ;
値をキャッチするために、このような先読みを使用することを考えました。
ValueExpression
%= (
Value
>> *space
>> &(KeyName | lit("{"))
)
;
しかし、何らかの理由で機能しません(ValueExpression
貪欲に看板に上がり=
、そこから何をすべきか「わからない」ようです)。私はLLパーサーの知識が限られているので、ここで何が調理されているのかよくわかりません。この種のシーケンスに取り組むことができる他の方法はありますか?
シリーズの例は次のとおりです。
EXP1=FunctionCall(A, B, C) TEST="Example String" \
AnotherArg=__FILENAME__ - 'BlahBlah' EXP2= a+ b+* {
追加情報:これははるかに大きな文法の一部であるため、Spirit.Qiパーサー(「=」で分割してカスタム解析などを行うなど)以外の方法でこの問題を実際に解決することはできません。
編集:
ここで最小限の作業例を作成しました:http://ideone.com/kgYD8
(VS2012でブースト1.50でコンパイルされていますが、古いセットアップでも問題ありません)。