По соглашению в нашем языке допустимы инструкции ветвления и цикла со следующим синтаксисом:
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 в проекте.