【问题标题】:c++,boost::spirit parse the textc++,boost::spirit 解析文本
【发布时间】:2016-03-29 03:04:38
【问题描述】:

大家!

我想使用 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("]");

它不起作用。它只是解析开头的两个“and”并忽略“or”。

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

感谢您的帮助!

【问题讨论】:

  • @jv_ 谢谢!在 boost::spirit 中,按位“或”表示逻辑“或”。可能会创建一些位图来检查语法是否发生。
  • ("and"|"or") 无法编译。我遇到了新的麻烦。 ruleA=!ruleB&&!ruleC,我怎么能用 boost::spirit 来表达
  • 您似乎在使用过时的“经典”精神。考虑更新到 Spirit v2(已有十年历史)。
  • @sehe 如何将成员函数绑定到已解析的字符串?或者将类实例传递给解析语法结构。谢谢!

标签: c++ boost grammar boost-spirit


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 2011-03-05
    • 2015-01-25
    • 1970-01-01
    相关资源
    最近更新 更多