Існує конкуренція між «європейською школою» проектування мов, яка віддає перевагу LL граматикам, та «американською», яка частіше використовує LR-граматики. Це багато в чому завдяки традиціям викладання та детальному опису методів та інструментів в літературі. Інший вплив іде від досліджень Ніклауса Вірта в вищій технічній школі Цюріха, які описували багато способів оптимізації LL(1) мов, та компіляторів.
Аналізатор працює на рядках з певної контекстно вільної граматики.
Аналізатор складається з
· вхідного буфера, в якому зберігається вхідний рядок
· стека в якому зберігають термінальні та нетермінальні символи з граматики, що аналізується.
· таблицю аналізу яка каже яке ( якщо існує ) правило граматики застосувати залежно від символів на вершині стеку, та наступного вхідного токена.
Аналізатор застосовує правило з таблиці, яке відповідає символу на вершині стеку (рядок таблиці) та символу з вхідного потоку (стовпець).
2. Формальний опис вхідної мови програмування
2.1. Деталізований опис вхідної мови в термінах розширеної нотації Бекуса-Наура.
<program>::=PROGRAM<name>VAR<VAR_blok>START<code_blok>FINISH.
<VAR_blok> ::=<declarations> [{;<declarations>} ];.
<declarations>::=INT32_t<declaration_i> [{,<declaration_i>}] | BOOLEAN <declaration_b> [{,<declaration_b>}] .
.<declaration_i> ::= <ident> [ << <const_i>] .
<declaration_b> ::= <ident> [ << <const_b>] .
<ident> ::= <letter>[<l _or_n>].
<l_or_n> ::= <letter>|<number> .
<letter>::=a|b|c|d|e|f|g|h|i|j|k|l|n|m|o|p|q|r|s|t|u|v|w|x|y|z .
<number> ::= 0|1|2|3|4|5|6|7|8|9 .
<const_i> ::= [-]<number>[{number}] .
<const_b> ::=TRUE|FALSE
<code_blok> ::= <statement> [{<statement>}] .
<statement> ::= <equation>|<cycle>|<READ>|<WRITE> .
<equation> ::= <ident> [>> <expression_i>|<expression_b>]; .
<expression_i>::= <term> [{ADD <term> | SUB <term>}].
<term>::=<ident>|<const_i>|<factor>.
<factor>::=[{MUL <term> | DIV <term>| MOD <term> | <brackets>}].
<brackets>::=(<expression_i>).
<expression_b>::= <term_b> [{== <term_b> | != <term_b> | LE<term_b>| GE <term_b>}].
<term_b>::=<ident>|<const_b>|<factor_b>.
<factor_b>::=<term_b> [{ |<term_b> | <and> |<not>|<brackets_b>}].
<and>::= [{ &<term_b>}]
<not>::=!<factor_b>
<brackets_b>::=(<expression_b>).
<cycle> ::= WHILE (<expression_b>|<ident>) START <code_blok> FINISH.
<READ> ::= READ(<ident>); .
<WRITE> ::= WRITE(<expression_i>|<string>|<expression_b>); .
<string> ::= “<l_or_n>[{<l_or_n>}]” .
2.2. Термінальні символи та ключові слова.
PROGRAMM – початок тексту програми, наступним описується ім’я програми;
VAR - блок опису змінних;
START – початок тіла програми (циклу);
FINISH – кінець тіла програми (циклу);
WRITE– оператор виводу (змінних і рядкових констант)
READ – оператор вводу змінних;
>> - оператор присвоєння;
WHILE – початок умовного уиклу
DO – початок тіла умовного циклу
ADD – операція додавання
SUB – операція віднімання
MUL – операція множення
DIV – операція ділення
MOD – операція знаходження залишку від ділення;
= – операція перевірки на рівність;
<> – перевірка на нерівність;
LE – перевірка чи менше;
GE – перевірка чи більше/рівно;
! – операція логічного заперечення;
& – кон’юнкція;
| – диз’юнкція;
INT32_t – 32‑ох розрядні знакові цілі;
BOOLEAN – однобайтні логічні змінні;
$$ – рядковий коментар
“ – початок/завершення рядкової константи при операції виводу;
,– розділювач між деклараціями змінних;
; – ознака кінця оператора;
(– відкриваюча дужка;
) – закриваюча дужка;
Як термінальні символи використовуються також усі арабські цифри (0–9), латинські букви (a-z, A-Z), символи табуляції, символ переходу на нову стрічку, пробіл.
3. Розробка транслятора вхідної мови програмування
3.1. Вибір технології програмування.
Для виконання курсової роботи була вибрана об’єктно-орієнтована технологія програмування. Обєктно орієнтоване програмування (надалі ООП) - парадигма програмування, в якій основними концепціями є поняття об'єктів і класів.
Клас - це тип, що описує будову об'єктів. Поняття "клас" має на увазі деяка поведінка і спосіб представлення. Поняття "об'єкт" має на увазі щось, що має певну поведінку і спосіб представлення. Говорять, що об'єкт - це екземпляр класу. Клас можна порівняти з кресленням, згідно з яким створюються об'єкти. Зазвичай класи розробляють так, щоб їх об'єкти відповідали об'єктам предметної області.
Структура даних "клас" є об'єктним типом даних. При цьому елементи такої структури (члени класу) можуть самі бути не лише даними, але і методами (тобто процедурами або функціями). Таке об'єднання називається інкапсуляцією.
Наявність інкапсуляції достатня для объектности мови програмування, але ще не означає його об'єктної орієнтованості - для цього потрібно наявність наслідування.
Але навіть наявність інкапсуляції і наслідування не робить мову програмування повною мірою об'єктною з точки зору ООП. Основні переваги ООП проявляються тільки у тому випадку, коли в мові програмування реалізований поліморфізм.
Абстракція - це надання об'єкту характеристик, які відрізняють його від усіх інших об'єктів, чітко визначаючи його концептуальні межі. Основна ідея полягає в тому, щоб відокремити спосіб використання складених об'єктів даних від деталей їх реалізації у вигляді простіших об'єктів, подібно до того, як функціональна абстракція розділяє спосіб використання функції і деталей її реалізації в термінах примітивніших функцій, таким чином, дані обробляються функцією високого рівня за допомогою виклику функцій низького рівня.
Такий підхід є основою об'єктно-орієнтованого програмування. Це дозволяє працювати з об'єктами, не вдаючись особливо їх реалізації. У кожному конкретному випадку застосовується той або інший підхід: інкапсуляція, поліморфізм або наслідування. Наприклад, при необхідності звернутися до прихованих даних об'єкту, слід скористатися інкапсуляцією, створивши, так звану, функцію доступу або властивість.
Інкапсуляція - це принцип, згідно з яким будь-який клас повинен розглядатися як чорний ящик, - користувач класу повинен бачити і використовувати тільки інтерфейсну частину класу (т. е. список декларованих властивостей і методів класу) і не вникати в його внутрішню реалізацію. Тому дані прийнято інкапсулювати в класі так, щоб доступ до них по читанню або запису здійснювався не безпосередньо, а за допомогою методів. Принцип інкапсуляції (теоретично) дозволяє мінімізувати число зв'язків між класами і, відповідно, спростити незалежну реалізацію і модифікацію класів.
Приховання даних - невід'ємна частина ООП, що управляє зонами видимості. Є логічним продовженням інкапсуляції. Метою приховання є неможливість для користувача дізнатися або зіпсувати внутрішній стан об'єкту.
Наслідуванням називається можливість породжувати один клас від іншого із збереженням усіх властивостей і методів класу-предка (прародителя, іноді його називають суперкласом) і додаючи, при необхідності, нові властивості і методи. Набір класів, пов'язаних відношенням спадкоємства, називають ієрархією. Спадкоємство покликане відобразити таку властивість реального світу, як ієрархічність.
Поліморфізмом називають явище, при якому функції (методу) з одним і тим же ім'ям відповідає різний програмний код (поліморфний код) залежно від того, об'єкт якого класу використовується при виклику цього методу. Поліморфізм забезпечується тим, що в класі-нащадку змінюють реалізацію методу класу-предка з обов'язковим збереженням сигнатури методу. Це забезпечує збереження незмінним інтерфейсу класу-предка і дозволяє здійснити зв'язування імені методу в коді з різними класами - з об'єкту якого класу здійснюється виклик, з того класу і береться метод з цим ім'ям. Такий механізм називається динамічним (чи пізнім) зв'язуванням - на відміну від статичного (раннього) зв'язування, здійснюваного на етапі компіляції.
Концепція віртуальних методів з'явилася як засіб забезпечити виконання потрібних методів при використанні поліморфних змінних, тобто, по суті, як спроба розширити можливості виклику методів для реалізації частини функціональності, що забезпечується механізмом обробки повідомлень.
NET Framework 3.0 - це модель програмування керованого коду корпорації Microsoft. Вона є розширенням .NET Framework 2.0, яке об'єднує компоненти попередньої платформи з новими технологіями створення застосувань, що відрізняються привабливим призначеним для користувача інтерфейсом, надійними і безпечними засобами підключення і можливістю моделювання широкого ряду бізнес-процесів
Microsoft Windows Forms - це основна платформа розробки для створення інтелектуальних клієнтських застосувань. Класи Windows Forms, що містяться в .NET Framework, призначені для використання при створенні графічних інтерфейсів користувача. З їх допомогою можна легко створювати командні вікна, кнопки, меню, панелі інструментів і інші елементи.
3.2. Проектування таблиць транслятора.
Для реалізації лексичного аналізу створюємо таблицю, в яку поміщаємо всі лексеми (ArrayList lexems = new ArrayList()), і таблицю (Hashtable identy = new Hashtable()) для ідентифікаторів, які будуть введені користувачем. Ім’я програми в цю таблицю не заноситься. Для реалізації таблиці лексем описаний тнаступний клас Lexem:
id | lex | comment | type |
зберігання номера лексеми | зберігання лексеми | зберігання класу до якого належить лексема | зберігання коду лексеми |
public class Lexem
{
private int id=0;
private string lex = "";
private string comments = "";
private int type = 0;
public int Id
{ get { return id; }
set { id = value; } }
public int Type
{ get { return type; }
set { type = value; } }
public string Lex
{ get { return lex; }
set { lex = value; }}
public string Comments
{ get { return comments; }
set { comments = value; }}
}
Сама таблиця лексем є масивом таких структур.