Министерство образования и науки Российской Федерации
УТВЕРЖДАЮ руководитель работы _____________________ А.Н. Петрова «_____ »__________________ 2007 г. |
Разработка транслятора с языка PROST на язык С++
Текст программы
02067988.22301071 – 03 12
Бумажный носитель
Исполнитель ______________________ А.Н. Беляев «_____ »___________________ 2007 г. |
УТВЕРЖДЕН
02067988.2301071 – 03 12 - ЛУ
Разработка транслятора с языка PROST на язык С++
Текст программы
02067988.2301071 – 03 12
Бумажный носитель
|
Листов ______
Аннотация
Данный документ содержит текст программы на языке С++ для трансляции на язык С++. Также текст программы содержит краткие комментарии и пояснения.
Содержание
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();
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.