- Работа: Создание внутренней формы представления программы
- Автор: Александр (АВТ-314)
Изучить методы построения внутреннего представления программы (ВПП) на основе контекстно-свободной грамматики, реализовать синтаксический анализ методом рекурсивного спуска и преобразовать арифметические выражения в тетрады и ПОЛИЗ.
- Вариант: 10
- Язык: Python (арифметические выражения)
E -> T A
A -> eps | + T A | - T A
T -> F B
B -> eps | * F B | / F B | // F B | % F B | ** F B
F -> num | id | (E)
id -> letter {letter | digit | _}
num -> digit {digit}
a + b * c(x + 12) // y - z % 32 + 3 * (4 - 1) ** 2100 // (5 + 5) + 7
Основная реализация находится в файле lab6_expression_analyzer.py.
Реализованы:
-
Лексический анализ
- выделение
id,num, операторов+ - * / // % **, скобок; - фиксация лексических ошибок:
- недопустимый символ;
- недопустимый идентификатор, начинающийся с цифры.
- выделение
-
Синтаксический анализ (рекурсивный спуск)
- функции соответствуют правилам грамматики:
E,A,T,B,F; - фиксируются синтаксические ошибки:
- пропущенный операнд;
- лишняя закрывающая скобка;
- пропущенная закрывающая скобка;
- лишние символы после корректного выражения.
- функции соответствуют правилам грамматики:
-
Внутреннее представление в виде тетрад
- при успешном синтаксическом разборе генерируются тетрады вида:
(op, arg1, arg2, result);
- используются временные переменные
t1,t2, ...
- при успешном синтаксическом разборе генерируются тетрады вида:
-
ПОЛИЗ и вычисление
- ПОЛИЗ строится алгоритмом Дейкстры (shunting-yard);
- приоритет операций:
**(правоассоциативно),* / // %,+ -;
- вычисление выполняется только для выражений из целых чисел (без
id).
START
|-- digit --------> NUM (digit*)
|-- letter/_ -----> ID (letter|digit|_)*
|-- '+' '-' '*' '/' '%' '//' '**' -> OP
|-- '(' ----------> LPAREN
|-- ')' ----------> RPAREN
|-- whitespace ---> skip
'-- other --------> LEX_ERROR
parse:
E
expect EOF
E:
T
A
A:
if '+' or '-':
T
emit quad
A
else eps
T:
F
B
B:
if '*', '/', '//', '%', '**':
F
emit quad
B
else eps
F:
num | id | '(' E ')'
Вход:
2 + 3 * (4 - 1)
Ожидается:
- успешный лексический и синтаксический анализ;
- таблица тетрад;
- ПОЛИЗ;
- вычисленное значение.
Вход:
a + @b
Ожидается:
- сообщение о недопустимом символе
@; - предупреждение, что тетрады и ПОЛИЗ не строятся.
Вход:
5 + * 2
Ожидается:
- сообщение о пропущенном операнде;
- тетрады и ПОЛИЗ не строятся.
Вход:
7 + 3)
Ожидается:
- сообщение о лишней закрывающей скобке или лишнем фрагменте;
- тетрады и ПОЛИЗ не строятся.
python main.pyПосле запуска введите выражение в одну строку.











