增强精神与源解析

gsf

我希望能够解析一个Number,以存储其原始源并跟踪其在源中的位置,并将其保留在结构本身中。

这是我到目前为止所拥有的:

#include <boost/config/warning_disable.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <boost/spirit/include/phoenix_object.hpp>
#include <boost/spirit/home/support/iterators/line_pos_iterator.hpp>
#include <boost/fusion/include/adapt_struct.hpp>
#include <boost/fusion/include/io.hpp>

#include <iostream>
#include <iomanip>
#include <ios>
#include <string>
#include <complex>

#include <boost/spirit/include/phoenix_fusion.hpp>
#include <boost/spirit/include/phoenix_stl.hpp>

struct Position
{
    Position()
        : line(-1)
    {
    }

    size_t line;
};

struct Number : public Position
{
    Number()
        : Position()
        , value(-1)
        , source()
    {
    }

    unsigned    value;
    std::string source;
};

using namespace boost::spirit;

BOOST_FUSION_ADAPT_STRUCT(Number,
                            (unsigned,    value)
                            (std::string, source)
                            (size_t,      line)
                          );

template <typename Iterator>
struct source_hex : qi::grammar<Iterator, Number()>
{
    source_hex() : source_hex::base_type(start)
    {
        using qi::eps;
        using qi::hex;
        using qi::lit;
        using qi::raw;
        using qi::_val;
        using qi::_1;
        using ascii::char_;

        namespace phx = boost::phoenix;
        using phx::at_c;
        using phx::begin;
        using phx::end;
        using phx::construct;

        start = raw[   (lit("0x") | lit("0X"))
                     >> hex [at_c<0>(_val) = _1]
                   ][at_c<2>(_val) = get_line(begin(_1))]
                    [at_c<1>(_val) = construct<std::string>(begin(_1), end(_1))]

        ;
    }

    qi::rule<Iterator, Number()> start;
};

测试代码是:

typedef line_pos_iterator<std::string::const_iterator> Iterator;
source_hex<Iterator> g;
Iterator iter(str.begin());
Iterator end(str.end());

Number number;
bool r = parse(iter, end, g, number);
if (r && iter == end) {
    std::cout << number.line << ": 0x" << std::setw(8) << std::setfill('0') << std::hex << number.value << " // " << number.source << "\n";
} else
    std::cout << "Parsing failed\n";

我没有得到的是为什么迭代器在线:

[at_c<2>(_val) = get_line(begin(_1))]

不是line_pos_iterator,即使这是我用于解析器的也不是。我将不胜感激地解释以及以任何方式解决问题的想法。

看到

看一下

#include <boost/spirit/repository/include/qi_iter_pos.hpp>

这定义了一个解析器,可直接将位置公开为属性。让我在几分钟内添加一个示例。

编辑我发现,iter_pos在不“假设”事物和更改数据类型布局的情况下,很难涉足样本。我对此非常赞成(我将努力一路失去所有的语义动作。)。但是,时间有限。

您可以使用以下帮助程序来解决问题:

struct get_line_f
{
    template <typename> struct result { typedef size_t type; };
    template <typename It> size_t operator()(It const& pos_iter) const
    {
        return get_line(pos_iter);
    }
};

^多态演员,按如下方式使用:

    start = raw[ qi::no_case["0x"] >> hex [at_c<0>(_val) = _1] ]
               [ 
                   at_c<1>(_val) = construct<std::string>(begin(_1), end(_1)),
                   at_c<2>(_val) = get_line_(begin(_1)) 
               ]
    ;

    // with

boost::phoenix::function<get_line_f> get_line_;

注意我更改了一些小要点。

带有输出的完全运行的演示:Live On Coliru

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

增强精神和凤凰解析成std :: string

来自分类Dev

增强精神法和气。集成跳过解析器

来自分类Dev

增强精神和凤凰解析成std :: string

来自分类Dev

增强精神记忆泄漏

来自分类Dev

增强精神:如何指示解析器读取整个输入,然后报告结果

来自分类Dev

提升精神递归解析

来自分类Dev

增强精神是否适合这种情况?

来自分类Dev

增强精神istream迭代器提供误报

来自分类Dev

使用局部变量增强精神

来自分类Dev

增强精神assign_to_ *定制点

来自分类Dev

增强精神是否适合这种情况?

来自分类Dev

用精神解析文件输入

来自分类Dev

用可变顺序的列增强精神分析CSV

来自分类Dev

编译用于增强精神的自定义容器时出错

来自分类Dev

增强精神:类似排列,但不完全相同

来自分类Dev

编译自定义容器以增强精神时出错

来自分类Dev

增强C ++ XML解析

来自分类Dev

用boost精神解析html转义序列

来自分类Dev

增强精神2:按照qi :: parser的进度百分比。我的代码有什么不好?

来自分类Dev

增强精神,从语义动作中返回的值会干扰规则属性

来自分类Dev

定义可能是增强精神中文字功能一部分的符号

来自分类Dev

如何在错误消息“与众不同”的可能符号中增强精神?

来自分类Dev

定义可能是增强精神中文字功能一部分的符号

来自分类Dev

增强Spirit Qi轨迹线并解析unicode

来自分类Dev

可变参数增强绑定类型解析

来自分类Dev

增强语义动作,导致解析问题

来自分类Dev

加载 javascript 比解析源

来自分类Dev

使用自定义源增强Iostreams zlib_error

来自分类Dev

如果我的语法中有“或”('|'),如何用boost精神将数据解析为C ++ Struct

Related 相关文章

热门标签

归档