Программа представляет собой генератор кода, отвечающего за выполнение арифметического выражения. В процессе генерации кода выполняется обход построенного синтаксического дерева, параллельно с которым формируются кусочки кода на условном языке программирования. Эти кусочки связываются между собой, формируя полноценный код программы.
Программа представляет собой конечный автомат с магазинной памятью, содержащий в себе:
1. Таблицу переходов
2. Стек Операций
3. Стек Операндов
4. Стек уровней

Рисунок 1 – Структура программы
Приложение А
Разбор грамматики с помощью LR-анализа
| ACTION | GoTo | ||||||
| a | b | c | $ | S | A | B | |
| I0 | S4 | S5 | S6 | 1 | 2 | 3 | |
| I1 | A | ||||||
| I2 | S7 | ||||||
| I3 | S8 | ||||||
| I4 | S12 | S5 | S6 | 10 | 11 | 3 | |
| I5 | R5 | ||||||
| I6 | R3 | R6 | |||||
| I7 | R1 | ||||||
| I8 | S9 | ||||||
| I9 | R4 | ||||||
| I10 | S13 | ||||||
| I11 | S14 | ||||||
| I12 | S12 | S5 | S6 | 15 | 11 | 3 | |
| I13 | R2 | ||||||
| I14 | R1 | ||||||
| I15 | S16 | ||||||
| I16 | R2 | ||||||

Приложение
Б
Код программы
class Program
{
static void Main(string[] args)
{
LR_analize lr = new LR_analize();
lr.pravila = new char[][] {
new char[] {'S','|','|'},
new char[]{'A','B','|'},
new char[]{'a','S','a'},
new char[]{'c','|','|'},
new char[]{'B','c','c'},
new char[]{'b','|','|'},
new char[]{'c','|','|'}
};
lr.term = new char[] {'a','b','c','$' };
lr.neterm = new char[] { 's', 'S', 'A', 'B' };
lr.netermPrav = new int[,] {
{0,-1,-1},
{1,2,-1},
{3,4,-1},
{5,6,-1}
};
lr.stAction = new string[,] {
{"s","s","s","-"},
{"-","-","-","A"},
{"-","s","-","-"},
{"-","-","s","-"},
{"s","s","s","-"},
{"-","-","r","-"},
{"-","r","r","-"},
{"-","-","-","r"},
{"-","-","s","-"},
{"-","r","-","-"},
{"s","-","-","-"},
{"-","s","-","-"},
{"s","s","s","-"},
{"-","-","-","r"},
{"r","-","-","-"},
{"s","-","-","-"},
{"r","-","-","-"}
};
lr.itAction = new int[,] {
{ 4, 5, 6, -1 },
{ -1, -1,-1,0},
{-1,7,-1,-1},
{-1,-1,8,-1},
{12,5,6,-1},
{-1,-1,5,-1},
{-1,3,5,-1},
{-1,-1,-1,1},
{-1,-1,9,-1},
{-1,4,-1,-1},
{13,-1,-1,-1},
{-1,14,-1,-1},
{12,5,6,-1},
{-1,-1,-1,2},
{1,-1,-1,-1},
{16,-1,-1,-1},
{2,-1,-1,-1}
};
lr.tGoto = new int[,]{
{1,2,3},
{-1,-1,-1},
{-1,-1,-1},
{-1,-1,-1},
{10,11,3},
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.