Здравствуйте, пишу калькулятор на spirit. В нем есть */ +- Присваивания =
Переменные var_name
Функции fn()
Вот грамматика
expression = assign | (term >> *( ( '+' >> term )[&do_add] | ( '-' >> term )[&do_subt]));
assign = (identificator >> '=' >> expression)[&do_assign];
factor = (lexeme_d[(+digit_p)][&do_int]) | '(' >> expression >> ')'
| ('-' >> factor)[&do_neg] | '+' >> factor | function | identificator ;
identificator = lexeme_d[(+alpha_p)][&do_push_var];
function = identificator >> '(' >> expr_list >> ')';
void do_push_var(const char *b, const char *e) { std::string str(b, e); cout << "PUSH_VAR: " << str << endl; }
Я хочу чтобы каждый раз (и ТОЛЬКО ОДИН РАЗ) при встрече
идентификатора мы его добавляли в стек идентификаторов. А потом извлекали. Протестируем несколько строк
f
PUSH_VAR: f
PUSH_VAR: f
PUSH_VAR: f
-------------------------
Parsing succeeded
-------------------------
fn()
PUSH_VAR: fn
PUSH_VAR: fn
-------------------------
Parsing succeeded
-------------------------
f=tr()
PUSH_VAR: f
PUSH_VAR: tr
PUSH_VAR: tr
ASSIGN
-------------------------
Parsing succeeded
-------------------------
f+fn()
PUSH_VAR: f
PUSH_VAR: f
PUSH_VAR: f
PUSH_VAR: fn
ADD
-------------------------
Parsing succeeded
-------------------------
Отсюда мы видим что, например, если просто написать имя переменной (напимер f) то она окажется в стеке три раза. Почему? Скорее всего дело происходит так (но я могу ошибаться)
Первый раз спирит думает что это assignment и добавляет переменную в стек. Второй раз он думает что это функция и еще раз пихает ее в стек. Третий раз в стек уходит название переменной.
Но мне надо добавить только один раз. Как можно сделать так чтобы в стек значение вночилось всего один раз? Или у меня кривая грамматика?
Спасибо за ответы.
Перемещено JB из General