Скачиваний:
33
Добавлен:
02.05.2014
Размер:
1.08 Mб
Скачать

Уфимский Государственный Авиационный

Технический Университет

кафедра АПРиС

Лабораторная работа №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

разложено на лексемы в соответствии с алгоритмом следующим образом.