Интерпретатор

Автор работы: Пользователь скрыл имя, 30 Октября 2009 в 19:41, Не определен

Описание работы

Пояснительная записка
к курсовому проекту
по дисциплине СПО

Файлы: 1 файл

Отчет4.doc

— 114.50 Кб (Скачать файл)

                codetable[LabelPop()].value=lastcode+1;// Изменить занчение в строке  метки, для указания на нужную  строчку

                insertcode(GOTO,"else",0);

                LabelPush(lastcode);// Добавить метку

                match(ELSE);

                FC();

                codetable[LabelPop()].value=lastcode;// Изменить занчение в строке метки, для указания на нужную строчку

                break;

          case WHILE:

                insertcode(WHILE,"while",0);

                LabelPush(lastcode);

                match(WHILE);

                match('(');

                expr();

                match(')');

                insertcode(DO,"do",0);

                LabelPush(lastcode);

                FC();

                codetable[LabelPop()].value=lastcode+1;

                insertcode(GOTO,"goto",LabelPop());

                break;

          default:

                return;

                }

          }

    } 

    int expr(void)

    {

    term();// Ввызов  вспомогательной процедуры разбора

    while(1)

          {

          switch(lookahead)// Обработка операций + - и логических  уловий

                {

          case '+':

                match(lookahead);// Перейти  к следующему слову

                term();

                insertcode('+',"+",0);

                break;

          case '-':

                match(lookahead);

                term();

                insertcode('-',"-",0);

                break;

          case JNE:

                match(lookahead);

                term();

                insertcode(JE,"!=",0);

                break;

          case JE:

                match(lookahead);

                term();

                insertcode(JNE,"==",0);

                break;

          case JL:

                match(lookahead);

                term();

                insertcode(JL,"<",0);

                break;

          case JLE:

                match(lookahead);

                term();

                insertcode(JLE,"<=",0);

                break;

          case JG:

                match(lookahead);

                term();

                insertcode(JG,">",0);

                break;

          case JGE:

                match(lookahead);

                term();

                insertcode(JGE,">=",0);

                break;

          default:

                return;

                }

          }

    } 

    int term()

    {

    factor();// Ввызов  вспомогательной процедуры разбора 

    while(1)

          {

          switch(lookahead)// Обработка матемтических операций  типа *, /

                {

          case '*':

                match(lookahead);

                factor();

                insertcode('*',"*",0);

                break;

          case '/':

                match(lookahead);

                factor();

                insertcode('/',"/",0);

                break;

          default:

                return;

                }

          }

    } 

    int factor(void)

    {

    switch(lookahead)

          {

          case NUM:

                insertcode(NUM,"num",tokenval);

                match(NUM);

                break;

          case ID:

                insertcode(ID,symtable[tokenval].lexptr,0);

                match(ID);

                break;

          case '(':

                match('(');

                expr();

                match(')');

                break;

          default:

                error("syntax error");

          }

    return 0;

    } 

    int IdIn()

    {

    insertcode(INPUT,symtable[tokenval].lexptr,0);

    match(ID);

    while(1)

          {

          switch(lookahead)

                {

          case ',':

                match(',');

                insertcode(INPUT,symtable[tokenval].lexptr,0);

                match(ID);

                break;

          default:

                return;

                }

          }

    } 

    void LabelPush(int n)// Добавить метку в стек

    {

    LabelStack[LabelCnt++]=n;

    } 

    int LabelPop(void)// Извлечь  метку из стека

    {

    LabelCnt--;

    return LabelStack[LabelCnt];

    } 

    int match(int t)//процедура переходит к следующему  входному токену, если ее аргумент 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; /* Последняя  использованная позиция в lexemes */

    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].lexptr, s);

    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>=STRMAX)

                      error("lexemes array full");

          lastcode++;

          codetable[lastcode].value = value;

          codetable[lastcode].token = tok;

          codetable[lastcode].lexptr = &lexgen[lastlexgen+1];

          lastlexgen+=len +1;

          strcpy(codetable[lastcode].lexptr,s);

          return lastcode;

    } 

    int get_codetable()// Вывести таблицу кодов

    {

    int i;

    for(i=1;i<=lastcode;i++)

          printf("%d %d %s %g ",i,codetable[i].token,codetable[i].lexptr,codetable[i].value);

    return 0;

    } 

    int get_symtable()// Вывести таблицу символов

    {

    int i;

    for(i=1;i<=lastentry;i++)

          printf("%d %d %s %g ",i,symtable[i].token,symtable[i].lexptr,symtable[i].value);

    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].token)// Выполнить действие, в соответствии  с прочитанным словом из таблицы  кодов

                {

          case NUM:

                push(codetable[i].value);

                  break;

          case ID:

                push(symtable[lookup(codetable[i].lexptr)].value);

Информация о работе Интерпретатор