Разработка транслятора с языка PROST на язык С++

Страницы работы

18 страниц (Word-файл)

Содержание работы

Министерство образования и науки Российской Федерации

УТВЕРЖДАЮ

руководитель работы

_____________________ А.Н. Петрова

«_____ »__________________ 2007 г.

Разработка транслятора с языка PROST на язык С++

Текст программы

02067988.22301071 – 03 12

Бумажный носитель

Исполнитель

______________________ А.Н. Беляев

«_____ »___________________ 2007 г.


УТВЕРЖДЕН

02067988.2301071 – 03 12 - ЛУ

Разработка транслятора с языка PROST на язык С++

Текст программы

02067988.2301071 – 03 12

Бумажный носитель

17

 
 


Листов ______


Аннотация

Данный документ содержит текст программы на языке С++ для трансляции на язык С++. Также текст программы содержит краткие комментарии и пояснения.


Содержание

3.1. Тексты программ............................................................................................... 29

3.1.1. Lex.cpp.............................................................................................................. 29

3.1.2. Syntax.cpp......................................................................................................... 33

3.1.3. VStack.h............................................................................................................ 41


Файл Lex.cpp (основная программа):

#include <conio.h>

#include <stdio.h>

#include <ctype.h>

#include <string.h>

#include <process.h>

char

T_ks[20][9]={"vars","end","as","integer","code","label","input","if","then",

"outputs","else","goto","while","do","outputn","float","dim","break","continue"},

T_r[14][3]={"(",")",";","+","-","*","/","<",">",

">=","<=","<>",":=","="},

T_id[50][9],

T_const[50][9],

T_strc[20][15];

int K_id    = 0,

K_const = 0,

K_strc  = 0,

K_lex   = 0;

int KA_const[3][3] = {1,2,4,

1,2,3,

2,4,3};

int KA_r[5][6] = {2,3,4,2,1,6,

6,6,6,2,6,6,

5,5,5,5,5,5,

6,6,2,2,6,5,

6,6,6,2,6,5};

int lex[200][2];

FILE *in,*out;

char c;

#include "Syntax.cpp"

void pr_const (void)

{

char ch[9];

int j,i = 0,K_cifr = 0;

while(1)

{

if (c == '.') j=1;

else

if (isdigit (c) != 0) j=0;

else j=2;

i = KA_const[i][j];

if (i == 4) {printf ("\nOshibka v konstantah"); getch();exit(1);}

if (i == 3) break;

ch[K_cifr] = c; K_cifr++;

c = getc(in);

}

ch[K_cifr] = '\0';

for(i=0;i<K_const;i++)

if (strcmp (T_const[i],ch) == 0)

{

lex[K_lex][0]=40;

lex[K_lex][1]=i;

K_lex++;

return;

}

strcpy (T_const[K_const],ch);

lex[K_lex][0]=40;

lex[K_lex][1]=K_const;

K_lex++;

K_const++;

}

void pr_KS(void)

{

char slovo[9];

int K_simv=0,i;

while (isalpha(c) != 0)

{

slovo[K_simv] = c;

K_simv++;

c = fgetc (in);

}

slovo[K_simv] = '\0';

for (i=0;i<20;i++)

{

if (strcmp(T_ks[i],slovo) == 0)

{

lex[K_lex][0] = 10;

lex[K_lex][1] = i;

K_lex++;

return;

}

}

for ( i=0;i<K_id;i++)

{

if (strcmp (T_id[i],slovo) == 0)

{

lex[K_lex][0] = 30;

lex[K_lex][1] = i;

K_lex++;

return;

}

}

strcpy (T_id[K_id],slovo);

lex[K_lex][0] = 30;

lex[K_lex][1] = K_id;

K_lex++;

K_id++;

}

void pr_razd(void)

{

int j,i=0;

char razd[3];

int K_simv=0;

while (1)

{

if (c == '(' ||

c == ')' ||

c == ';' ||

c == '+' ||

c == '-' ||

c == '*' ||

c == '/') j = 0;

else

if (c == '<') j = 1;

else

if (c == '>') j = 2;

else

if (c == '=') j = 3;

else

if (c == ':') j = 4;

else

j = 5;

i = KA_r[i][j];

if (i == 6)

{printf ("Oshibka v razdelitelyah\n(%d,%d) %d",lex[K_lex][0],lex[K_lex][1],K_lex);getch ();exit(1);}

if (i == 5) break;

razd[K_simv] = c;

K_simv++;

c = fgetc(in);

}

razd[K_simv] = '\0';

for (i = 0;i<14;i++)

if (strcmp (T_r[i],razd) == 0)

{

lex[K_lex][0]=20;

lex[K_lex][1]=i;

K_lex++;

return;

}

}

void strc (void)

{

int K_sim = 0;

char stroka[20];

c = fgetc (in);

while (c!='\'')

{

stroka[K_sim] = c;

c = fgetc (in);

K_sim++;

if (K_sim==20)

{

printf ("Oshibka: Stroka dolgna byt ne bolee 20 simvolov");getch ();exit (1);

}

}

stroka[K_sim] = '\0';

for (int i = 0;i < K_strc;i++)

if (strcmp(T_strc[i],stroka) == 0)

{

lex[K_lex][0]=50;

lex[K_lex][1]=i;

K_lex++;

K_strc++;

c = fgetc (in);

return;

}

strcpy(T_strc[K_strc],stroka);

lex[K_lex][0]=50;

lex[K_lex][1]=K_strc;

K_lex++;

K_strc++;

c = fgetc (in);

}

void main(void)

{

clrscr ();

in = fopen ("in_prost.txt","r");

out = fopen ("out_cpp.cpp","w");

c = fgetc (in);

while (feof (in) == 0)

{

if (isalpha ((int)c) != 0) pr_KS();

else

if (isdigit ((int)c) != 0) pr_const();

Похожие материалы

Информация о работе

Предмет:
ТЯПиМТ
Тип:
Методические указания и пособия
Размер файла:
74 Kb
Скачали:
0