在创建AST时提升精神表达语法问题

时间:2013-08-23 23:13:13

标签: c++ parsing boost abstract-syntax-tree

我正在尝试将表达式语法(带有变量)解析为抽象语法树(AST),以便稍后我可以使用此AST并根据这些表达式计算值(它们可能是一个表达式的一部分)例如,函数,因此不需要存储这些表达式而不是立即计算值。

令我惊讶的是,在处理了循环和指令(在AST中也需要嵌套结构)之后,在尝试解析任何表达式之后我只得到了seg错误。经过几个小时的努力,我决定在这里问一下,因为我不知道它是什么(可能是语法的东西)

这个语句循环部分非常有效。结构'循环'只作为参数获得了一些重复 - 到目前为止的字符串(稍后我想在这里放一个表达式):

statement %= loop | inst;
inst %= lexeme[+(char_ - (';'|char_('}'))  )] >> ';'; 
loop = "do("    >   lexeme[+(char_ - "){")] // parse a number of loop repetitions
        >   "){"
        >   *statement > "}"
        ;

结构如下:

typedef boost::variant<
    boost::recursive_wrapper<s_loop>
    , std::string> 
s_statement;

struct s_loop
{
    std::string name;                           // tag name 
    //s_expression exp; // TODO
    std::vector<s_statement> children;        // children
};

我使用递归包装器,所以我想也许是因为在表达式 - 术语因素的情况下“深度”包装,为什么我不能这样做。对于循环语句,它就像: loop - (contains) - &gt;声明(声明可能是一个循环!) 在表达式的情况下,它应该最终实现,如: 表达 - &gt;术语 - &gt;因素(因素可能是一种表达!)

所以,为了确保它是因为'深层'包装,我试着用琐碎的语法: 表达 - &gt;因素(因素可能是一种表达)

AST结构是上面的复制粘贴,一切都很相似......它不起作用! :(

我很确定我的语法一定有问题。说实话,我不是精神专家。这是语法:

expression = factor > * ( (char_('+')|char_('-')) > factor ) ;
factor %= uint_ | my_var | my_dat | my_rec_exp;
//   factor %= uint_ | my_var | my_dat; //this WORKS! I've made procedures to traverse an AST
// strings and ints are parsed and stored well inside the expression structure
//  factor %= uint_ | my_rec_exp; // even this simple version (of course I adjust a stucture s_expression) doesn't work.. WHY? :( , it's even less complex than loop-statement
my_rec_exp = '(' > expression > ')'; 
my_var %= char_('!') >> lexeme[+  (  char_ - ( ('+')|char_('-')|char_('*')|char_('/')|char_('(')|char_(')') )   ) ] ;
my_dat %= char_('#') >> lexeme[+  (  char_ - ( ('+')|char_('-')|char_('*')|char_('/')|char_('(')|char_(')') )   ) ] ;

结构在这里: struct s_expression;

typedef boost::variant<
       boost::recursive_wrapper<s_expression>,
//   s_expression,
   std::string,
       unsigned int
>
s_factor;

struct s_term{ // WE DO NOT USE THIS IN THE SIMPLIFIED VERSION
    s_factor factor0;
    std::vector<std::pair<char, s_factor> > 
    factors;
};

struct s_expression{
    s_factor term0;
    std::vector<std::pair<char, s_factor> >
     terms;
};

我将再说一次没有递归表达式它运行良好(解析为包含一组与运算符+ / - 连接的数字/字符串的表达式)。但是,如果我将表达式添加为因子的变体,它会在exec上崩溃。

感谢您提出任何意见/建议!

0 个答案:

没有答案