- •1. Постановка задачи
- •Исходные данные:
- •Описание синтаксиса входного языка:
- •Описание семантики входного языка:
- •Объявления и области действия
- •Операции.
- •Лексический анализ
- •Определение синтаксиса лексем
- •49 Таблица констант
- •Тестирование лексического анализатора
- •Описание кс-грамматики входного языка
- •Разбиение на подграмматики
- •Описание языка триад
- •Построение атрибутной транслирующей грамматики
- •Построение атрибутного дмп – процессора
- •Организация взаимодействия дмп-процессоров
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