Автор работы: Пользователь скрыл имя, 30 Октября 2009 в 19:41, Не определен
Пояснительная записка
к курсовому проекту
по дисциплине СПО
codetable[
insertcode(GOTO,"
LabelPush(
match(ELSE);
FC();
codetable[
break;
case WHILE:
insertcode(WHILE,"
LabelPush(
match(WHILE);
match('(');
expr();
match(')');
insertcode(DO,"do"
LabelPush(
FC();
codetable[
insertcode(GOTO,"
break;
default:
return;
}
}
}
int expr(void)
{
term();// Ввызов
вспомогательной процедуры
while(1)
{
switch(lookahead)// Обработка операций + - и логических уловий
{
case '+':
match(lookahead);/
term();
insertcode('+',"+"
break;
case '-':
match(lookahead);
term();
insertcode('-',"-"
break;
case JNE:
match(lookahead);
term();
insertcode(JE,"!="
break;
case JE:
match(lookahead);
term();
insertcode(JNE,"==
break;
case JL:
match(lookahead);
term();
insertcode(JL,"<",
break;
case JLE:
match(lookahead);
term();
insertcode(JLE,"<=
break;
case JG:
match(lookahead);
term();
insertcode(JG,">",
break;
case JGE:
match(lookahead);
term();
insertcode(JGE,">=
break;
default:
return;
}
}
}
int term()
{
factor();// Ввызов
вспомогательной процедуры
while(1)
{
switch(lookahead)//
Обработка матемтических
{
case '*':
match(lookahead);
factor();
insertcode('*',"*"
break;
case '/':
match(lookahead);
factor();
insertcode('/',"/"
break;
default:
return;
}
}
}
int factor(void)
{
switch(lookahead)
{
case NUM:
insertcode(NUM,"
match(NUM);
break;
case ID:
insertcode(ID,
match(ID);
break;
case '(':
match('(');
expr();
match(')');
break;
default:
error("syntax error");
}
return 0;
}
int IdIn()
{
insertcode(INPUT,symtable[
match(ID);
while(1)
{
switch(lookahead)
{
case ',':
match(',');
insertcode(INPUT,
match(ID);
break;
default:
return;
}
}
}
void LabelPush(int n)// Добавить метку в стек
{
LabelStack[LabelCnt++]=n;
}
int LabelPop(void)// Извлечь метку из стека
{
LabelCnt--;
return LabelStack[LabelCnt];
}
int match(int
t)//процедура переходит к
{
if(lookahead==t)// Если
t совпадает со сканируемым
lookahead=lexan();// Считать следующее слово
else error("syntax error");// Иначе - вывод ошибки, выход
return 0;
}
symbol.c
#include "global.h"
#define STRMAX 1000 /* Размер массива лексем */
#define SYMMAX 1000 /* Размер таблицы символов */
#define CODEMAX 1000/*
Размер таблицы кодов */
char lexemes[STRMAX];
int lastchar = -1; /* Последняя
использованная позиция в
struct entry symtable[SYMMAX];
int lastentry = 0; // Последняя
использованная позиция в таблице символов
char lexgen[STRMAX];
int lastlexgen = -1;
struct code codetable[CODEMAX];
int lastcode = 0; /* Последняя
использованная позиция в таблице кодов
*/
int lookup(char s[]) /* Возвращает положение в таблице символов для s */
{
int i;
for(i = lastentry; i > 0; i--)
if (strcmp(symtable[i].lexptr, s) == 0)
return i;
return 0;
}
int insert(char s[], int tok) /* Добавить строчку в таблицу символов */
{
int len;
len = strlen(s); /* strlen вычисляет длину строки */
if (lastentry + 1 >= SYMMAX)
error("symbol table full");
if (lastchar + len + 1 >= STRMAX)
error("lexemes array full");
lastentry++;
symtable[lastentry].token = tok;
symtable[lastentry].lexptr = &lexemes[lastchar + 1];
lastchar += len + 1;
strcpy(symtable[lastentry].
return lastentry;
}
int insertcode(int tok,char s[],double value){ //Добавление в таблицу кодов
int len;
len=strlen(s);
if(lastcode+1>=CODEMAX)
error("code table full");
if(lastlexgen+len+1>=
error("
lastcode++;
codetable[lastcode].
codetable[lastcode].
codetable[lastcode].
lastlexgen+=len +1;
strcpy(codetable[
return lastcode;
}
int get_codetable()// Вывести таблицу кодов
{
int i;
for(i=1;i<=lastcode;i++)
printf("%d
%d %s %g
",i,codetable[i].token,
return 0;
}
int get_symtable()// Вывести таблицу символов
{
int i;
for(i=1;i<=lastentry;i++)
printf("%d
%d %s %g
",i,symtable[i].token,
return 0;
}
emitter.c
#include "global.h"
double stack[1000];
int j=0;
int a;
double pop(void);
void push(double n);
double x,y,z;
int emit(void) //Выполнение программы
{
int i=0;
while(i<lastcode)// Выполнять, пока не достигнут конец таблицы кодов
{
switch(codetable[i].
{
case NUM:
push(codetable[i].
break;
case ID:
push(symtable[