Транслятор на языке Си для перевода текста программы с языка Паскаль на язык Си (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