标签: boost-spirit

是否有翻译工具可以将 EBNF 翻译为 boost::spirit?

译者也可能处于 boost::spirit 状态。我在互联网上找不到任何信息。也许我应该做一个?

c++ boost-spirit

5
推荐指数
1
解决办法
1339
查看次数

Boost :: Spirit :: QI解析器:已解析元素的索引

是否有可能(使用Boost :: Spirit :: QI)从逗号分隔的字符串中解析数字,以便获得每个已解析数字的索引?

假设我有一个字符串"23,123,65,1",我想将这些数字中的每一个插入到给定位置(0,1,2,3)的矩阵中.一种方法是将数字解析为std :: vector,然后将它们复制到矩阵行,但速度并不是特别快.

目前我正在使用矢量变体:

Matrix data(10, 4);
int row = 0;
int col = 0;
std::string str = "23,123,65,1";
std::vector<double> res;
if (qi::parse(str.begin(), str.end(), qi::double_ % ',', res))
{
  std::for_each(res.begin(), res.end(), [&col, &data, &row](double elem) {

      data(row, col) = elem;
      col++;
});
}
Run Code Online (Sandbox Code Playgroud)

如果解析器有一个成功的回调,它需要一个lambda函数或类似的功能,那就太棒了.

c++ boost boost-spirit

5
推荐指数
1
解决办法
845
查看次数

我如何理解 boost 精神编译器错误

我正在尝试使用该no_skip指令来解析表单的输入:

state PASS
<tab> state FAIL
Run Code Online (Sandbox Code Playgroud)

ascii::blank用作我的船长。当我换行no_skip[ trans_assign_expr ]以解析选项卡时出现编译错误。

我如何修复这个错误,一般来说,我如何理解这些错误以便我可以修复未来的错误?boost Spirit 文档从未涵盖使用精神的这一方面:(

这是错误

在 /usr/include/boost/spirit/home/qi/nonterminal/grammar.hpp:18:0 包含的文件中,
                 来自 /usr/include/boost/spirit/include/qi_grammar.hpp:16,
                 从 ../src/RJstate.cpp:9:
/usr/include/boost/spirit/home/qi/nonterminal/rule.hpp: 在成员函数 'bool boost::spirit::qi::rule::parse(Iterator&, const Iterator&, Context&, const Skipper&, Attribute&) const [with Context = boost::spirit::context, boost::fusion::vector0 >, Skipper = boost::spirit::qi::detail::unused_skipper > >, Attribute = const boost::spirit::unused_type , Iterator = __gnu_cxx::__normal_iterator >, T1 = boost::proto::exprns_::expr >, 0l>, T2 = boost::spirit::unused_type, T3 = boost::spirit::unused_type, T4 = boost: :spirit::unused_type]':
/usr/include/boost/spirit/home/qi/reference.hpp:43:71: 从 'bool boost::spirit::qi::reference::parse(Iterator&, const Iterator&, Context&, const …

c++ boost compiler-errors boost-spirit

5
推荐指数
1
解决办法
1397
查看次数

如何使用boost :: spirit来解析UTF-8?

#include <algorithm>
#include <iostream>
#include <string>
#include <vector>

#define BOOST_SPIRIT_UNICODE // We'll use unicode (UTF8) all throughout

#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/qi_parse.hpp>
#include <boost/spirit/include/support_standard_wide.hpp>

void parse_simple_string()
{
    namespace qi = boost::spirit::qi;    
    namespace encoding  = boost::spirit::unicode;
    //namespace stw = boost::spirit::standard_wide;

    typedef std::wstring::const_iterator iterator_type;

    std::vector<std::wstring> result;
    std::wstring const input = LR"(12,3","ab,cd","G,G\"GG","kkk","10,\"0","99987","PPP","??)";

    qi::rule<iterator_type, std::wstring()> key = +(qi::unicode::char_ - qi::lit(L"\",\""));
    qi::phrase_parse(input.begin(), input.end(),
                     key % qi::lit(L"\",\""),
                     encoding::space,
                     result);

    //std::copy(result.rbegin(), result.rend(), std::ostream_iterator<std::wstring, wchar_t>  (std::wcout, L"\n"));
    for(auto const &data : result) std::wcout<<data<<std::endl;
}
Run Code Online (Sandbox Code Playgroud)

我研究了这篇文章如何使用Boost Spirit来解析中文(unicode utf-16)? 并按照指南,但无法解析"你好" …

c++ unicode boost utf-8 boost-spirit

5
推荐指数
1
解决办法
3546
查看次数

提升精神可以处理类似语言的Postscript/PDF吗?

我注意到Boost精神提供了一些限制,在这里的一个问题上有一个用户请求有关提升精神的帮助,另一个用户给出了答案指定,提升精神适用于语句而不是"通用文本"(I对不起,如果我没记错的话.

现在我想用令牌来考虑Postscript和PDF,并以这种方式简化我对这种格式的处理方式,问题在于PDF是标记语言和编程语言之间的混合,其中包含跳转和表格,在考虑最流行的文件格式(如XML,C++代码和其他语言和格式)时,我无法想到类似的东西.

还有另外一个事实:我真的找不到那些在使用boost :: spirit wiriting pdf解析器或编写器方面有经验的人,所以我问,boost :: spirit它能够解析PDF文件和输出作为代币的元素?

pdf parsing postscript boost-spirit lexer

5
推荐指数
1
解决办法
603
查看次数

boost-spirit解析器lex-> qi:让"未记录的"on_success机制起作用

编辑:我已经删除了词法分析器,因为它没有与Qi完全集成,只是混淆了语法(见这里).


on_success没有很好的文档记录,我正在尝试将其连接到我的解析器.on_success处理解析器的例子只是构建在qi--ie,no lex.

这就是我试图介绍构造的方式:

using namespace qi::labels;
qi::on_success(event_entry_,std::cout << _val << _1);
Run Code Online (Sandbox Code Playgroud)

但它不会编译.我担心这个问题lex.有人可以告诉我我做错了什么,然后告诉我所有占位符可用,类型和它们代表什么(因为它们没有记录).

完整文件如下:

#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/home/phoenix/bind/bind_member_variable.hpp>
#include <boost/spirit/include/lex_lexertl.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/none.hpp>
#include <boost/cstdint.hpp>
#include <boost/fusion/include/adapt_struct.hpp>
#include <string>
#include <exception>
#include <vector>

namespace lex = boost::spirit::lex;
namespace px = boost::phoenix;
namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::ascii;


template <typename Lexer>
struct tokens : lex::lexer<Lexer>
{
    tokens()
        : left_curly("\"{\""),
        right_curly("\"}\""),
        left_paren("\"(\""),
        right_paren("\")\""),
        colon(":"),
        scolon(";"),
        namespace_("(?i:namespace)"),
        event("(?i:event)"),
        optional("(?i:optional)"), …
Run Code Online (Sandbox Code Playgroud)

c++ parsing boost-spirit lexer

5
推荐指数
1
解决办法
760
查看次数

Boost Spirit 中 &gt; 和 &gt;&gt; 之间的区别

我正在学习 Boost-Spirit,从这里和StackOverflow 的例子。

但是,我无法找到>>> “后跟”序列运算符之间的区别?

例如,这里的区别:-

        qi::phrase_parse(startIt
        , endIt
        , par_ob > ';' // par_ob >> ';' ??
        , qi::space
        , result
        );
Run Code Online (Sandbox Code Playgroud)

c++ boost-spirit

5
推荐指数
1
解决办法
617
查看次数

Spirit-Qi:我怎样才能编写非终结解析器?

我想编写一个解析器(作为qi扩展),可以通过qi解析器表达式my_parser(p1, p2, ...)在哪里使用p1, p2, ....

实际上,我想实现一个best_match像qi替代方案一样工作的解析器,但不选择第一个匹配规则,而是选择"解释"大部分输入的规则.

给出两个规则simple_id = +(qi::alpha),complex_id = simple_id >> *(qi::string("::") > simple_id)它将选择complex_id输入willy::anton.这样做不会产生中间属性.这些好处可以通过运行时获得,因为需要前瞻解析.

在我看来,这种解析器构造有几个用例.benchmark(p1, ...)作为优化的支持解析器,只是一个例子.一旦我知道如何做,我会提供.

该解析器将是非终端的.我试过(努力),但我无法在气中找到我的问题的答案.我的猜测是,C++机制与c qi紧密集成,至少对我来说,没有可理解的切入点.

实现我想引入的操作符非常容易.我附上下面的当前解决方案.它按预期编译但不完整.

一个qi运算符得到一个fusion :: vector/sequence(无论如何)现成的并作用于它.似乎没有图书馆产品来解决我的问题.甚至make_nary_composite已经预计会编译args Elements.

我尝试了很多,一切都失败了,所以我不想厌烦你.

我能想象的一种解决方法可能是提供一个有状态的运算符,,这将成为p1, ...一个合法的qi表达式.然后实现unary_parser best_match或指令来处理该表达式.该,会得到两种模式:让输入电流(成功)解析器消耗的长度和实际分析所选择的一个从相1.包装什么是运行逗号解析器首先在模式1,然后在模式2,这可能是丑陋的,但可以工作.

p1 |= p2 |= ...对于n> 2的运行时,运算符实现是最昂贵的.我很乐意解决这个问题.

最小(但仍然是合理的)开销会有best_match(p1, ...).这有可能吗?

因为我对boost :: fusion没有太多经验,我还在代码中添加了一些问题(如何关于融合).

将一些实际上是一个非终端解析器的东西压入一元解析器方案中感觉不对.但由于我的理解不足,它似乎是完成它的唯一方法.我非常感谢帮助我摆脱困境.

我的环境:Boost 1.61,MSVC 2015 Upd 2,目标是win32console.

进展:

我想,我慢慢地,但肯定地得到它.我很高兴看到一个error_invalid_expression.由于以下proto表达式,编译失败:

boost::proto::exprns_::expr<
    boost::proto::tagns_::tag::function,boost::proto::argsns_::list5< …
Run Code Online (Sandbox Code Playgroud)

c++ parsing boost boost-spirit boost-spirit-qi

5
推荐指数
1
解决办法
534
查看次数

使用 Boost::Spirit 解析先决条件和递归

我正在尝试使用 Boost::Spirit 解析 PDDL 文件,但在将先决条件解析为结构时遇到了一些麻烦。我正在努力理解有关如何将条件放入我的结构和递归的 Boost 手册。

我给出了下面的代码片段,应该可以很好地说明问题。一个看起来像这样的字符串必须被解析:

:precondition
(and
  (at-pos ?r ?pos)
  (not (has-pos ?m ?pos))
)
Run Code Online (Sandbox Code Playgroud)

到目前为止,我的代码看起来像这样,但我几乎可以肯定,在没有 Boost::Phoenix 经验的情况下,我不了解 at_c 是如何工作的。

predi_param = '?' >> name_type;
predi = '(' 
    >> name_type
    >> +predi_param
    >> ')';
literal = ( 
    ( '(' >> lit("not") >>
      predi       [at_c<0>(_val) = false]
      >> ')'
    )
    | predi       [at_c<0>(_val) = true]
  )
  >> ')';
pred_list = ( '(' >> lit("and") >> (*pred_list) >> ')')
  | literal;
preconditions = lit(":precondition") >> pred_list;

qi::rule<Iterator, std::string(), ascii::space_type> …
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-spirit boost-spirit-qi

5
推荐指数
1
解决办法
222
查看次数

boost::spirit 带参数的惰性解析器?

除了不祥的暗示之外,我找不到任何关于这方面的信息,这可能是完全不可能的,但我不想简单地相信它,因为在这种情况下,惰性解析器似乎毫无用处。我想要做的是在解析时根据之前的一些非终端的结果选择一个解析器。它本质上可以归结为:

static rule<Constant *(Scope &)> &get_constant_parser(Typename type);

rule<Constant *(Scope &, Typename)> constant {
    lazy(phoenix::bind(&get_constant_parser, _r2))(_r1)
};
Run Code Online (Sandbox Code Playgroud)

因此get_constant_parser返回适合给定类型名称的解析器,但是该解析器需要类型的参数Scope &。直观上,我会像上面那样写下来,将参数添加到惰性解析器中。然而,这给了我一个无效的表达式:

/usr/include/boost/spirit/home/qi/nonterminal/rule.hpp:177:13: error: static assertion failed: error_invalid_expression
             BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Expr);
             ^~~~~~~~~~~~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

那么如何向惰性解析器提供参数呢?如果确实不可能,那么有人知道为什么吗?

抱歉,这不是一个合适的 MWE,现在我希望有人以前做过并且知道答案。如果您想积极调查并需要 MWE,请告诉我;-)

c++ parsing boost-spirit

5
推荐指数
1
解决办法
333
查看次数