
- •Лексический анализатор………………………………………………………….…..11
- •Синтаксический анализатор…………………………………………….……………15
- •Генератор кода………………………………………………………………..………..18
- •Теоретическая часть.
- •Транслятор.
- •Лексический анализатор.
- •Синтаксический анализатор.
- •1.4 Генератор кода.
- •Практическая часть.
- •2.1 Синтаксис языка в бнф. Терминалы, нетерминалы, начальный символ и правила.
- •2.2 Каркас транслятора.
- •2.3 Лексический анализатор.
- •2.3 Синтаксический анализатор.
- •2.4 Генератор кода.
- •Тестирование приложения.
-
Практическая часть.
2.1 Синтаксис языка в бнф. Терминалы, нетерминалы, начальный символ и правила.
Вариант задания:
<Программа> ::= <Объявление переменных> <Описание вычислений> <Описание вычислений> ::= Begin <Список присваиваний> End <Объявление переменных> ::= Int <Список переменных> |
Int <Список переменных> <Объявление переменных>
<Список переменных> ::= <Идент>; | <Идент> , <Список переменных> <Список присваиваний>::= <Присваивание> |
<Присваивание> <Список присваиваний> <Присваивание> ::= <Идент> := <Выражение> ;
<Выражение> ::= <Ун.оп.> <Подвыражение> | <Подвыражение> <Подвыражение> :: = ( <Выражение> ) | <Операнд> |
< Подвыражение > <Бин.оп.> <Подвыражение>
<Ун.оп.> ::= "-"
<Бин.оп.> ::= "-" | "+" | "*" | "/"
<Операнд> ::= <Идент> | <Const>
<Идент> ::= <Буква> <Идент> | <Буква>
<Const> ::= <Цифра> <Const> | <Цифра>
Форма Бекуса – Наура – набор правил, последовательным применением которых можно построить любое предложение.
Грамматика определяется, как следующая четверка Vt – алфавит, символы которого называются терминалами из них строятся цепочки порождаемые грамматикой; Vn – алфавит, символы которого называется нетерминальными (не терминалами), используются при построении цепочек. P – Набор правил, по которым строится грамматика; S – начальное правило.
Нетерминалы:
N= {
S=<Программа>
D=<Объявление переменных>
F=<Описание вычислений>
P=<Оператор печати>
V=<Список переменных>
I=<Идентификатор>
G=<Список присваиваний>
A=<Присваивание>
E=<Выражение>
H=<Подвыражение>
O=<Операнд>
C=<Const>
N=<Цифра>
}
Терминалы:
Ключевые слова языка:
T={begin, end, integer, print}
Разделители:
R={:=, .();}
Алфавит:
A={a|…|z}
Бинарные операции:
B={+|-|/|*}
Унарная опреация:
U={-}
Цифры:
C={0|…|9}
Правила:
-
S=DF
-
F=begin G end
-
G=A
-
G=AG
-
A=I:=E
-
I=LI
-
I=L
-
E=UH
-
E=H
-
H=(E)
-
H=O
-
H= HBH
-
O=I
-
O=C
-
C=NC
-
C=N
-
D=integer V
-
V=I;
-
V=I,V
-
P=print I
2.2 Каркас транслятора.
Как правило, транслятор состоит из основных функциональных блоков, к которым относятся парсер файлов исходного языка, таблица идентификаторов, лексический анализатор, синтаксический анализатор и генератор кода.
Создадим классы и перечисления необходимые в дальнейшем для реализации всех частей транслятора:
/// <summary>
/// Парсер
/// </summary>
public static class Reader
/// <summary>
/// Лексический анализатор
/// </summary>
public static class LexicalAnalyzer
/// <summary>
/// Лексемы
/// </summary>
public enum Lexems
{
None, Name, Number, Begin, End, Multiplication, Division,
Plus, Minus, Equal, NotEqual, Less, LessOrEqual, More, MoreOrEqual, Int,
Print, LeftBracket, RightBracket, Semi, Comma, EOF, Determine,
LongInt, Until, Do, EndUntil
}
/// <summary>
/// Ключевое слово
/// </summary>
internal struct KeyWord
{
public string word;
public Lexems lex;
}
/// <summary>
/// Категория
/// </summary>
public enum tCat
{
Const, Var, Type
}
/// <summary>
/// Тип
/// </summary>
public enum tType
{
None, Int, LInt, Bool
}
/// <summary>
/// Идентификатор
/// </summary>
public struct Identificator
{
public string name;
public tCat category;
public tType type;
}
/// <summary>
/// Таблица имен
/// </summary>
public static class NameTable
/// <summary>
/// Синтаксический анализатор
/// </summary>
public static class SyntaxAnalyzer
/// <summary>
/// Генератор постфиксной записи
/// </summary>
public static class PostFix
/// <summary>
/// Генератор кода
/// </summary>
public static class CodeGenerator
Дальше создаем необходимый для удобной работы интерфейс (рис.1), с верхним меню:
Рис.1 Интерфейс приложения