Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая работа по ТЯП. Вариант 18.doc
Скачиваний:
12
Добавлен:
01.05.2014
Размер:
1.14 Mб
Скачать

49 Таблица констант

тип

значение

1

10

2

3.34

3

‘a’

элемент списка полей содержит в себе данные об имени поля, его типе и значение этого поля

Тестирование лексического анализатора

Пример программы на входном языке:

package dirmain;

class Test

{

int i = 1;

void main(String args)

{

double d = 2.3;

char c = ‘a’;

String s = “Hello!\n”;

while (i < 2 && c = = 97)

if (d > i)

write (s);

else

{

goto labelA;

labelA: i++;

}

}

}

Рассмотрим полученные динамические таблицы:

Таблица идентификаторов (ID):

Токен

id

Идентификатор

Тип

ID

0

dirmain

4

ID

1

Test

4

ID

2

i

0

ID

3

args

3

ID

4

d

1

ID

5

c

2

ID

6

s

3

ID

7

labelA

4

Таблица констант (ТКС):

Токен

id

Константа

Cconst

0

1

Rconst

1

2.3

Chconst

2

‘a’

Stconst

3

“Hello!\n”

Cconst

4

2

Cconst

5

97

Приведём результат работы (разбиение на токены):

PKG ID0 ; //package dirmain;

CLS ID1 //class Test

{ //{

INT ID2 Assign Cconst0 ; // int i = 1;

VD MN ( STR ID3 ) // void main(String args)

{ // {

DB ID4 Assign Rconst1 ; // double d = 2.3;

CH ID5 Assign Chconst2 ; // char c = ‘a’;

STR ID6 Assign Stconst3 ; // String s = “Hello!\n”;

// while (i < 2 && c = = 97)

WHL ( ID2 COMP1 Cconst4 LAND COMP0 Cconst5 )

IF ( ID4 COMP0 ID2 ) // if (d > i)

WR ( ID6 ) ; // write (s);

EL // else

{ // {

GT ID7 ; // goto labelA;

ID7 : ID2 INCDEC0 ; // labelA: i++;

} // }

} // }

} //}

После окончания работы лексического анализатора имеется сформированный выходной поток токенов и заполненные таблицы идентификаторов и констант.

Описание кс-грамматики входного языка

Соответствия между нетерминальными символами грамматики и металингвистическими переменными форм Бэкуса-Наура:

<программа>

Prog

<Конкатенация строк>

ConStr

<класс>

Cls

<доступ к подстроке>

AcToStr

<Главный класс>

MCls

<замена подстроки в строке>

ChStr

<Объявление класса>

DecCls

<поиск подстроки в строке>

FnStr

<Подключение класса>

ConCls

<блок кода>

Blc

<Объявление пакета>

DecPak

<метод>

Met

<путь>

Adr

<вызов метода>

CMet

<Объявление переменной>

DecVar

<метод main>

MMet

<тип>

Type

<new>

N

<идентификатор>

ID

<цикл с предусловием>

Cyc

<простая переменная>

SVar

<Условный оператор if>

Opif

<операция присваивания>

EqOp

<логическое выражение>

LogExp

<значение>

Val

<левая часть логического выражения>

LLogExp

<константа>

Con

<левая часть логического или>

LLogOr

<константа без знака>

FCon

< правая часть логического или >

RLogOr

<операция>

Op

<логическое исключающее или>

LogxOr

<операция скобки>

BrOp

< левая часть логического исключающего или >

LLogxOr

<унарная операция>

UOp

< правая часть логического исключающего или >

RLogxOr

<левая часть унарной операции>

LUOp

<Логическое и>

LogAnd

<Мультипликативная операция>

MOp

<левая часть логического и>

LLogAnd

<левая часть мультипликативной операции>

LMOp

<правая часть логического и>

RLogAnd

<аддитивная операция>

AdOp

<эквивалентность>

Ecv

<левая часть аддитивной операции>

LAdOp

<левая часть эквивалентности>

LEcv

<условное присваивание>

IEqOp

<отношение>

Att

<строковая операция>

StrOp

<левая часть отношение>

LAtt

<длина строки>

StrL

<отрицание>

Not

Prog→ MCls {Cls}

Cls → DecPak {ConCls } DecCls { Met }

Cls → DecPak {Concls} DecCls {DecVar}

MCls → DecPak {ConCls} DecCls {Met } MMet{DecVar}

MCls → DecPak {ConCls} DecCls {Met} MMet{Met}

MCls → DecPak {ConCls} DecCls {DecVar} MMet{DecVar}

MCls → DecPak {ConCls} DecCls {DecVar} MMet{Met}

DecCls → class ID

ConCls → import Adr . ID

DecPak → package Adr

Adr → Adr. Adr

Adr → VCHAR{ VCHAR }

Adr → VCHAR{ NUM}

N → new Type(listValues)

listValues → Type ID listValues

listValues → Type ID

listValues → exp

SVar → ID

FCon → num

FCon → VCHAR

FCon → Str

Val → Con

Val → Op

Val → StrOp

Con → num

Con → DOUBLE

Con → Str

Con →VCHAR

EqOp → SVar = Val

EqOp → N

DecVar → Type SVar

DecVar → Type EqOp

Op → BrOp

Op → UOp

Op → Mop

Op → AdOp

Op → IEqOp

BrOp → (Val)

UOp → LUOp ++

UOp → LUOp --

LUOp → SVar

LUOp→ FCon

LUOp → StrOp

LUOp → UOp

LUOp → BrOp

MOp → LMOp * LUOp

MOp → LMOp / LUOp

LMOp → LUOp

LMOp → MOp

AdOp → LAdOp + LMOp

AdOp → LAdOp – LMOp

LAdOp → LMOp

LAdOp → AdOp

IEqOp → LogExp ? Val : Val

StrOp → StrL

StrOp → ConStr

StrOp → AcToStr

StrOp → ChStr

StrOp → FnStr

StrL → StrVal _length()

ConStr → str _concat(str);

AcToStr → str substring(num,num);

AcToStr → str substring(num);

ChStr → str replace(str, str);

FnStr → str find(str);

Blc → { Blc Bel }

Blc → { Bel }

Bel → UOp

Bel → DecVar

Bel → EqOp

Bel → StrOp

Bel → Cyc

Bel → CMet

CMet → SVar.ID(ListVal)

CMet → ID(ListVal)

ListVal → val ListVal

ListVal → val

ListVal → exp

Met → Type ID(listValues) Blc

listValues → Type ID listValues

listValues → Type ID

listValues → exp

MMet → void main(String ID) Blc

LogExp → LogExp || RLogExp

LogExp → LogExp && RLogExp

LogExp → RLogExp

LogExp → ! LLogExp

LogExp → Ecv

LogExp → Att

RLogExp → LogExp

RLogExp → Val

Att → LAtt >NVal

Att → LAtt < NVal

Att → LAtt >=NVal

Att → LAtt <= NVal

LAtt → Val

LAtt → Att

NVal → MNUM

NVal → DOUBLE

Ecv → LLogExp == LAtt

Ecv → LLogExp!= LAtt

Cyc → while(LogExp) EqOp

Cyc → while(LogExp) Blc

Cyc→while(LogExp)

Opif → if (LogExp) Blc

Opif → if (LogExp) Blc else Blc