LINUX.ORG.RU

Калькуляторн на boost::spirit


0

0

Здравствуйте, пишу калькулятор на 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

anonymous
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.