Общая схема разбора. Разбор инструкции присваивания

В ходе прошлой лабораторной работы был реализован синтаксический разбор секции объявления переменных для синтаксиса исходного языка. Следующий этап - разбор секции кода. Логичнее (и проще всего) представить блок кода как последовательность инструкций, разделенных переносом строки. Метод разобратьПоследовательностьИнструкций() в синтаксическом анализаторе будет обеспечивать необходимый функционал.

разобратьПоследовательностьИнструкций ()

{

разобратьИнструкцию();

пока(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. Синтаксический анализатор.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: