我的解析器用Spirit :: Qi 2.4寫了一些問題。 我有一系列的鍵值對來解析以下格式<key name>=<value>
。Spirit Qi序列解析問題
鍵名可以[a-zA-Z0-9]
並且總是跟着=
標誌鍵名和=
符號之間沒有空格。 密鑰名稱也總是在前面至少有一個空格。
值幾乎可以是任何C的表達(空格也是可能的),用含炭=
表達和代碼塊{ }
除外。
在鍵值對序列的末尾有一個{
符號。
我爲寫這個表達式的解析器掙扎了很多。由於密鑰名字總是由至少一個空間之前和之後=
,並且不包含空格我把它定義爲
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
(VS 2012下編譯提升1.50,而應該是對舊的設置罰款以及)。
如果你改變+(char_-char_(」 {=「))to +〜char _(」{=「)? –
我可以給你一個在你的示例代碼中讓我感到奇怪的東西,但是我擔心它可能與你的_real code_沒有關係(因爲這是最小化的)。如果你關心,我可以回答你可能有的更多問題,[超出我發佈的答案](http://stackoverflow.com/a/11353205/85371),如果你發佈一個新問題/你的真實代碼。 – sehe
當然,請分享您的見解! – kurczak