c++,boost::spirit 解析文本

c++,boost::spirit parse the text

各位!

我想使用 boost::spirit 来解析文本文件中的一些字符串。

这是文本文件中的示例:

IF([banana] and [apple] and [yellow] or [green] or [red] and [!white])

THEN

do sth...;

ELSE

do  sth...;

当我解析 "if" 括号中的字符串时遇到了麻烦。

这是我的代码:

if_rule=str_p(IF)>>ch_p("(")>>if_mem>>*("and"|"or">>if_mem)>>ch_p(")");

if_mem=ch_p("[")>>*~ch_p("]")>>ch_p("]");

它不work.It只是解析开头的两个"and"而忽略"or"。

我尝试了几种不同的语法,但仍然没有用。

感谢您的帮助!

您需要记住,Spirit 表达式最终只是一个(非常丑陋的)c++ 表达式,因此它必须遵循 c++ 规则。独立于 Spirit 赋予运算符的含义,它们仍然遵循 c++ operator precedence rules。因此表达式 "and" | "or" >> if_mem 与 ("and""or") 后跟 if_mem 不同,但实际上是 "and" 或 ("or"其次是 if_mem),因为 >> 的优先级高于 |。如果您使用 ("and"|"or")>>if_mem,您将面临另一个单独的问题:由于其参数的 none 是 Spirit 表达式,运算符 | 不是替代解析器,而是默认的 c++ bitwise_or运算符,正如您发现的那样,会导致编译器错误。在这种情况下,解决方案是通过使用(我只是猜测,因为我不使用 Spirit.Classic)像 (str_p("and")|str_p("or"))>>if_mem 这样的东西,使至少一个参数成为 Spirit 表达式。 (我想 "and">>if_mem | "or">>if_mem 应该也可以,但它可能是一个更糟糕的选择)。

正如 sehe 在他的评论中指出的那样,如果您有选择(除非您基本上需要使用遗留代码),您应该使用 Spirit v2,因为它更容易获得帮助。