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

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

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

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

Файлы: 1 файл

Отчет4.doc

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

         {

         printf("Can't open file test.txt ");  // Вывод сообщения об ошибке

         getch();  // Ждать нажатия на любую кнопку

         exit(1);   // Выход

         } 

   init();  // Иницализация

   parse();  // Разбор

   emit();  // Выполнение 

   fclose(Open);  //Закрыть файл 

   if (a1)  // Если второй аргумент есть, то

         {

         printf(" symtable:n");  // Вывод таблицы символов

         get_symtable();

         }

   if (a2)  // Если третий аргумент есть, то

         {

         printf(" codetable:n");  // Вывод таблицы кодов

         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->token);

   }

 

   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,"%lf",&tokenval);// Занести занчение числа (1 или > символов) в tokenval

               return NUM;// Вернуть идентификатор  числа

               }

         else if (isalpha(t)) /* t - буква */

               {

               int p, b = 0;

               while (isalnum(t)) /* Пока t - буква или цифра */

                     {

                     lexbuf[b++] = t;// Добавить  в буффер t

                     t=fgetc(Open);// Считать  очередной символ

                     if (b >= BSIZE)// если  превышен рзмер буффера

                           error("compiler error");// Вызов процедуры выхода с сообщением  об ошибке

                     }

               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,symtable[tv].lexptr,0);// Добавить в таблицу кодов присваивание  переменной

                break;

          case PRINTN:

                match(PRINTN);

                expr();// Обработка выражения

                insertcode(PRINTN,"printn",0);// Добавить строчку в таблицу кодов

                while(1)

                      {

                      switch(lookahead)

                            {

                      case ',':// Обработкааргументов,  введенных через запятую

                            match(',');

                        expr();

                            insertcode(PRINTN,"printn",0);

                            break;

                      default:

                                      return;

                            }

                      }

          case INPUT:

                match(INPUT);

                IdIn();// Добваить в  таблицу кодов строчку получения  заначения переменной

                break;

          case PRINT:

                match(PRINT);

                expr();

                insertcode(PRINT,"print",0);

                while(1)

                      {

                      switch(lookahead)

                            {

                      case ',':

                            match(',');

                            expr();

                            insertcode(PRINT,"print",0);

                            break;

                      default:

                            return;

                        }

                      }

          case BEGIN:

                match(BEGIN);

                FillCode();// Вызов процедуры  обработки слов (вначале проверится  слово, затем ";")

                match(END);

                break;

          case IF:

                match(IF);

                match('(');

                expr();

                insertcode(THEN,"then",0);

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

                match(')');

                FC();

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