Я хотел бы создать простой калькулятор C ++, используя bison и flex. Обратите внимание, что я новичок в создании парсеров. Я уже нашел несколько примеров в bison / flex, но все они были написаны на C.
Моя цель - создать код C ++, где классы будут содержать узлы значений, операций, функций - для создания AST (оценка будет выполняться сразу после создания всего AST - начиная с корня и далее).
Например:
my_var = sqrt(9 ** 2 - 32) + 4 - 20 / 5
my_var * 3
будет проанализирован как:
=
/ \
my_var +
/ \
sqrt -
| / \
- 4 /
/ \ / \
** 32 20 5
/ \
9 2
и второй AST будет выглядеть так:
*
/ \
my_var 3
Тогда следующий псевдокод отражает AST:
ast_root = create_node('=', new_variable("my_var"), exp)
, где exp :
exp = create_node(OPERATOR, val1, val2)
но НЕ так:
$$ = $1 OPERATOR $3
потому что таким образом я напрямую получаю значение операции вместо создания узла.
Я считаю, что узел должен содержать тип (операции), val1 (узел), val2 (узел). В некоторых случаях val2 будет NULL, как указано выше sqrt , который принимает в конце один аргумент. Верно?
Было бы неплохо, если бы вы могли предложить мне скелет C ++ (без оценки) для описанной выше проблемы (включая создание файла AST * .y), чтобы помочь мне понять способ создания / хранения узлов в AST. Код можно перехватить, просто чтобы я понял идею.
Я также буду благодарен, если вы укажете мне на существующий (возможно, простой) пример, если вы его знаете.
Спасибо всем за ваше время и помощь!