увеличить грамматику выражения духа при создании AST

Я пытаюсь разобрать грамматику выражения (с переменными) в абстрактное синтаксическое дерево (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.

Спасибо за любой совет / предложение!

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …