0

是否有一种著名的解析器描述语言(如 Backus-Naur)允许从令牌流中提取重复次数的重复?对于奖励积分,是否有任何支持此语法的 C++ 库?

例子:

让我们称之为“元令牌”#,然后我正在寻找一种描述语言,它将处理以下形式的生产规则:

RULE = # EXPRESSION

作为:

RULE = '1' EXPRESSION
     | '2' EXPRESSION EXPRESSION
     | '3' EXPRESSION EXPRESSION EXPRESSION
     | '4' EXPRESSION EXPRESSION EXPRESSION EXPRESSION
     | ...

请注意,计数是实际的字符文字。这与增强的 Backus-Naur 形式形成对比,我们可以有以下形式的规则:

RULE = 2*3EXPRESSION

相当于:

RULE = EXPRESSION EXPRESSION
     | EXPRESSION EXPRESSION EXPRESSION

对 dgarant 的回应:

我不确定这就是我想要的。我正在考虑以下几点:

int i;

bool r = phrase_parse(first, last,
     (
       int_[ phoenix::ref(i) = _1] >> repeat(i)[/*EXPRESSION*/]
     )
     space );

更重要的是,虽然我希望有一些可以描述这个想法的正式模式。在一个侧面节点上,Spirit 确实需要一些时间来适应,但非常棒。我是一个粉丝。

4

1 回答 1

0

我想不出一种允许rule = # EXPRESSION指定重复在哪里#是字符文字的正式语言。在我看来,只要您发表评论以澄清您的意思,滥用正式语言规范应该不是问题。如果您真的想坚持标准,您可以在 ABNF 中执行以下操作:

rule = '3' 3EXPRESSION
     | '4' 4EXPRESSION
     | '5' 5EXPRESSION

它看起来与您想要的不完全一样,但它可以完成工作。

我相信boost::spirit::qi可以满足您的解析需求。看看重复指令

Spirit 将允许您编写规则,例如

rule = char_("'") >> int_[qi::_a = qi::_1] >> char_("'") >> repeat(qi::_a)[EXPRESSION]

如果您对确定解析的重复次数感兴趣,可以将另一个操作附加到规则:[phoenix::ref(pCt) = qi::_a]

std::vector<double>& v;
int pCt;

bool r = phrase_parse(first, last,
         (
           // to parse a collection of double expressions
           char_("'") >> int_[qi::_a = qi::_1] >> char_("'") >> repeat(qi::_a)[double_[push_back(phoenix::ref(v), _1)]]
           [phoenix::ref(pCt) = qi::_a]
         )
         space);
// assuming the parse was successful
std::cout << "Parsed " << pCt << " elements" << std::endl;

Spirit::Qi 解析器的风格需要一段时间来适应,但它们非常强大,因为您可以将它们直接集成到您的代码中。

于 2012-04-12T23:56:13.277 回答