}
else SintaxState = SinAnalizerState.Error;
}
else if (sTopStack == "=")
{
if (sLexeme == "=")
{
SintaxStack.Pop();
nLexNum++;
}
else SintaxState = SinAnalizerState.Error;
}
else if (sTopStack == "ID")
{
if (sClass == "Идентификатор")
{
SintaxStack.Pop();
nLexNum++;
}
else SintaxState = SinAnalizerState.Error;
}
else SintaxState = SinAnalizerState.Error;
if (SintaxState == SinAnalizerState.Error)
{
lSinProgress.Text = "ОШИБКА! Неправильный синтаксис";
lSinProgress.ForeColor = Color.Red;
}
else if (SintaxState == SinAnalizerState.Accept)
{
lSinProgress.Text = "Синтаксический анализ завершен успешно!";
lSinProgress.ForeColor = Color.Blue;
}
}
lSinProgress.Visible = true;
btnSintax.Enabled = false;
синтаксическийАнализToolStripMenuItem.Enabled = false;
}
Цель данного проекта: практическое применение теории формальных грамматик и теории автоматов для проектирования трансляторов.
Постановка задания: Спроектировать и построить лексический и синтаксический анализаторы для заданного формального языка программирования. Построить и реализовать в лексическом анализаторе распознаватель лексем с заданной структурой: Нагруженное дерево (один элемент дерева хранит один символ (букву входного алфавита) лексемы).
Учебный язык включает директиву using, функцию main(), описание переменных, констант, массива переменной длины, операторов присваивания, арифметические операции. За основу лексики, синтаксиса и семантики учебного языка принять стандарты языка программирования С#.
Рассмотренная регулярная грамматика может быть реализована автоматом с множеством состояний G: [S, I, C, E, R], где
S - состояние ожидания первого символа лексемы;
I - состояние ожидания символов идентификаторов: буквы, цифры;
С - состояние ожидания символов целой части числа;
E -состояние ошибки;
R - состояние допуска лексемы.
Автомат переходит в допустимое состояние R из состояний S, I, C по символу конца лексемы - пробел или разделительного знака. Автомат определен множеством перечисленных состояний, множеством правил [1, 2, … , 47] и множеством входных символов [00..9, A..Z, «–», «#», «(», «)», «*», «,», «.», «/», «:», «;», «{«, «}», «+», «=»], из которых символы подмножества [«–», «#», «(», «)», «*», «,», «/», «:», «;», «{«, «}», «+», «=»] являются одновременно разделительными символами и уникальными лексемами. Таблица переходов автомата распознавателя идентификаторов представлена ниже на таблице.
L | D | e | ||
S | I | E | S | Нач. состояние |
I | I | I | R | |
E | Ошибка | |||
R | Допустить |
Множества ВЫБОР: |
Формальная грамматика языка программирования:
Грамматика целевого символа:
( 1) <S> -> using <USING_LIST> <NEXT>
( 2) <S> -> public <CLASS> <NEXT>
( 3) <NEXT> -> ; <S>
( 4) <NEXT> -> e
Грамматика описания using:
( 5) <USING_LIST> -> ID <NEXT_USING>
( 6) <NEXT_USING> -> . <USING_LIST>
( 7) <NEXT_USING> -> e
Грамматика описания класса:
( 8) <CLASS> -> class ID { <CLASS_BODY> }
( 9) <CLASS_BODY> -> public <DEF> <NEXT_BODY>
(10) <NEXT_BODY> -> ; <CLASS_BODY>
(11) <NEXT_BODY> -> e
Грамматика описания определения полей и методов класса:
(12) <DEF> -> uint <DEF_LIST>
(13) <DEF> -> bool <DEF_LIST>
(14) <DEF> -> const long int <DEF_LIST>
(15) <DEF_LIST> -> ID <NEXT_DEF>
(16) <NEXT_DEF> -> ( <VAR_LIST> ) { <OPER_LIST> }
(17) <NEXT_DEF> -> , <VAR_LIST>
(18) <NEXT_DEF> -> = <EXPR> <VAR_LIST>
(19) <NEXT_DEF> -> e
(20) <VAR_LIST> -> ID <NEXT_VAR>
(21) <NEXT_VAR> -> , <VAR_LIST>
(22) <NEXT_VAR> -> = <EXPR> <VAR_LIST>
(23) <NEXT_VAR> -> e
Грамматика описания списка операторов:
(24) <OPER_LIST> -> <OPERATOR> <NEXT_OPER>
(25) <NEXT_OPER> -> ; <OPER_LIST>
(26) <NEXT_OPER> -> e
Грамматика описания операторов:
(27) <OPERATOR> -> for ( ID = <EXPR> ; <COND> ; ID <LET> ) { <OPER_LIST> }
(28) <OPERATOR> -> break
(29) <OPERATOR> -> continue
(30) <OPERATOR> -> write ( <VAR_LIST> )
(31) <OPERATOR> -> read ( <VAR_LIST> )
(32) <OPERATOR> -> ID <LET>
(33) <LET> -> = <EXPR>
(34) <LET> -> * = <EXPR>
(35) <LET> -> / = <EXPR>
Грамматика описания арифметического выражения:
(36) <EXPR> -> ( <EXPR> ) <OPERATION>
(37) <EXPR> -> ID <OPERATION>
(38) <EXPR> -> NUM <OPERATION>
(39) <OPERATION> -> + <EXPR>
(40) <OPERATION> -> - <EXPR>
(41) <OPERATION> -> e
Грамматика описания условия:
(42) <COND> -> ( <COND> ) <RELATION>
(43) <COND> -> <EXPR> <RELATION>
(44) <RELATION> -> > <COND>
(45) <RELATION> -> < <COND>
(46) <RELATION> -> = = <COND>
(47) <RELATION> -> e
/ | - | # | ( | ) | * | , | . | ; | { | } | + | < | = | > | bool | break | class | const | continue | for | ID | int | long | NUM | public | read | using | write |
# | Д | |||||||||||||||||||||||||||
( | В С | |||||||||||||||||||||||||||
) | В С | |||||||||||||||||||||||||||
; | В С | |||||||||||||||||||||||||||
{ | В С | |||||||||||||||||||||||||||
} | В С | |||||||||||||||||||||||||||
<CLASS_BODY> | З(9, 2) С | |||||||||||||||||||||||||||
<CLASS> | З(8, 2) С | |||||||||||||||||||||||||||
<COND> | З(42, 2) С | З(43, 1) | З(43, 1) | |||||||||||||||||||||||||
<DEF_LIST> | З(15, 2) С | |||||||||||||||||||||||||||
<DEF> | З(13, 2) С | З(14, 2) С | ||||||||||||||||||||||||||
<EXPR> | З(36, 2) С | З(37, 2) С | З(38, 2) С | |||||||||||||||||||||||||
<LET> | З(35, 2) С | З(34, 2) С | З(33, 2) С | |||||||||||||||||||||||||
<NEXT_BODY> | З(10, 2) С | В | ||||||||||||||||||||||||||
<NEXT_DEF> | З(16, 2) С | З(17, 2) С | В | З(18, 2) С | ||||||||||||||||||||||||
<NEXT_OPER> | З(25, 2) С | В | ||||||||||||||||||||||||||
<NEXT_USING> | З(6, 2) С | В | ||||||||||||||||||||||||||
<NEXT_VAR> | В | З(21, 2) С | В | З(22, 2) С | ||||||||||||||||||||||||
<NEXT> | В | З(3, 2) С | ||||||||||||||||||||||||||
<OPER_LIST> | В | З(24, 1) | З(24, 1) | З(24, 1) | З(24, 1) | З(24, 1) | З(24, 1) | |||||||||||||||||||||
<OPERATION> | З(40, 2) С | В | В | З(39, 2) С | В | В | В | |||||||||||||||||||||
<OPERATOR> | В С | В С | З(27, 2) С | З(32, 2) С | З(31, 2) С | З(30, 2) С | ||||||||||||||||||||||
<RELATION> | В | В | З(45, 2) С | З(46, 2) С | З(44, 2) С | |||||||||||||||||||||||
<S> | В | З(2, 2) С | З(1, 2) С | |||||||||||||||||||||||||
<USING_LIST> | З(5, 2) С | |||||||||||||||||||||||||||
<VAR_LIST> | В | З(20, 2) С | ||||||||||||||||||||||||||
= | В С | |||||||||||||||||||||||||||
ID | В С | |||||||||||||||||||||||||||
int | В С | |||||||||||||||||||||||||||
long | В С |