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