start[Program] = Program top └─ Program = 'program' Id ";" ConstDecl* VarDecl* SubProgDecl* CompoundStatement "." ├─ Id = ([0-9A-Z_a-z] !<< [A-Za-z] [0-9A-Z_a-z]* !>> [0-9A-Z_a-z]) \ Reserved │ └─ ([0-9A-Z_a-z] !<< [A-Za-z] [0-9A-Z_a-z]* !>> [0-9A-Z_a-z]) │ ├─ r │ └─ [0-9A-Z_a-z]* │ ├─ o │ ├─ b │ ├─ i │ └─ n ├─ ConstDecl* │ ├─ ConstDecl = 'const' Id "=" Number ";" │ │ ├─ Id = ([0-9A-Z_a-z] !<< [A-Za-z] [0-9A-Z_a-z]* !>> [0-9A-Z_a-z]) \ Reserved │ │ │ └─ ([0-9A-Z_a-z] !<< [A-Za-z] [0-9A-Z_a-z]* !>> [0-9A-Z_a-z]) │ │ │ ├─ c │ │ │ └─ [0-9A-Z_a-z]* │ │ │ ├─ o │ │ │ ├─ v │ │ │ ├─ e │ │ │ └─ r │ │ └─ Number = Digit+ │ │ └─ Digit+ │ │ └─ Digit = [0-9] │ │ └─ 1 │ ├─ ConstDecl = 'const' Id "=" Number ";" │ │ ├─ Id = ([0-9A-Z_a-z] !<< [A-Za-z] [0-9A-Z_a-z]* !>> [0-9A-Z_a-z]) \ Reserved │ │ │ └─ ([0-9A-Z_a-z] !<< [A-Za-z] [0-9A-Z_a-z]* !>> [0-9A-Z_a-z]) │ │ │ ├─ r │ │ │ └─ [0-9A-Z_a-z]* │ │ │ ├─ o │ │ │ ├─ b │ │ │ ├─ i │ │ │ ├─ n │ │ │ ├─ s │ │ │ ├─ _ │ │ │ ├─ s │ │ │ ├─ k │ │ │ ├─ i │ │ │ ├─ l │ │ │ └─ l │ │ └─ Number = Digit+ │ │ └─ Digit+ │ │ └─ Digit = [0-9] │ │ └─ 0 │ └─ ConstDecl = 'const' Id "=" Number ";" │ ├─ Id = ([0-9A-Z_a-z] !<< [A-Za-z] [0-9A-Z_a-z]* !>> [0-9A-Z_a-z]) \ Reserved │ │ └─ ([0-9A-Z_a-z] !<< [A-Za-z] [0-9A-Z_a-z]* !>> [0-9A-Z_a-z]) │ │ ├─ d │ │ └─ [0-9A-Z_a-z]* │ │ ├─ o │ │ ├─ g │ │ ├─ u │ │ ├─ k │ │ ├─ a │ │ └─ n │ └─ Number = Digit+ │ └─ Digit+ │ └─ Digit = [0-9] │ └─ 2 ├─ VarDecl* │ └─ VarDecl = 'var' IdList ":" TypeSpec ";" │ ├─ IdList = Id ("," Id)* │ │ ├─ Id = ([0-9A-Z_a-z] !<< [A-Za-z] [0-9A-Z_a-z]* !>> [0-9A-Z_a-z]) \ Reserved │ │ │ └─ ([0-9A-Z_a-z] !<< [A-Za-z] [0-9A-Z_a-z]* !>> [0-9A-Z_a-z]) │ │ │ ├─ p │ │ │ └─ [0-9A-Z_a-z]* │ │ │ ├─ l │ │ │ ├─ a │ │ │ ├─ y │ │ │ ├─ e │ │ │ └─ r │ │ └─ ("," Id)* │ └─ TypeSpec = BasicType │ └─ BasicType = 'integer' ├─ SubProgDecl* │ └─ SubProgDecl = 'procedure' Id Parameters? ";" VarDecl* CompoundStatement ";" │ ├─ Id = ([0-9A-Z_a-z] !<< [A-Za-z] [0-9A-Z_a-z]* !>> [0-9A-Z_a-z]) \ Reserved │ │ └─ ([0-9A-Z_a-z] !<< [A-Za-z] [0-9A-Z_a-z]* !>> [0-9A-Z_a-z]) │ │ ├─ s │ │ └─ [0-9A-Z_a-z]* │ │ ├─ m │ │ ├─ a │ │ ├─ s │ │ └─ h │ ├─ Parameters? │ │ └─ Parameters = "(" ParameterList ")" │ │ └─ ParameterList = ParamList (";" ParamList)* │ │ ├─ ParamList = 'var'? IdList ":" TypeSpec │ │ │ ├─ 'var'? │ │ │ ├─ IdList = Id ("," Id)* │ │ │ │ ├─ Id = ([0-9A-Z_a-z] !<< [A-Za-z] [0-9A-Z_a-z]* !>> [0-9A-Z_a-z]) \ Reserved │ │ │ │ │ └─ ([0-9A-Z_a-z] !<< [A-Za-z] [0-9A-Z_a-z]* !>> [0-9A-Z_a-z]) │ │ │ │ │ ├─ a │ │ │ │ │ └─ [0-9A-Z_a-z]* │ │ │ │ │ └─ t │ │ │ │ └─ ("," Id)* │ │ │ └─ TypeSpec = BasicType │ │ │ └─ BasicType = 'integer' │ │ └─ (";" ParamList)* │ │ └─ (";" ParamList) │ │ └─ ParamList = 'var'? IdList ":" TypeSpec │ │ ├─ 'var'? │ │ ├─ IdList = Id ("," Id)* │ │ │ ├─ Id = ([0-9A-Z_a-z] !<< [A-Za-z] [0-9A-Z_a-z]* !>> [0-9A-Z_a-z]) \ Reserved │ │ │ │ └─ ([0-9A-Z_a-z] !<< [A-Za-z] [0-9A-Z_a-z]* !>> [0-9A-Z_a-z]) │ │ │ │ ├─ o │ │ │ │ └─ [0-9A-Z_a-z]* │ │ │ │ ├─ p │ │ │ │ ├─ p │ │ │ │ ├─ o │ │ │ │ ├─ n │ │ │ │ ├─ e │ │ │ │ ├─ n │ │ │ │ ├─ t │ │ │ │ ├─ s │ │ │ │ ├─ _ │ │ │ │ ├─ s │ │ │ │ ├─ k │ │ │ │ ├─ i │ │ │ │ ├─ l │ │ │ │ └─ l │ │ │ └─ ("," Id)* │ │ └─ TypeSpec = BasicType │ │ └─ BasicType = 'integer' │ ├─ VarDecl* │ └─ CompoundStatement = 'begin' StatementList? 'end' │ └─ StatementList? │ └─ StatementList = Statement (";" Statement)* │ ├─ Statement = 'if' Guard 'then' Statement 'else' Statement │ │ ├─ Guard = "(" Guard ")" │ │ │ └─ Guard = Expr Relop Expr │ │ │ ├─ Expr = Id │ │ │ │ └─ Id = ([0-9A-Z_a-z] !<< [A-Za-z] [0-9A-Z_a-z]* !>> [0-9A-Z_a-z]) \ Reserved │ │ │ │ └─ ([0-9A-Z_a-z] !<< [A-Za-z] [0-9A-Z_a-z]* !>> [0-9A-Z_a-z]) │ │ │ │ ├─ r │ │ │ │ └─ [0-9A-Z_a-z]* │ │ │ │ ├─ o │ │ │ │ ├─ b │ │ │ │ ├─ i │ │ │ │ ├─ n │ │ │ │ ├─ s │ │ │ │ ├─ _ │ │ │ │ ├─ s │ │ │ │ ├─ k │ │ │ │ ├─ i │ │ │ │ ├─ l │ │ │ │ └─ l │ │ │ ├─ Relop = ">" │ │ │ └─ Expr = Id │ │ │ └─ Id = ([0-9A-Z_a-z] !<< [A-Za-z] [0-9A-Z_a-z]* !>> [0-9A-Z_a-z]) \ Reserved │ │ │ └─ ([0-9A-Z_a-z] !<< [A-Za-z] [0-9A-Z_a-z]* !>> [0-9A-Z_a-z]) │ │ │ ├─ o │ │ │ └─ [0-9A-Z_a-z]* │ │ │ ├─ p │ │ │ ├─ p │ │ │ ├─ o │ │ │ ├─ n │ │ │ ├─ e │ │ │ ├─ n │ │ │ ├─ t │ │ │ ├─ s │ │ │ ├─ _ │ │ │ ├─ s │ │ │ ├─ k │ │ │ ├─ i │ │ │ ├─ l │ │ │ └─ l │ │ ├─ Statement = SubProgCall │ │ │ └─ SubProgCall = 'writeln' "(" ExprList ")" │ │ │ └─ ExprList = Expr ("," Expr)* │ │ │ ├─ Expr = Number │ │ │ │ └─ Number = Digit+ │ │ │ │ └─ Digit+ │ │ │ │ └─ Digit = [0-9] │ │ │ │ └─ 1 │ │ │ └─ ("," Expr)* │ │ └─ Statement = 'if' Guard 'then' Statement 'else' Statement │ │ ├─ Guard = "(" Guard ")" │ │ │ └─ Guard = Expr Relop Expr │ │ │ ├─ Expr = Id │ │ │ │ └─ Id = ([0-9A-Z_a-z] !<< [A-Za-z] [0-9A-Z_a-z]* !>> [0-9A-Z_a-z]) \ Reserved │ │ │ │ └─ ([0-9A-Z_a-z] !<< [A-Za-z] [0-9A-Z_a-z]* !>> [0-9A-Z_a-z]) │ │ │ │ ├─ r │ │ │ │ └─ [0-9A-Z_a-z]* │ │ │ │ ├─ o │ │ │ │ ├─ b │ │ │ │ ├─ i │ │ │ │ ├─ n │ │ │ │ ├─ s │ │ │ │ ├─ _ │ │ │ │ ├─ s │ │ │ │ ├─ k │ │ │ │ ├─ i │ │ │ │ ├─ l │ │ │ │ └─ l │ │ │ ├─ Relop = "=" │ │ │ └─ Expr = Id │ │ │ └─ Id = ([0-9A-Z_a-z] !<< [A-Za-z] [0-9A-Z_a-z]* !>> [0-9A-Z_a-z]) \ Reserved │ │ │ └─ ([0-9A-Z_a-z] !<< [A-Za-z] [0-9A-Z_a-z]* !>> [0-9A-Z_a-z]) │ │ │ ├─ o │ │ │ └─ [0-9A-Z_a-z]* │ │ │ ├─ p │ │ │ ├─ p │ │ │ ├─ o │ │ │ ├─ n │ │ │ ├─ e │ │ │ ├─ n │ │ │ ├─ t │ │ │ ├─ s │ │ │ ├─ _ │ │ │ ├─ s │ │ │ ├─ k │ │ │ ├─ i │ │ │ ├─ l │ │ │ └─ l │ │ ├─ Statement = SubProgCall │ │ │ └─ SubProgCall = 'writeln' "(" ExprList ")" │ │ │ └─ ExprList = Expr ("," Expr)* │ │ │ ├─ Expr = Number │ │ │ │ └─ Number = Digit+ │ │ │ │ └─ Digit+ │ │ │ │ └─ Digit = [0-9] │ │ │ │ └─ 0 │ │ │ └─ ("," Expr)* │ │ └─ Statement = SubProgCall │ │ └─ SubProgCall = 'writeln' "(" ExprList ")" │ │ └─ ExprList = Expr ("," Expr)* │ │ ├─ Expr = "-" Expr │ │ │ └─ Expr = Number │ │ │ └─ Number = Digit+ │ │ │ └─ Digit+ │ │ │ └─ Digit = [0-9] │ │ │ └─ 1 │ │ └─ ("," Expr)* │ └─ (";" Statement)* └─ CompoundStatement = 'begin' StatementList? 'end' └─ StatementList? └─ StatementList = Statement (";" Statement)* ├─ Statement = Lhs ":=" Expr │ ├─ Lhs = Id ("[" Expr "]")? │ │ ├─ Id = ([0-9A-Z_a-z] !<< [A-Za-z] [0-9A-Z_a-z]* !>> [0-9A-Z_a-z]) \ Reserved │ │ │ └─ ([0-9A-Z_a-z] !<< [A-Za-z] [0-9A-Z_a-z]* !>> [0-9A-Z_a-z]) │ │ │ ├─ p │ │ │ └─ [0-9A-Z_a-z]* │ │ │ ├─ l │ │ │ ├─ a │ │ │ ├─ y │ │ │ ├─ e │ │ │ └─ r │ │ └─ ("[" Expr "]")? │ └─ Expr = Id │ └─ Id = ([0-9A-Z_a-z] !<< [A-Za-z] [0-9A-Z_a-z]* !>> [0-9A-Z_a-z]) \ Reserved │ └─ ([0-9A-Z_a-z] !<< [A-Za-z] [0-9A-Z_a-z]* !>> [0-9A-Z_a-z]) │ ├─ d │ └─ [0-9A-Z_a-z]* │ ├─ o │ ├─ g │ ├─ u │ ├─ k │ ├─ a │ └─ n └─ (";" Statement)* └─ (";" Statement) └─ Statement = SubProgCall └─ SubProgCall = Id ("(" ExprList ")")? ├─ Id = ([0-9A-Z_a-z] !<< [A-Za-z] [0-9A-Z_a-z]* !>> [0-9A-Z_a-z]) \ Reserved │ └─ ([0-9A-Z_a-z] !<< [A-Za-z] [0-9A-Z_a-z]* !>> [0-9A-Z_a-z]) │ ├─ s │ └─ [0-9A-Z_a-z]* │ ├─ m │ ├─ a │ ├─ s │ └─ h └─ ("(" ExprList ")")? └─ ("(" ExprList ")") └─ ExprList = Expr ("," Expr)* ├─ Expr = Id │ └─ Id = ([0-9A-Z_a-z] !<< [A-Za-z] [0-9A-Z_a-z]* !>> [0-9A-Z_a-z]) \ Reserved │ └─ ([0-9A-Z_a-z] !<< [A-Za-z] [0-9A-Z_a-z]* !>> [0-9A-Z_a-z]) │ ├─ c │ └─ [0-9A-Z_a-z]* │ ├─ o │ ├─ v │ ├─ e │ └─ r └─ ("," Expr)* └─ ("," Expr) └─ Expr = Id └─ Id = ([0-9A-Z_a-z] !<< [A-Za-z] [0-9A-Z_a-z]* !>> [0-9A-Z_a-z]) \ Reserved └─ ([0-9A-Z_a-z] !<< [A-Za-z] [0-9A-Z_a-z]* !>> [0-9A-Z_a-z]) ├─ p └─ [0-9A-Z_a-z]* ├─ l ├─ a ├─ y ├─ e └─ r