首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Boost.Spirit.X3如何防止令牌被先前的规则解析?

Boost.Spirit.X3如何防止令牌被先前的规则解析?
EN

Stack Overflow用户
提问于 2020-04-06 11:29:51
回答 2查看 142关注 0票数 2

考虑到这种语法:

代码语言:javascript
复制
const auto grammar_def = x3::lit("start")
                        > x3::lit("{")
                        > (*(char_("a-zA-Z0-9\".{}=_~")))
                        > x3::lit("}") > x3::lit(";");

(*(char_("a-zA-Z0-9\".{}=_~")))正在使用最后一个x3::lit("}"),因为它包含"}"

有办法阻止这种情况吗?比如在解析过程中给予x3::lit("}")更高的优先级?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-14 14:34:37

您可以编写一个自定义解析器,它可以像kleene那样工作,但可以回溯,也可以使用必须匹配的第二个解析器。像这样的东西应该管用。

代码语言:javascript
复制
        template <class Left, class Right>
        struct backtracking : binary_parser<Left, Right, backtracking<Left, Right>>
        {
            using base = binary_parser<Left, Right, backtracking<Left, Right>>;
            backtracking(Left const& left, Right const& right)
                :  base(left, right)
            {
            }

            template<typename It, typename Ctx, typename Other>
            bool parse(It& f, It l, Ctx const& ctx, Other const& other, unused_type) const
            {
                auto end_it = l;
                while (end_it != f) {
                    auto save = f;
                    if (this->left.parse(f, end_it, ctx, other, unused)) {
                        if (this->right.parse(f, l, ctx, other, unused))
                            return true;
                    }
                    f = save;
                    --end_it;
                }
                return false;
            }
        };

const auto grammar_def = x3::lit("start")
                        > x3::lit("{")
                        > backtracking(
                             *(char_("a-zA-Z0-9\".{}=_~")), lit("}") >> lit(";"));
票数 1
EN

Stack Overflow用户

发布于 2020-04-09 09:05:19

我发现的唯一方法是,如果'}'之后出现;,就不允许kleene星与之匹配。

代码语言:javascript
复制
const auto grammar_def = x3::lit("start")
                        > x3::lit("{")
                        > *(char_("a-zA-Z0-9\".{}=_~") >> !lit(';'))
                        > x3::lit("}") > x3::lit(";");
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61058763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档