Автор работы: Пользователь скрыл имя, 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();