lign="justify"> Лексичний аналізатор необхідно реалізувати вручну - без використання спеціальних засобів типу lex/flex/jlex, і функцій типу scanf.
Лексичний аналізатор повинен видаляти з вхідного рядка прогалини, і передавати синтаксичному аналізатору (парсеру) лексеми по одній. Крім всіх інших лексем він повинен розпізнавати цілі числа. Якщо в ході лексичного розбору була виявлена ??помилка, необхідно видати виразне повідомлення про помилку з вказівкою місця виявлення помилки у вихідному тексті (номер рядка і, бажано, номера стовпчика).
Синтаксичний аналізатор (парсер)
Синтаксичний аналізатор необхідно реалізувати вручну - без використання спеціальних засобів типу yacc/bison/cup. Його потрібно реалізувати як предіктивне синтаксичний аналізатор. На вхід парсера надходять лексеми з виходу сканера, на виході парсера виходить проміжний код. Якщо в ході синтаксичного розбору була виявлена ??помилка, необхідно видати виразне повідомлення про помилку з вказівкою місця виявлення помилки у вихідному тексті (номер рядка і, бажано, номера стовпчика).
Граматика вхідної мови
lt; CompileProgram gt; ::= lt; Vars gt; lt; BeginEndStruct gt;
lt; Vars gt; ::={Define lt; Ім'я змінної gt ;: lt; Тип змінної gt ;;}
lt; Ім'я змінної gt; ::= lt; Буква gt; { lt; Буква gt; | Lt; Цифра gt;}
lt; Буква gt; ::=a | b | c | ... | z | A | B | C | ... | Z
lt; Цифра gt; ::=0 | 1 | 2 | ... | 9
lt; Тип змінної gt; ::= lt; Тип gt; | Lt; Тип gt; [ lt; цифра gt;]
lt; Тип gt; ::=byte | word | integer | char
lt; BeginEndStruct gt; ::=begin lt; CommandVerify gt; end.
lt; CommandVerify gt; ::= lt; Ім'я змінної gt;= lt; ProcedureE gt; | Lt; ProcedureE gt; lt; Знак gt; lt; ProcedureE gt; then lt; CommandVerify gt;
{else lt; CommandVerify gt;} | lt; Ім'я змінної gt;= lt; ProcedureE gt; do lt; CommandVerify gt; | Lt; CommandVerify gt; Until lt; ProcedureE gt; lt; Знак gt; lt; ProcedureE gt; | ( lt; ProcedureE gt;) | WriteWord ( lt; ProcedureE gt;) | ( lt; Символ gt;, Ln)
lt; ProcedureE gt; ::= lt; ProcedureT gt; {+ | - lt; ProcedureT gt;}
lt; ProcedureT gt; ::= lt; ProcedureF gt; {* |/ Lt; ProcedureF gt;}
lt; ProcedureF gt; ::=( lt; ProcedureE gt;) | lt; Цифра gt; | Lt; Ім'я змінної gt; | Wait |
lt; Ім'я змінної gt; [ lt; Цифра gt;]
lt; Знак порівняння gt; :: gt; | Lt; |=
lt; Символ gt; ::={ lt; Буква gt;} | { lt; Цифра gt;} | { lt; Знак gt;}
Технічний проект. Загальні відомості
Проект складається з 3х частин:
Сервер автоматизації
Клієнт автоматизації
Компілятор
Сервер автоматизації запускає компілятор, на вхід якого подає вихідний код програми, отриманої від клієнта.
Після компіляції, отримуємо виконуваний файл в локальному каталозі, з якого була запущена програма.
Структура вхідних і вихідних даних.
На вхід компілятора подається вихідний код програми, написаний на стороні клієнта на мові, що представляє собою підмножина мови Pascal, граматика якого описана в цій пояснювальній записці.
На виході компілятора отримаємо ісполняемий файл.
Алгоритми обробки даних
Алгоритм роботи компілятора:
. Читання компилируемого файлу
. Ініціалізація змінних
. Компілювання
. 1.Чтеніе слова з масиву
. 1.1.Чітаем символ
. 1.2.Запісиваем в рядок символ
. 1.3.Переход на 3.1.1, якщо не пробіл або НЕ коментар.
. 2.Якщо Define
. 2.1.Проверка записи змінної
. 2.2.Запісиваем змінну в таблицю
. 3.Якщо Begin
. 3.1.Расспознаваніе блоку
. 3.1.1.Еслі слово WriteInteger
. 3.1.1.1.Компілірованіе параметра
. 3.1.1.2.Прі помилку вивід повідомлення
. 3.1.1.3.Формірованіе коду
. 3.1.1.4.Переход на 3.3.2.
. 3.1.2.Еслі слово WriteWord
...