相关疑难解决方法(0)

来自语义动作的boost :: spirit访问位置迭代器

可以说我有这样的代码(行号作为参考):

1:
2:function FuncName_1 {
3:    var Var_1 = 3;
4:    var  Var_2 = 4;
5:    ...
Run Code Online (Sandbox Code Playgroud)

我想编写一个语法来解析这样的文本,将所有的标识符(函数和变量名)信息放入一个树(utree?).每个节点应保留:line_num,column_num和符号值.例:

root: FuncName_1 (line:2,col:10)
  children[0]: Var_1 (line:3, col:8)
  children[1]: Var_1 (line:4, col:9)
Run Code Online (Sandbox Code Playgroud)

我想将它放入树中,因为我计划遍历该树,并且对于每个节点,我必须知道"上下文":(当前节点的所有父节点).

例如,在使用Var_1处理节点时,我必须知道这是函数FuncName_1的局部变量的名称(当前正在作为节点处理,但是前一级)

我无法弄清楚一些事情

  1. 这可以通过语义动作和语言在Spirit中完成吗?或者我应该使用变体<>树?
  2. 如何同时将这三个信息(column,line,symbol_name)传递给节点?我知道我必须使用pos_iterator作为语法的迭代器类型,但如何在sematic动作中访问这些信息?

我是Boost的新手,所以我一遍又一遍地阅读Spirit文章,我试着谷歌我的问题,但我不知道怎么能把所有的部分放在一起找到解决方案.好像没有人像我之前那样有这样的用例(或者我只是无法找到它)看起来像位置迭代器的唯一解决方案是解析错误处理的那些,但事实并非如此我感兴趣的.只解析我正在采取的代码的代码如下,但我不知道如何继续前进.

  #include <boost/spirit/include/qi.hpp>
  #include <boost/spirit/include/support_line_pos_iterator.hpp>

  namespace qi = boost::spirit::qi;
  typedef boost::spirit::line_pos_iterator<std::string::const_iterator> pos_iterator_t;

  template<typename Iterator=pos_iterator_t, typename Skipper=qi::space_type>
  struct ParseGrammar: public qi::grammar<Iterator, Skipper>
  {
        ParseGrammar():ParseGrammar::base_type(SourceCode)
        {
           using namespace qi;
           KeywordFunction = lit("function");
           KeywordVar    = lit("var");
           SemiColon     = lit(';');

           Identifier = lexeme [alpha >> *(alnum | '_')];
           VarAssignemnt = …
Run Code Online (Sandbox Code Playgroud)

c++ boost abstract-syntax-tree boost-spirit-qi

11
推荐指数
1
解决办法
2386
查看次数

提升精神船长问题

我对提升精神队长有困难.

我需要解析一个这样的文件:

ROW int
int [int, int]
int [int, int]
...
Run Code Online (Sandbox Code Playgroud)

只有在第一个int之后添加'_'时,我能够毫无问题地解析它(感谢stackoverflow;).

事实上,我认为船长在第一个int之后吃了行尾,所以第一个和第二个(在第二行)看起来只有一个int.我不明白如何保持eol但是吃空间.我找到了使用自定义解析器的示例,如此此处.

我尝试了qi :: blank,自定义解析器,单一规则点亮('')无论我使用什么队长,空间和eol总是吃.

我的语法是:

一行:

struct rowType
{
    unsigned int number;
    std::list<unsigned int> list;
};
Run Code Online (Sandbox Code Playgroud)

存储在结构中的完整问题:

struct problemType
{
    unsigned int ROW;
    std::vector<rowType> rows;
};
Run Code Online (Sandbox Code Playgroud)

行解析器:

template<typename Iterator>
struct row_parser : qi::grammar<Iterator, rowType(), qi::space_type>
{
    row_parser() : row_parser::base_type(start)
    {

        list  = '[' >> -(qi::int_ % ',') >> ']';
        start = qi::int_ >> list;
    }

    qi::rule<Iterator, rowType(), qi::space_type> start;
    qi::rule<Iterator, std::list<unsigned int>(), qi::space_type> list; …
Run Code Online (Sandbox Code Playgroud)

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

7
推荐指数
1
解决办法
4094
查看次数

获取给定选项的INI文件的行号的跨平台方式

寻找能够返回INI文件的行号的一些C++库(如boost :: program_options),其中找到了给定的选项或部分.

用例:

  1. 我要求该库在"[SSS]"部分中找到值"vvv".库返回行号,其中找到"[SSS]"部分中的"vvv",或-1.它让我有能力说"第55行:vvv必须<256".

  2. 我迭代INI文件的部分并验证他们的名字.当发现一些狂野的部分时,我说:"第55行:[哈哈哈]部分未知".

更新:我知道"INI比猛犸象大",但目前我必须将大型Windows项目移植到跨平台,并且不能很快摆脱.ini文件.

c++ ini parsing boost

2
推荐指数
1
解决办法
2244
查看次数