Создание простого калькулятора с Bison & Flex на C ++ (не C) - PullRequest
1 голос
/ 08 июня 2010

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

Я также буду благодарен, если вы укажете мне на существующий (возможно, простой) пример, если вы его знаете.

Спасибо всем за ваше время и помощь!

1 Ответ

1 голос
/ 08 июня 2010

http://www.progtools.org/compilers/tutorials/cxx_and_bison/cxx_and_bison.html - это мини-учебник, который должен создать что-то вроде того, что вы хотите.

...