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,因为它更容易获得帮助。
各位!
我想使用 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,因为它更容易获得帮助。