Лабораторные работы [ФИРТ 4 курс] / Лаба2 / Лаба2
.docУфимский Государственный Авиационный
Технический Университет
кафедра АПРиС
Лабораторная работа №2
Проектирование лексического анализатора
Выполнил: студент гр. Т28-421
Проверила: Пузырникова Е.А.
Уфа 2006
Задание
Входной язык содержит арифметические выражения, разделенные символом ;(точка с запятой). Арифметические выражения состоят из идентификаторов, шестнадцатеричных чисел, знака присваивания (:=), знаков операций +, -, *, / и круглых скобок.
КС-грамматика входного языка
КС-грамматика входного языка задается множеством G:
G({0,..,9,А,..,F,+, ┴, - , *, / , (, ) , := , a,..,z}, {A, B, D, E, M, N, O, V, W, H, S}, P , S)
P:
S→ W⊥ | B⊥ | O⊥ | N⊥ | M⊥ | D⊥
W→ V0 |V1|V2|V3|V4|V5|V6|V7|V8|V9| W0 |W1 |W2 |W3|W4|W5|W6|W7|W8|W9
A→ :
B →A=
O → + | * | / | –
M → ( | )
N → 0|1|2|3|4|5|6|7|8|9|A|B|C|D|E|F|N0|N1|N2|N3|N4|N5|
N6|N7|N8|N9|NA|NB|NC|ND|NE|NF
D → ;
V→a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|Va|Vb|Vc|Vd|Ve|Vf|Vg|Vh|Vi|Vj|Vk|Vl|
Vm|Vn|Vo|Vp|Vq|Vr|Vs|Vt|Vu|Vv|Vw|Vx|Vy|Vz
Граф конечного автомата
Текст программы
#include <iostream.h>
#include <fstream.h>
#include "MyLab2_func.h"
void main()
{char ch, FileName[40], ID[64][40], buffer[64][40];
char Del[1][20]={'d','e','l','i','m','e','t','r','e'};
char Oper[1][20]={'o','p','e','r','a','t','i','o','n',' ','s','i','g','n'};
char Brack[1][20]={'b','r','a','c','k','e','t'};
char Cons[1][20]={'c','o','n','s','t'};
char Appr[1][20]={'a','p','p','r','o','p','r','i','a','t','i','o','n'};
char Identi[1][20]={'i','d','e','n','t','i','f','i','e','r'};
for (int j=0; j<64; j++)
{for (int i=0; i<64; i++) buffer[j][i]=NULL;}
Table TI(64);
enum State { STATE_A, STATE_B, STATE_M, STATE_N, STATE_D, STATE_E, STATE_O, STATE_V,
STATE_W, STATE_H, STATE_S};
cout<<" enter filename: "<<endl;
cin>>FileName;
ifstream ReadFromFile(FileName);
State St; St=STATE_H; int d=0, e=0;
while (ReadFromFile.get(ch))
{
buffer[d][e]=ch; e++;
switch (St)
{
case (STATE_H):
{
switch(ch){
case 'a':St=STATE_V; break; case 'b':St=STATE_V; break;
case 'c':St=STATE_V; break; case 'd':St=STATE_V; break;
case 'e':St=STATE_V; break; case 'f':St=STATE_V; break;
case 'g':St=STATE_V; break; case 'h':St=STATE_V; break;
case 'i':St=STATE_V; break; case 'j':St=STATE_V; break;
case 'k':St=STATE_V; break; case 'l':St=STATE_V; break;
case 'm':St=STATE_V; break; case 'n':St=STATE_V; break;
case 'o':St=STATE_V; break; case 'p':St=STATE_V; break;
case 'q':St=STATE_V; break; case 'r':St=STATE_V; break;
case 's':St=STATE_V; break; case 't':St=STATE_V; break;
case 'u':St=STATE_V; break; case 'v':St=STATE_V; break;
case 'w':St=STATE_V; break; case 'x':St=STATE_V; break;
case 'y':St=STATE_V; break; case 'z':St=STATE_V; break;
case (':'): St=STATE_A; break;
case '/' : St=STATE_O; break; case '*' : St=STATE_O; break;
case '-' : St=STATE_O; break; case '+' : St=STATE_O; break;
case '=' : St=STATE_O; break;
case '0' : St=STATE_N; break; case '1' : St=STATE_N; break;
case '2' : St=STATE_N; break; case '3' : St=STATE_N; break;
case '4' : St=STATE_N; break; case '5' : St=STATE_N; break;
case '6' : St=STATE_N; break; case '7' : St=STATE_N; break;
case '8' : St=STATE_N; break; case '9' : St=STATE_N; break;
case 'A': St=STATE_N; break; case 'B': St=STATE_N; break;
case 'C': St=STATE_N; break; case 'D': St=STATE_N; break;
case 'E': St=STATE_N; break; case 'F': St=STATE_N; break;
case '(' : St=STATE_M; break; case ')': St=STATE_M; break;
case ';' : St=STATE_D; break;
default: St=STATE_E;}; break;
};break;
case (STATE_D): if(ch==' ') {TI.createRec(d, buffer[d], Del[0] );d++; e=0; St=STATE_H; break; }
else {St=STATE_E; break;}; break;
case (STATE_V):
{
switch(ch){
case 'a':St=STATE_V; break; case 'b':St=STATE_V; break;
case 'c':St=STATE_V; break; case 'd':St=STATE_V; break;
case 'e':St=STATE_V; break; case 'f':St=STATE_V; break;
case 'g':St=STATE_V; break; case 'h':St=STATE_V; break;
case 'i':St=STATE_V; break; case 'j':St=STATE_V; break;
case 'k':St=STATE_V; break; case 'l':St=STATE_V; break;
case 'm':St=STATE_V; break; case 'n':St=STATE_V; break;
case 'o':St=STATE_V; break; case 'p':St=STATE_V; break;
case 'q':St=STATE_V; break; case 'r':St=STATE_V; break;
case 's':St=STATE_V; break; case 't':St=STATE_V; break;
case 'u':St=STATE_V; break; case 'v':St=STATE_V; break;
case 'w':St=STATE_V; break; case 'x':St=STATE_V; break;
case 'y':St=STATE_V; break; case 'z':St=STATE_V; break;
case '0' : St=STATE_W; break; case '1' : St=STATE_W; break;
case '2' : St=STATE_W; break; case '3' : St=STATE_W; break;
case '4' : St=STATE_W; break; case '5' : St=STATE_W; break;
case '6' : St=STATE_W; break; case '7' : St=STATE_W; break;
case '8' : St=STATE_W; break; case '9' : St=STATE_W; break;
case ' ' : TI.createRec(d, buffer[d], Identi[0]); d++;e=0;St=STATE_H; break;
default: St=STATE_E;break;}
} ;break;
case (STATE_A): if(ch=='=') { St=STATE_B; break;} else {St=STATE_E;break;}
case (STATE_B): if(ch==' ') {TI.createRec(d, buffer[d], Appr[0]);e=0;d++; St=STATE_H;break;}
else {St=STATE_E; break;}
case (STATE_W):
{
switch(ch){
case '0' : St=STATE_W; break; case '1' : St=STATE_W; break;
case '2' : St=STATE_W; break; case '3' : St=STATE_W; break;
case '4' : St=STATE_W; break; case '5' : St=STATE_W; break;
case '6' : St=STATE_W; break; case '7' : St=STATE_W; break;
case '8' : St=STATE_W; break; case '9' : St=STATE_W; break;
case ' ': TI.createRec(d, buffer[d], Identi[0] ); d++; e=0;St=STATE_H; break;
default: St=STATE_E;break;}
}; break;
case (STATE_N):
{
switch(ch){
case '0' : St=STATE_N; break; case '1' : St=STATE_N; break;
case '2' : St=STATE_N; break; case '3' : St=STATE_N; break;
case '4' : St=STATE_N; break; case '5' : St=STATE_N; break;
case '6' : St=STATE_N; break; case '7' : St=STATE_N; break;
case '8' : St=STATE_N; break; case '9' : St=STATE_N; break;
case 'A' : St=STATE_N; break; case 'D' : St=STATE_N; break;
case 'B' : St=STATE_N; break; case 'E' : St=STATE_N; break;
case 'C' : St=STATE_N; break; case 'F' : St=STATE_N; break;
case ' ': TI.createRec(d, buffer[d], Cons[0] );d++; e=0;St=STATE_H; break;
default: St=STATE_E;}
}; break;
case (STATE_O): if(ch==' ') {TI.createRec(d, buffer[d], Oper[0] );d++;e=0;St=STATE_H; break;}
else {St=STATE_E; break;}
case (STATE_M): if(ch==' ') {TI.createRec(d, buffer[d], Brack[0] );d++;e=0;St=STATE_H; break;}
else {St=STATE_E;break;}
case (STATE_S): break;
default: St=STATE_E; break;
}
}
ReadFromFile.close();
for (e=0; e<d; e++) {TI.PrintRec(e); cout<<"\n";}
}
Выводы
В данной лабораторной работе реализуется построение лексического анализатора. Результатом работы программы является построение таблицы лексем, в которой расположены лексемы с указанием их типа: константа, идентификатор, знак присваивания, скобки, знаки операций сложения, умножения, деления или вычитания.
Исходное арифметическое выражение из текстового файла myfile.txt
разложено на лексемы в соответствии с алгоритмом следующим образом.