Транслятор на языке Си для перевода текста программы с языка Паскаль на язык Си (integer, repeat тАж until, procedure, type, record (для type))

Дипломная работа - Компьютеры, программирование

Другие дипломы по предмету Компьютеры, программирование

:

main - главная программа, запускающая остальные подпрограммы

var - подпрограмма обработки переменных, запускает подпрограмму обработки типов, в которой обрабатываются целочисленные и логические типы.- подпрограмма обработки блока type, работает с подпрограммой record, которая запускается из type

fprocedure - подпрограмма обработки процедуры, использует в качестве подпрограммы var и по мере надобности остальные подпрограммы операторов, которые встречаются в теле процедуры. Т.е. из под себя запускает функцию main.- подпрограмма обрабатывающая структуру repeatтАжuntil LE, тем самым запускает подпрограммы обработки логического выражения, а так же подпрограмму обработки операторов.

assign - подпрограмма обработки операции присваивания, заменяет знаки, и может запускать подпрограммы обработки арифметических выражений.- подпрограмма обработки комментария. Запускает подпрограмму fcommend - обработка конца комментария (для упрощения схемы здесь данная подпрограмма упущена из виду.)- интеллектуальная подпрограмма использующаяся повсеместно. Обрабатывает текст, останавливает курсор на начале слова, возвращает длину слова (при этом не захватывает символы-разделители, лишь алфавит).

err_or - подпрограмма обработки ошибок.

Таблицы с идентификаторами:

Таблица 4.1 - Таблица с ключевыми словами

Ключевое словоНомерbеgin1еnd2Var3boolean4falsе5true6repeat7until8procedure9typе10rеcord11and12оr13

Таблица 4.2 - Таблица с типами переменных

ТипИдентификационный номерЦелочисленный1Логический3Таблица 4.3 - Таблица с типамиwслов

Тип словаИдентификационный номерОшибочный оператоp0Знак пpопуска1Стрoка2Числo3Симвoл4

5Листинг программы

#include

#include

#include

#include

*spasfl, *ccfl;

int memoLen = 10000;int kolvoKw = 13; * kwSList[kolvoKw] =

{

"begin", "end", "var", "boolean",

"false", "true", "repeat", "until",

"procedure", "type", "record", "and",

"or"

};

#define kwqe_begin 1

#define kwqe_end 2

#define kwqe_var 3

#define kwqe_boolean 4

#define kwqe_false 5

#define kwqe_true 6

#define kwqe_repeat 7

#define kwqe_until 8

#define kwqe_procedure 9

#define kwqe_type 10

#define kwqe_record 11

#define kwqe_and 12

#define kwqe_or 13

#define tpe_int 1

#define tpe_bool 2

#define wtpe_error 0

#define wtpe_space 1

#define wtpe_str 2

#define wtpe_numb 3

#define wtpe_char 4

InArray[memoLen],

OutArray[memoLen];

InLength,OutLenght,inpointer;firstFl1,secFl2,errFl3;

lenW; typeW; numfW;

ots;

struct var{

char s[64];

int tp;

var * next;

};

struct types{

char s[64];

int tid;

types * next;

};

*v_lst, *lv_lst;

fle();fae();asign();

add_vr(int globalVar1){

var *np, *p;

if (globalVar1) p = v_lst; else p = lv_lst;

while (p) {

if (strlen(p->s)==lenW&&

!memcmp(p->s,&InArray[inpointer],lenW)) return 0;

p = p->next;

}

np = new var;

memcpy(np->s,&InArray[inpointer],lenW);

np->s[lenW]=0;

np->tp = -1;

if (globalVar1) {

np->next = v_lst;

v_lst = np;

} else {

np->next = lv_lst;

lv_lst = np;

}

return 1;

}

type_setter(int globalVar1, int type){

var *p;

if (globalVar1) p = v_lst; else p = lv_lst;

while (p) {

if (p->tp==-1) p->tp = type;

p = p->next;

}

}

type_reciever(){

var * p;

p = lv_lst;

while (p) {

if (strlen(p->s)==lenW&&

!memcmp(p->s,&InArray[inpointer],lenW)) return p->tp;

p = p->next;

}

p = v_lst;

while (p) {

if (strlen(p->s)==lenW&&

!memcmp(p->s,&InArray[inpointer],lenW)) return p->tp;

p = p->next;

}

return 0;

}

list_clearer(int globalVar1){

var *p, *pp;

p = lv_lst;

while (p) {

pp = p;

p = p->next;

delete pp;

}

lv_lst = NULL;

if (globalVar1) {

p = v_lst;

while (p) {

pp = p;

p = p->next;

delete pp;

}

v_lst = NULL;

}

}

getToken()

{

int st = 0;

char c;

lenW = 0;

while (lenW+inpointer<InLength ){

c = InArray[inpointer+lenW];

switch (st){

case 0:

if (c==' ' || c=='\t' || c=='\n') st = 1;

else

if ((c>='A' && c='a' && c<='z')) st = 2;

else

if (c>='0' && c<='9') st = 3;

else

if (

c=='.' || c=':' || c<=';' ||

c=='+' || c='*' || c<='/' ||

c=='\''

)

{ lenW = 1; return typeW = wtpe_char; }

else { lenW = 0; return typeW = wtpe_error; }

break;

case 1:

if (c==' ' || c=='\t' || c=='\n') lenW++;

else return typeW = wtpe_space;

break;

case 2:

if (

(c>='A' && c<='Z') ||

(c>='a' && c<='z') ||

(c>='0' && c<='9') ||

c=='_'

) lenW++;

else return typeW = wtpe_str;

break;

case 3:

if (c>='0' && c<='9') lenW++; else

if (c=='.'&& InArray[inpointer+lenW+1]!='.') {

lenW++;

st = 5;

}

else{

numfW = 0;

return typeW = wtpe_numb;

}

break;

case 5:

if (c>='0' && c<='9') lenW++; else {

numfW = 1;

return typeW = wtpe_numb;

}

}

}

lenW = 0;

return 0;

}

putSrtw(char * s){

int l = strlen(s);

memcpy(&OutArray[OutLenght],s,l);

OutLenght += l;

}

scmp(char * m, char * s, int n){

int l = strlen(s);

if (n>l) l = n;

return memicmp(m,s,l);

}

putChrw(char c){

OutArray[OutLenght] = c;

OutLenght++;

}

copyit(){

memcpy(&OutArray[OutLenght],&InArray[inpointer],lenW);

inpointer += lenW;

OutLenght += lenW;

}

equit(char * s){

return (!scmp(&InArray[inpointer],s,lenW));

}

skipit(){

inpointer += lenW;

}

wstr(char * s){

strncpy(s,&InArray[inpointer],lenW);

}

GetTokens(){

getToken();

if (typeW==wtpe_space) {

skipit();

getToken();

}

return typeW;

}

inc_dt()

{

ots += 2;

}

dec_dt()

{

ots -= 2;

}

put_dt()

{

for (int i=0; i<ots; i++) putChrw(' ');

}

put_dt11()

{

char s[10];

for (int i=0; i<ots; i++) {

sprintf(s,"%d",i/2);

putSrtw(s);

}

}

inTxt(char * s1)

{

if ((spasfl = fopen(s1, "rt")) == NULL){

return 0;

}

fseek(spasfl, 0, SEEK_END);

InLength = ftell(spasfl);

fseek(spasfl, 0, SEEK_SET);

if (InLength>memoLen) InLength = memoLen;

InLength = fread(InArray,1,InLength,spasfl);

InArray[InLength] = 0;

inpointer = 0;

OutLenght = 0;

return 1;

}

outTxt(char * s2)

{

if ((ccfl = fopen(s2, &qu