Программа представляет собой генератор кода, отвечающего за выполнение арифметического выражения. В процессе генерации кода выполняется обход построенного синтаксического дерева, параллельно с которым формируются кусочки кода на условном языке программирования. Эти кусочки связываются между собой, формируя полноценный код программы.
Программа представляет собой конечный автомат с магазинной памятью, содержащий в себе:
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).
Ссылка на скачивание - внизу страницы.