我正在尝试将表达式语法(带有变量)解析为抽象语法树(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上崩溃。
感谢您提出任何意见/建议!