Синтаксический анализатор языка Why довольно прост, так как предельно проста сама грамматика Why. Это единственный модуль компилятора, написанный без использования объектов, однако он так хорошо структурирован, что можно просто переписать все процедуры, сделав их методами какого-нибудь объекта TWhySyntax, без всяких изменений.
Модуль синтаксического анализатора экспортирует всего две процедуры: CompileProgram и Error. Процедура Error экспортируется только для того, чтобы аварийный останов и выдачу сообщений об ошибке можно было сделать на этапе лексического анализа (такое возможно, например, при наличии незакрытых комментариев или строковых констант в компилируемом тексте).
Между грамматикой языка Why и процедурами анализатора существует взаимно однозначное соответствие, поэтому в тексте модуля для каждой процедуры указано в комментарии имя исходного правила грамматики.
Грамматика языка WhyProgram ::= [ Imports ] { GlobalVariableDefinition | Definition } Imports ::= "imports" { Identifier } GlobalVariableDefinition ::= TypeName { Identifier [ "[" IntegerConstant "]" ] } ";" TypeName ::= "int" | "string" Definition ::= ":" Identifier Sequence ";" Sequence ::= { Element } Element ::= Constant | Operation | ProcedureCall | VariableDefinition | AsmStatement | BeginStatement | DowntoLoopStatement | IfStatement | InlineStatement | RepeatStatement | SimpleStatement | ToLoopStatement | Pragma Operation ::= "+" | "-" | "*" | "/" | "%" | ">" | "<" | ">=" | "<=" | "<>" | "!=" | "==" | "||" | "&&" | "!" | "|" | "&" | "~" | "<-" | "->" | "<." | ".>" | "[]" | "++" | "--" | "<<" | ">>" | "<+>" | "<->" | "<*>" | ">" | "<%>" | "<++>" | "<-->" | "" | "<~>" ProcedureCall ::= Identifier VariableDefinition ::= TypeName { Identifier [ "[" IntegerConstant "]" ] } ";" AsmStatement ::= "asm" { ( "\0" | ... | ';' - 1 | ';' + 1 | "\255" ) } ";" BeginStatement ::= "begin" Sequence ( "while" | "until" ) Sequence "loop" DowntoLoopStatement ::= "downto" Sequence "loop" IfStatement ::= "if" Sequence [ "else" Sequence ] "then" InlineStatement ::= "inline" { IntegerConstant } ";" RepeatStatement ::= "repeat" Sequence ( "until" | "while" ); SimpleStatement ::= "drop" | "dup" | "rot" | "swap" ToLoopStatement ::= "to" Sequence "loop" Pragma ::= "pragma" { Setting } ";" Setting ::= Identifier StringConstant
Copyright © Алексей Яковлев,
АВМ-008, факультет АТС, РГУПС.
Моя домашняя страничка:
http://www.yallie.narod.ru.