Я пытаюсь разобрать грамматику выражения (с переменными) в абстрактное синтаксическое дерево (AST), чтобы позже я мог использовать этот AST и вычислять значения на основе этих выражений (например, они могут быть частью функции , поэтому нет необходимости хранить эти выражения, а не вычислять значение сразу).
К моему удивлению, после обработки с помощью циклов и инструкций (которые также требуют вложенных структур в AST), я получил только ошибки seg после попытки разобрать любое выражение. После нескольких часов борьбы с этим я решил спросить здесь, потому что у меня есть понятия не имею, что это (может быть, что-то с грамматикой)
Эта часть цикла операторов работает отлично. Структура ‘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;
};
Еще раз скажу, что без рекурсивного выражения это работает хорошо (разбирает на en выражение, содержащее набор чисел / строк, связанных с операторами + / -). Но если я добавлю выражение в качестве варианта фактора, он вылетает на exec.
Спасибо за любой совет / предложение!
Задача ещё не решена.
Других решений пока нет …