Схема разбора инструкций ветвления и цикла

По соглашению в нашем языке допустимы инструкции ветвления и цикла со следующим синтаксисом:

1) ветвление:

if(условное выражение) then

...последовательность операторов...

[elseif(условное выражение) then

...последовательность операторов...]

[else

...последовательность операторов...]

endif

2) цикл:

while(условное выражение)

...последовательность операторов...

endwhile

В первую очередь, дополним метод разобратьВыражение() синтаксического анализатора разбором логических выражений.

tType разобратьВыражение()

{

tType t = разобратьСложениеИлиВычитание();

если(LexicalAnalyzer.текущаяЛексема == Lexems.Равно

|| LexicalAnalyzer.текущаяЛексема == Lexems.НеРавно

|| LexicalAnalyzer.текущаяЛексема == Lexems.Меньше

|| LexicalAnalyzer.текущаяЛексема == Lexems.Больше

|| LexicalAnalyzer.текущаяЛексема == Lexems.МеньшеИлиРавно

|| LexicalAnalyzer.текущаяЛексема == Lexems.БольшеИлиРавно)

{

switch(LexicalAnalyzer.текущаяЛексема)

{

}

LexicalAnalyzer.разобратьСледующуюЛексему();

разобратьСложениеИлиВычитание();

t = tType.Bool;

}

вернуть t;

}

Далее реализуем методы разобратьВетвление() и разобратьЦикл().

разобратьВетвление()

{

проверитьЛексему(Lexems.If);

разобратьВыражение();

проверитьЛексему(Lexems.Then);

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

пока(LexicalAnalyzer.текущаяЛексема == Lexems.ElseIf)

{

LexicalAnalyzer.разобратьСледующуюЛексему();

разобратьВыражение();

проверитьЛексему(Lexems.Then);

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

}

если(LexicalAnalyzer.текущаяЛексема == Lexems.Else)

{

LexicalAnalyzer.разобратьСледующуюЛексему();

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

}

проверитьЛексему(Lexems.EndIf);

}

разобратьЦикл()

{

проверитьЛексему(Lexems.While);

разобратьВыражение();

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

проверитьЛексему(Lexems.While);

}

И, наконец, дополним метод разобратьИнструкцию() вызовом соответствующих методов в нужных случаях.

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

{

если(LexicalAnalyzer.текущаяЛексема == Lexems. Идентификатор)

{

Идентификатор Х = NameTable.найтиПоИмени(LexicalAnalyzer.текущееИмя);

если(!Х. эквивалентно(новый Идентификатор()))

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

иначе

ошибка();

}

иначе если(LexicalAnalyzer.текущаяЛексема == Lexems.ВыводНаПечать)

разобратьИнструкциюВыводаНаПечать();

иначе если(LexicalAnalyzer.текущаяЛексема == Lexems.If)

разобратьВетвление();

иначе если(LexicalAnalyzer.текущаяЛексема == Lexems.While)

разобратьЦикл();

}

Замечания по коду:

1) Проверку соответствия типов при разборе выражений необходимо реализовать самостоятельно;

2) Разбор других видов цикла (for, do…while) реализуется аналогично.

Примеры кода:

Файлы SyntaxAnalyzer.cs в проекте.


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



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