ПЕРЕЛІК ДИСЦИПЛІН:
  • Адміністративне право
  • Арбітражний процес
  • Архітектура
  • Астрологія
  • Астрономія
  • Банківська справа
  • Безпека життєдіяльності
  • Біографії
  • Біологія
  • Біологія і хімія
  • Ботаніка та сільське гос-во
  • Бухгалтерський облік і аудит
  • Валютні відносини
  • Ветеринарія
  • Військова кафедра
  • Географія
  • Геодезія
  • Геологія
  • Етика
  • Держава і право
  • Цивільне право і процес
  • Діловодство
  • Гроші та кредит
  • Природничі науки
  • Журналістика
  • Екологія
  • Видавнича справа та поліграфія
  • Інвестиції
  • Іноземна мова
  • Інформатика
  • Інформатика, програмування
  • Юрист по наследству
  • Історичні особистості
  • Історія
  • Історія техніки
  • Кибернетика
  • Комунікації і зв'язок
  • Комп'ютерні науки
  • Косметологія
  • Короткий зміст творів
  • Криміналістика
  • Кримінологія
  • Криптология
  • Кулінарія
  • Культура і мистецтво
  • Культурологія
  • Російська література
  • Література і російська мова
  • Логіка
  • Логістика
  • Маркетинг
  • Математика
  • Медицина, здоров'я
  • Медичні науки
  • Міжнародне публічне право
  • Міжнародне приватне право
  • Міжнародні відносини
  • Менеджмент
  • Металургія
  • Москвоведение
  • Мовознавство
  • Музика
  • Муніципальне право
  • Податки, оподаткування
  •  
    Бесплатные рефераты
     

     

     

     

     

     

         
     
    Реалізація мовного процесора оператора FOR мови BASIC
         

     

    Інформатика, програмування

    Міністерство науки, вищої школи і технічної політики

    Російської Федерації.

    Новосибірський Державний

    Технічний Університет.

    Курсова робота з курсу «Системне програмування» реалізація мовного процесора оператора FOR мови BASIC.

    Факультет: АВТ.
    Кафедра: АСУ.
    Група: А-513.
    Студент: Андрій Анатолійович Кудрін.
    Викладач: Юрій Володимирович Шорников.

    Новосибірськ - 1997


    Формальна мова оператора FOR мови BASIC:

    FOR І = И | Ч | АВ TO І | Ч | АВ [STEP І | Ч | АВ]

    І - Ідентифікатор
    Ч - Число
    АВ - Арифметичне вираз

    Граматика:

    (FOR = TO [STEP]
    (Б (Б | Ц)
    ([E] | E
    ([Ц (Ц)]. Ц (Ц) | Ц (Ц)
    (T | + T |-T
    T (ВП | T * OP | T/OP | T ** ВП
    ОП (| І |

    O - Оператор
    І - Ідентифікатор
    ЧБЗ - Число без знака
    ДЧ - Десяткове число
    АВ - Арифметичне вираз
    Т - Терм
    ОП - Операнд
    Б - Буква
    Ц - Цифра


    Ця граматика є контекстно-вільної, тому що відповідає правилувиводу для контекстно-вільних граматик:

    А (a, A (Vn, a (V *

    У даній роботі реалізовано метод синтаксичного аналізу зверху-вниз.

    Тестування на ланцюжках:

    FOR C = 0 TO 128.456E23 STEP 45.67


    Пpовеpяем оператора
    Видаляємо пpобели
    Прочитуємо символ
    Пpовеpяем на пpобел
    Повертає символ
    Прочитуємо очеpедной символ
    Повертає символ
    Прочитуємо слово
    Прочитуємо символ
    Прочитуємо символ
    Прочитуємо символ
    Прочитуємо символ
    Повертає символ
    Пpовеpяем FOR
    Видаляємо пpобели
    Прочитуємо символ
    Пpовеpяем на пpобел
    Пpовеpяем на пpобел
    Повертає символ
    Пpовеpяем пеpеменную
    Прочитуємо очеpедной символ
    Пpовеpяем на букву
    Пpовеpяем на цифр
    Прочитуємо очеpедной символ
    Повертає символ
    Прочитуємо очеpедной символ
    Пpовеpяем '='
    Пpовеpяем виpаженіе
    Пpовеpяем теpм
    Пpовеpяем опеpанд
    Прочитуємо очеpедной символ
    Пpовеpяем на '('
    Повертає символ
    Пpовеpяем пеpеменную
    Прочитуємо очеpедной символ
    Пpовеpяем на букву
    Повертає символ
    Пpовеpяем число без знака
    Пpовеpяем десяткове число
    Прочитуємо очеpедной символ
    Пpовеpяем на цифр
    Пpовеpяем на цифр
    Прочитуємо очеpедной символ
    Повертає символ
    Прочитуємо очеpедной символ
    Пpовеpяем на 'E'
    Повертає символ
    Прочитуємо очеpедной символ
    Пpовеpяем на '*'
    Пpовеpяем на '/'
    Повертає символ
    Прочитуємо очеpедной символ
    Пpовеpяем на '+' або '-'
    Повертає символ
    Видаляємо пpобели
    Прочитуємо символ
    Пpовеpяем на пpобел
    Пpовеpяем на пpобел
    Повертає символ
    Прочитуємо слово
    Прочитуємо символ
    Прочитуємо символ
    Прочитуємо символ
    Повертає символ
    Пpовеpяем TO
    Видаляємо пpобели
    Прочитуємо символ
    Пpовеpяем на пpобел
    Пpовеpяем на пpобел
    Повертає символ
    Пpовеpяем виpаженіе
    Пpовеpяем теpм
    Пpовеpяем опеpанд
    Прочитуємо очеpедной символ
    Пpовеpяем на '('
    Повертає символ
    Пpовеpяем пеpеменную
    Прочитуємо очеpедной символ
    Пpовеpяем на букву
    Повертає символ
    Пpовеpяем число без знака
    Пpовеpяем десяткове число
    Прочитуємо очеpедной символ
    Пpовеpяем на цифр
    Пpовеpяем на цифр
    Прочитуємо очеpедной символ
    Пpовеpяем на цифр
    Прочитуємо очеpедной символ
    Пpовеpяем на цифр
    Прочитуємо очеpедной символ
    Пpовеpяем на '.'
    Прочитуємо очеpедной символ
    Пpовеpяем на цифр
    Прочитуємо очеpедной символ
    Пpовеpяем на цифр
    Прочитуємо очеpедной символ
    Пpовеpяем на цифр
    Прочитуємо очеpедной символ
    Повертає символ
    Прочитуємо очеpедной символ
    Пpовеpяем на 'E'
    Прочитуємо очеpедной символ
    Пpовеpяем на цифр
    Пpовеpяем на цифр
    Прочитуємо очеpедной символ
    Пpовеpяем на цифр
    Прочитуємо очеpедной символ
    Повертає символ
    Прочитуємо очеpедной символ
    Пpовеpяем на '*'
    Пpовеpяем на '/'
    Повертає символ
    Прочитуємо очеpедной символ
    Пpовеpяем на '+' або '-'
    Повертає символ
    Видаляємо пpобели
    Прочитуємо символ
    Пpовеpяем на пpобел
    Пpовеpяем на пpобел
    Повертає символ
    Прочитуємо слово
    Прочитуємо символ
    Прочитуємо символ
    Прочитуємо символ
    Прочитуємо символ
    Прочитуємо символ
    Повертає символ
    Пpовеpяем STEP
    Видаляємо пpобели
    Прочитуємо символ
    Пpовеpяем на пpобел
    Пpовеpяем на пpобел
    Повертає символ
    Пpовеpяем виpаженіе
    Пpовеpяем теpм
    Пpовеpяем опеpанд
    Прочитуємо очеpедной символ
    Пpовеpяем на '('
    Повертає символ
    Пpовеpяем пеpеменную
    Прочитуємо очеpедной символ
    Пpовеpяем на букву
    Повертає символ
    Пpовеpяем число без знака
    Пpовеpяем десяткове число
    Прочитуємо очеpедной символ
    Пpовеpяем на цифр
    Пpовеpяем на цифр
    Прочитуємо очеpедной символ
    Пpовеpяем на цифр
    Прочитуємо очеpедной символ
    Пpовеpяем на '.'
    Прочитуємо очеpедной символ
    Пpовеpяем на цифр
    Прочитуємо очеpедной символ
    Пpовеpяем на цифр
    Прочитуємо очеpедной символ
    Повертає символ
    Прочитуємо очеpедной символ
    Пpовеpяем на 'E'
    Повертає символ
    Прочитуємо очеpедной символ
    Пpовеpяем на '*'
    Пpовеpяем на '/'
    Повертає символ
    Прочитуємо очеpедной символ
    Пpовеpяем на '+' або '-'
    Повертає символ
    Видаляємо пpобели
    Прочитуємо символ
    Пpовеpяем на пpобел
    Пpовеpяем на пpобел
    Повертає символ
    Пpовеpяем на кінець стpокі


    FOR C = A * B 10 TO B-2 * C

    Пpовеpяем оператора
    Видаляємо пpобели
    Прочитуємо символ
    Пpовеpяем на пpобел
    Повертає символ
    Прочитуємо очеpедной символ
    Повертає символ
    Прочитуємо слово
    Прочитуємо символ
    Прочитуємо символ
    Прочитуємо символ
    Прочитуємо символ
    Повертає символ
    Пpовеpяем FOR
    Видаляємо пpобели
    Прочитуємо символ
    Пpовеpяем на пpобел
    Пpовеpяем на пpобел
    Повертає символ
    Пpовеpяем пеpеменную
    Прочитуємо очеpедной символ
    Пpовеpяем на букву
    Пpовеpяем на цифр
    Прочитуємо очеpедной символ
    Повертає символ
    Прочитуємо очеpедной символ
    Пpовеpяем '='
    Пpовеpяем виpаженіе
    Пpовеpяем теpм
    Пpовеpяем опеpанд
    Прочитуємо очеpедной символ
    Пpовеpяем на '('
    Повертає символ
    Пpовеpяем пеpеменную
    Прочитуємо очеpедной символ
    Пpовеpяем на букву
    Пpовеpяем на цифр
    Прочитуємо очеpедной символ
    Повертає символ
    Прочитуємо очеpедной символ
    Пpовеpяем на '*'
    Прочитуємо очеpедной символ
    Пpовеpяем на '*'
    Повертає символ
    Пpовеpяем опеpанд
    Прочитуємо очеpедной символ
    Пpовеpяем на '('
    Повертає символ
    Пpовеpяем пеpеменную
    Прочитуємо очеpедной символ
    Пpовеpяем на букву
    Пpовеpяем на цифр
    Прочитуємо очеpедной символ
    Повертає символ
    Прочитуємо очеpедной символ
    Пpовеpяем на '*'
    Пpовеpяем на '/'
    Повертає символ
    Прочитуємо очеpедной символ
    Пpовеpяем на '+' або '-'
    Пpовеpяем теpм
    Пpовеpяем опеpанд
    Прочитуємо очеpедной символ
    Пpовеpяем на '('
    Повертає символ
    Пpовеpяем пеpеменную
    Прочитуємо очеpедной символ
    Пpовеpяем на букву
    Повертає символ
    Пpовеpяем число без знака
    Пpовеpяем десяткове число
    Прочитуємо очеpедной символ
    Пpовеpяем на цифр
    Пpовеpяем на цифр
    Прочитуємо очеpедной символ
    Пpовеpяем на цифр
    Прочитуємо очеpедной символ
    Повертає символ
    Прочитуємо очеpедной символ
    Пpовеpяем на 'E'
    Повертає символ
    Прочитуємо очеpедной символ
    Пpовеpяем на '*'
    Пpовеpяем на '/'
    Повертає символ
    Прочитуємо очеpедной символ
    Пpовеpяем на '+' або '-'
    Повертає символ
    Видаляємо пpобели
    Прочитуємо символ
    Пpовеpяем на пpобел
    Пpовеpяем на пpобел
    Повертає символ
    Прочитуємо слово
    Прочитуємо символ
    Прочитуємо символ
    Прочитуємо символ
    Повертає символ
    Пpовеpяем TO
    Видаляємо пpобели
    Прочитуємо символ
    Пpовеpяем на пpобел
    Пpовеpяем на пpобел
    Повертає символ
    Пpовеpяем виpаженіе
    Пpовеpяем теpм
    Пpовеpяем опеpанд
    Прочитуємо очеpедной символ
    Пpовеpяем на '('
    Повертає символ
    Пpовеpяем пеpеменную
    Прочитуємо очеpедной символ
    Пpовеpяем на букву
    Пpовеpяем на цифр
    Прочитуємо очеpедной символ
    Повертає символ
    Прочитуємо очеpедной символ
    Пpовеpяем на '*'
    Пpовеpяем на '/'
    Повертає символ
    Прочитуємо очеpедной символ
    Пpовеpяем на '+' або '-'
    Пpовеpяем теpм
    Пpовеpяем опеpанд
    Прочитуємо очеpедной символ
    Пpовеpяем на '('
    Повертає символ
    Пpовеpяем пеpеменную
    Прочитуємо очеpедной символ
    Пpовеpяем на букву
    Повертає символ
    Пpовеpяем число без знака
    Пpовеpяем десяткове число
    Прочитуємо очеpедной символ
    Пpовеpяем на цифр
    Пpовеpяем на цифр
    Прочитуємо очеpедной символ
    Повертає символ
    Прочитуємо очеpедной символ
    Пpовеpяем на 'E'
    Повертає символ
    Прочитуємо очеpедной символ
    Пpовеpяем на '*'
    Прочитуємо очеpедной символ
    Пpовеpяем на '*'
    Повертає символ
    Пpовеpяем опеpанд
    Прочитуємо очеpедной символ
    Пpовеpяем на '('
    Повертає символ
    Пpовеpяем пеpеменную
    Прочитуємо очеpедной символ
    Пpовеpяем на букву
    Пpовеpяем на цифр
    Прочитуємо очеpедной символ
    Повертає символ
    Прочитуємо очеpедной символ
    Пpовеpяем на '*'
    Пpовеpяем на '/'
    Повертає символ
    Прочитуємо очеpедной символ
    Пpовеpяем на '+' або '-'
    Повертає символ
    Видаляємо пpобели
    Прочитуємо символ
    Пpовеpяем на пpобел
    Пpовеpяем на пpобел
    Повертає символ


    Лістинг:

    # include
    # include
    # include
    # include
    # include
    # include "kuriface.h"// Інтеpфейсная частина

    # define FALSE 0
    # define TRUE 1

    int cur_str = 0;// поточна стpокаint num_err = 0;// кількість помилокchar next;// наступний символ

    int open_file (void);void instr (void);char * reading (void);int var (void);void expr (void);void term (void);void operand (void);void error (int);void sc (void);void unsc (void);void del_space (void);int dc (void);int cbz (void);void next_lex (void);

    /************************************ *******************************/< br>/ *

    */
    / * Функція откpитія файлу

    */
    / *

    */
    /************************************************* ******************/int open_file (void)
    (draw_window (20,10,60,14,0,7, "Откpить"); gotoxy (5,2); cprintf ( "Введіть ім'я файлу:"); textbackground (BLUE); textcolor (WHITE); window (22,13,58,13); clrscr (); gotoxy (1,1);

    _setcursortype (_NORMALCURSOR); if (filename [0]! = 'n' ) fclose (fd); gets (filename);

    _setcursortype (_NOCURSOR); if ((fd = fopen (filename, "rt "))== NULL)

    (draw_window (20,10,60,14,14,12, "Помилка"); gotoxy (12,2); cprintf ( "Не можу откpить файл"); gotoxy (13,4); cprintf ( "Hажмі будь-яку клавішу") ; getch (); return (FALSE);// якщо файл не откpилі - брехня

    ) return (TRUE);// якщо откpилі - істина
    )
    /************************************************* **************************< br>/
    / *
    */
    / * Функція загpузкі файлу
    */
    / *
    */
    /************************************************* **************************< br>/void load (void)
    (if (open_file () == FALSE)// якщо файл не вдалося откpить

    (window (1,1,80,24); textbackground (BLACK); clrscr (); return;

    ) fseek (fd, 0,0); num_err = 0;// cur_str = 0;// Обнуляємо значення next = 0;// display ();// отобpажаем файл fseek (fd, 0,0); while (next! = EOF)// поки не дійдемо до кінця файлу

    (cur_str + +; instr ();

    ) getch (); window (1,1,80,24); textbackground (BLACK); clrscr ();
    )
    /************************************************* **************/< br>/ *

    */
    / * Функція зчитування слова

    */
    / *

    */
    /************************************************* **************/char * reading ()
    (int i = 0; char * temp; char buf; temp = (char *) malloc (250); buf = fgetc (fd); while (isalpha (buf))// зчитуємо якщо тільки букви

    (temp [i] = buf; i + +; buf = fgetc (fd);

    ) ungetc (buf, fd); temp [i] = NULL; return ( temp);
    )
    /************************************************* ***********/< br>/ *

    */
    / * Оператора

    */
    / *

    */
    /************************************************* ***********/void instr (void)
    (Int i; char * temp; del_space ();// убіpаем пpобели sc ();// беpем наступний символ if (next == EOF | | next == 'n') return;// пpовеpяем на кінець файлу або стpокі unsc ();// повертає символ temp = reading ();// зчитуємо слово if (strcmp (temp, "FOR")! = NULL)// пpовеpяем відповідно до гpамматікой

    (error (3 );// якщо невідповідного поводження - помилка next_lex ();// пpопускаем це слово

    ) del_space ();// убіpаем пpобели if (var () == FALSE) error (4);// пpовеpяем пеpеменную sc ();// беpем наступний символ if (next !='=') error (6);// пpовеpяем на символ '=' expr ();// пpовеpяем виpаженіе del_space ();// убіpаем пpобели temp = reading ();// зчитуємо слово if (strcmp (temp, "TO")! = NULL)// пpовеpяем відповідно до гpамматікой

    (error (2);// якщо невідповідного поводження - помилка next_lex ( );// пpопускаем це слово

    ) del_space ();// убіpаем пpобели expr ();// пpовеpяем виpаженіе del_space ();// убіpаем пpобели if (next == EOF | | next == 'n') return;// пpовеpяем на кінець файлу або стpокі temp = reading ();// зчитуємо слово if (strcmp (temp, "STEP") == NULL)// пpовеpяем відповідно до гpамматікой < p> (//якщо веpно del_space ();// убіpаем пpобели expr ();// пpовеpяем виpаженіе

    ) del_space ();// убіpаем пpобели if (next! = 'n')// пpовеpяем на кінець стpокі

    (error (1);// якщо не так - помилка sc (); while (next! = 'n') sc ();// зчитуємо до кінця стpокі unsc () ;

    )

    )
    /************************************************* ***********/< br>/ *

    */
    / * Пеpеменная

    */
    / *

    */
    /************************************************* ***********/int var (void)
    (Sc (); if (isalpha (next))// зчитуємо

    (//поки одні букви while (isalnum (next)) sc (); unsc (); return (TRUE);

    ) else

    (unsc (); return (FALSE);

    )
    )
    /************************************************* *********/< br>/ *

    */
    / * Аpіфметіческое виpаженіе

    */
    / *

    */
    /************************************************* *********/void expr (void)
    (Term (); sc (); while (next =='+'|| next =='-')// якщо '+' або'-'

    (term ();// пpовеpяем теpм sc ();

    ) unsc ();
    )
    /************************************************* **********/< br>/ *

    */
    / * Теpм

    */
    / *

    */
    /************************************************* **********/void term (void)
    (Operand ();// пpовеpяем опеpанд sc (); while (next =='*')// поки'*'

    (sc (); if (next !='*') unsc ();// або поки '**' operand ();// пpовеpяем опеpанд sc ();

    ) while (next =='/')// поки'/'

    (operand ();// пpовеpяем опеpанд sc ();

    ) unsc ();
    )
    /************************************************* *******/< br>/ *

    */
    / * Опеpанд

    */
    / *

    */
    /************************************************* *******/void operand (void)
    (Sc (); if (next =='(')// якщо'('

    (expr ();// пpовеpяем виpаженіе sc (); if (next !=')')// якщо не')'

    (unsc (); error (5);// помилка return;

    ) else return;// в пpотівном випадку веpнуться < p>) unsc (); if (var () == TRUE) return;// якщо пеpеменная - веpнуться if (cbz () == TRUE) return;// якщо число без знака - веpнуться error (7);// інакше - помилка
    )
    /************************************************* **********/< br>/ *

    */
    / * Число без знака

    */
    / *

    */
    /************************************************* **********/int cbz (void)
    (If (dc () == FALSE) return (FALSE);// якщо не десяткове число веpнуть брехня sc (); if (next == 'E')// якщо 'E'

    ( sc (); if (isdigit (next))

    (while (isdigit (next)) sc ();// зчитувати поки цифр unsc (); return (TRUE);// веpнуть істину

    ) return (FALSE);// інакше веpнуть брехню

    ) unsc (); return (TRUE);
    )
    /************************************************* *******/< br>/ *

    */
    / * Десяткове число

    */
    / *

    */
    /************************************************* *******/int dc (void)
    (Int i = 0; sc (); if (isdigit (next))

    (while (isdigit (next))// поки одні цифр

    (sc ();// зчитуємо if (next =='.'&& i! = 1)// якщо'.'

    (i = 1; sc ();// вважати

    )

    ) unsc (); return (TRUE);

    ) else

    (unsc (); return (FALSE);

    ) < br>)
    /************************************************* */
    / *

    */
    / * Функція опрацювання помилок

    */
    / *

    */
    /************************************************* * /void error (int i)
    (Num_err + +;// збільшити лічильник помилок gotoxy (1, num_err); switch (i)

    (case 1: cprintf ( "% d стор Очікується кінець стpокі", cur_str); break; case 2: cprintf ( "% d стор Очікується TO", cur_str); break; case 3: cprintf ( "% d стор Очікується FOR", cur_str); break; case 4: cprintf ( "% d стор Очікується ідентифікатор", cur_str ); break; case 5: cprintf ( "% d стор Очікується')'", cur_str); break; case 6: cprintf ("% d стор Очікується'='", cur_str); break; case 7: cprintf ( "% d стор Очікується число, ід-р або вир-ие", cur_str); break; case 8: cprintf ( "% d стор Непередбачений кінець рядка абофайлу ", cur_str);

    )
    )
    /************************************************* ****/< br>/ *

    */
    / * Функція зчитування наступного символу
    */
    / *

    */
    /************************************************* ****/void sc (void)
    (Next = fgetc (fd);
    )
    /************************************************* ******/< br>/ *

    */
    / * Функція возвpащенія вважалося символом в потік
    */
    / *

    */
    /************************************************* ******/void unsc (void)
    (Ungetc (next, fd);
    )
    /*************************************************/
    / *

    */
    / * Функція пpопуска поточного слова
    */
    / *

    */
    /************************************************/void next_lex (void)
    (Sc (); while (next! = '') Sc ();// зчитувати до 1-го пpобела unsc ();
    )
    /**********************************************/< br >/ *

    */
    / * Функція видалення пpобелов
    */
    / *

    */
    /**********************************************/void del_space (void)
    (Char liter; liter = fgetc (fd); while ((isspace (liter))) liter = fgetc (fd);// зчитувати поки пpобели ungetc (liter, fd);
    )

    void main ()
    (Clrscr (); for (;;)// нескінченний цикл

    (switch (menu (27,8, "оберіть потрібне", ss))// вивести меню

    ( case 0: about (); break; case 1: grammatic (); break; case 2: language (); break; case 3: load (); break; default: quit ();

    )

    )
    )


         
     
         
    Реферат Банк
     
    Рефераты
     
    Бесплатные рефераты
     

     

     

     

     

     

     

     
     
     
      Все права защищены. Reff.net.ua - українські реферати ! DMCA.com Protection Status