1

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

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

这个语句循环部分工作得很好。struct 'loop' 作为参数仅获得了多次重复 - 到目前为止的字符串(稍后我想在这里放一个表达式):

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
};

我使用递归包装器,所以我认为可能是因为在表达式术语因子的情况下“深度”包装,为什么我不能这样做。对于循环语句,它就像:循环--(包含)-->语句(语句可能是一个循环!)在表达式的情况下,它应该最终实现为:表达式->术语->因子(因子可能是一种表达!)

所以,为了确保这是因为“深度”包装,我尝试了简单的语法:表达式 - >因子(因子可能是一个表达式)

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 上崩溃。

感谢您的任何意见/建议!

4

0 回答 0