【发布时间】:2012-07-05 08:17:10
【问题描述】:
我在使用 Spirit::Qi 2.4 编写解析器时遇到了一些问题。
我有一系列键值对以以下格式解析<key name>=<value>。
键名可以是[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 下使用 boost 1.50 编译,但在较旧的设置上也应该没问题)。
【问题讨论】:
-
如果将 +(char_-char_("{=")) 改为 +~char_("{=") 会怎样?
-
我可以为您提供一些示例代码中令我感到奇怪的事情,但我担心它可能与您的 真实代码 无关(因为这是最小化)。如果您关心,我可以回答您可能有的更多问题,beyond the answer I posted,如果您发布新问题/您的真实代码。
-
好的,请分享您的见解!
标签: c++ parsing boost boost-spirit lookahead