Автор работы: Пользователь скрыл имя, 30 Октября 2009 в 19:41, Не определен
Пояснительная записка 
к курсовому проекту 
по дисциплине СПО 
{
printf("Can't open file test.txt "); // Вывод сообщения об ошибке
getch(); // Ждать нажатия на любую кнопку
exit(1); // Выход
         } 
init(); // Иницализация
parse(); // Разбор
   emit();  
// Выполнение 
   fclose(Open);  
//Закрыть файл 
if (a1) // Если второй аргумент есть, то
{
         printf("
symtable:
get_symtable();
}
if (a2) // Если третий аргумент есть, то
{
         printf("
codetable:
get_codetable();
}
printf(" Press any key to exit. ");
getch(); // Ждать нажатия на клавишу
return(0);
}
 
   init.c 
#include "global.h"
struct entry keywords[]=
{
"if",IF,0,
"else",ELSE,0,
"while",WHILE,0,
"input",INPUT,0,
"print",PRINT,0,
"printn",PRINTN,0,
0,0,0,
   }; 
void init(void)/* Загрузка ключевых слов в таблицу символов */
{
struct entry *i;
   for(i=keywords;i->token;i++
         insert(i->lexptr,i->
}
 
   lexer.c 
   #include 
"global.h" 
   int CmpNextSym(int,int,int); 
char lexbuf[BSIZE];
int lineno = 1;
   double tokenval 
= NONE; 
int lexan(void) /* Лексический анализатор */
{
int t;
while (1)
{
t = fgetc(Open);// Считать в t символ из ранее открытого файла
if (t == ' ' || t == ' '); /* Отбрасываем разделители-пробелы */
else if (t == ' ')// Если символ перевода строки, то
lineno++;// Увеличить счетчик линий
else if (isdigit(t)) /* t - цифра */
{
ungetc(t, Open);// Вернуть t во входной поток
               fscanf(Open,"%
return NUM;// Вернуть идентификатор числа
}
else if (isalpha(t)) /* t - буква */
{
int p, b = 0;
while (isalnum(t)) /* Пока t - буква или цифра */
{
                     lexbuf[b+
                     t=fgetc(
if (b >= BSIZE)// если превышен рзмер буффера
                           err
}
lexbuf[b] = EOS;// Добавить в буффер признак завершения последовательности символов (слова)
if (t != EOF)// Если t - не признак конца файла, то
ungetc(t, Open);// Вернуть t
p = lookup(lexbuf);// p = положение считанного слова в таблце символов
if (p == 0)// Если слово встретилось впервые
p = insert(lexbuf, ID);// Добавить в таблицу символов новую переменную
tokenval = p;
               return symtable[p].token;// Вернуть 
соответствующий считанному 
}
else if (t == EOF) return DONE;// Если в t признак завершения файла - вернуть идентификатор конца программы
else switch(t)// Иначе, если t один из символов:
{
case '>':
return CmpNextSym('=',JG,JGE);// Если за t следует =, то вернуть инедтификатор условия JGE (больше-равно), иначе - JG (больше)
case '<':
return CmpNextSym('=',JL,JLE);// Меньше-равно, или меньше
case '!':
return CmpNextSym('=',JNE,'!');// Не равно, или символ !
case '=':
return CmpNextSym('=',JE,'=');// Равно (условие) или символ =
case ':':
return CmpNextSym('=',EQUAL,':');// Прсвоить или символ :
case '{':
return BEGIN;// Вернуть идентификатор BEGIN
case '}':
return END;// Вернуть идентификатор END
default:// Если что-либо другое, то
tokenval=NONE;
return t;// Вернуть t
}
}
   } 
int CmpNextSym(int ch,int good,int bad)
{
int nc=fgetc(Open);// считать следующий символ
if(nc==ch) return good;//если следующий символ = ch - вернуть good
ungetc(nc,Open);//иначе, возврат символа во входной поток
return bad;// вернуть bad
}
 
parser.c 
#include "global.h" 
int FillCode(void);
int FC(void);
int expr(void);
int term(void);
int factor(void);
int IdIn(void);
void LabelPush(int);
int LabelPop(void);
int match(int); 
int lookahead;//текущий сканируемый входной токен
int LabelStack[100],LabelCnt=0;
double tv; 
int parse(void)/* Разбор и трансляция списка выражений */
{
lookahead=lexan();// Чтение слова
while(lookahead!=DONE)// 
До тех пор, пока не будет 
получен идентификатор 
{
FillCode();// Заполнение таблицы кодов
}
return 0;// Возврат
} 
int FillCode()
{
int t;
FC();// Обработка слова
while(1)// Бесконечно повторять
{
switch(lookahead)
{
case ';'://Если текущее слово - символ ";", то
match(';');// Перейти к следующему слову
insertcode(0,";",0);// Добавить в таблицу клдлв ";"
FC();// Обработка слова
break;
default:
return;
}
}
} 
int FC(void)
{
while(1)
{
switch(lookahead)
{
case ID:
match(ID);
tv=tokenval;
match(EQUAL);
expr();// Обработка выражения
            insertcode(EQUAL,
break;
case PRINTN:
match(PRINTN);
expr();// Обработка выражения
            insertcode(PRINTN,
while(1)
{
                  switch(
{
case ',':// Обработкааргументов, введенных через запятую
                        match(
expr();
                        insert
break;
default:
                              
}
}
case INPUT:
match(INPUT);
            IdIn();// Добваить в 
таблицу кодов строчку 
break;
case PRINT:
match(PRINT);
expr();
            insertcode(PRINT,"
while(1)
{
                  switch(
{
case ',':
                        match(
                        expr()
                        insert
break;
default:
                        return
}
}
case BEGIN:
match(BEGIN);
FillCode();// Вызов процедуры обработки слов (вначале проверится слово, затем ";")
match(END);
break;
case IF:
match(IF);
match('(');
expr();
            insertcode(THEN,"
            LabelPush(
match(')');
FC();