LR-анализатор. LR(k)-грамматики. Замечание о пополненной грамматике. LR-разборщик. Принцип переноса-свёртки, страница 2

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

Программа представляет собой конечный автомат с магазинной памятью, содержащий в себе:

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},