В ходе прошлой лабораторной работы был реализован синтаксический разбор секции объявления переменных для синтаксиса исходного языка. Следующий этап - разбор секции кода. Логичнее (и проще всего) представить блок кода как последовательность инструкций, разделенных переносом строки. Метод разобратьПоследовательностьИнструкций() в синтаксическом анализаторе будет обеспечивать необходимый функционал.
разобратьПоследовательностьИнструкций ()
{
разобратьИнструкцию();
пока(LexicalAnalyzer.текущаяЛексема == Lexems.Разделитель)
{
LexicalAnalyzer.разобратьСледующуюЛексему();
разобратьИнструкцию ();
}
}
Метод разобратьИнструкцию() будет реализовывать разбор одной строки исходного кода. На текущем этапе разработки синтаксического анализатора основной целью является разбор инструкции присваивания.
разобратьИнструкцию()
{
если(LexicalAnalyzer.текущаяЛексема == Lexems. Идентификатор)
{
Идентификатор Х = NameTable.найтиПоИмени(LexicalAnalyzer.текущееИмя);
если(!Х. эквивалентно(новый Идентификатор()))
|
|
разобратьИнструкциюПрисваивания();
иначе
ошибка();
}
}
разобратьИнструкциюПрисваивания()
{
LexicalAnalyzer.разобратьСледующуюЛексему();
если(LexicalAnalyzer.текущаяЛексема == Lexems.Присваивание)
{
LexicalAnalyzer.разобратьСледующуюЛексему();
разобратьВыражение();
}
иначе
ошибка();
}
Метод разобратьВыражение() будет реализован в ходе следующей лабораторной работы. Пока оставим для него заглушку.
tType разобратьВыражение()
{
пока(LexicalAnalyzer.текущаяЛексема!= Lexems.Разделитель)
LexicalAnalyzer.разобратьСледующуюЛексему();
вернуть tType.Int;
}
Также необходимо доработать метод компилировать(), используя в нем реализованный функционал.
компилировать()
{
LexicalAnalyzer.инициализировать();
разобратьОбъявлениеПеременных();
проверитьЛексему(Lexems.ПереносСтроки);
если(LexicalAnalyzer.текущаяЛексема == Lexems.Begin)
LexicalAnalyzer.разобратьСледующуюЛексему();
LexicalAnalyzer.разобратьСледующуюЛексему();
LexicalAnalyzer. разобратьПоследовательностьИнструкций();
проверитьЛексему(Lexems.End);
}
Тестирование описанного функционала можно провести, вызывая метод SyntaxAnalyzer.компилировать() для разных (в том числе некорректных) вариантов секции кода.
Примеры кода:
Файл SyntaxAnalyzer.cs в проекте.
Лабораторная работа № 7.
Лабораторная работа №3.3. Синтаксический анализатор.