BNF Syntax |
Top Previous Next |
<Unit> ::= [<UsesClause>] {<VarSection> | <ConstSection> | <ProcedureDecl>} [begin <StmtList> end ";"]
<UsesClause> ::= uses <Identifier> {"," <Identifier>} ";"
<VarSection> ::= var <VarDecl> ";" {<VarDecl> ";"}
<VarDecl> ::= <Identifier> ({"," <Identifier>} | "=" <Expression>)
<ConstSection> ::= const <ConstDecl> ";" {<ConstDecl> ";"}
<ConstDecl> ::= <Identifier> "=" <Expression>
<ProcedureDecl> ::= (procedure | function) <Identifier> ["(" <ParamsDecl> ")"] ";" {<VarSection> | <ConstSection>} begin <StmtList> end ";"
<ParamsDecl> ::= <ParamDecl> {";" <ParamDecl>}
<ParamDecl> ::= (var | out | const ) <Identifier>
<Statement> ::= <Designator> [":=" <Expression>] | <CompoundStmt> | <IfStmt> | <CaseStmt> | <RepeatStmt> | <WhileStmt> | <ForStmt> | <TryStmt> | <RaiseStmt> | <EmptyStmt>
<StmtList> ::= <Statement> ";" {<Statement> ";"}
<EmptyStmt> ::= // Special processing. We look for one of these tokens, // but not really skips it. ";" | else | until | end
<CompoundStmt> ::= begin <StmtList> end
<IfStmt> ::= if <Expression> then <Statement> [else <Statement>]
<CaseStmt> ::= case <Expression> of <CaseSelector> ";" {<CaseSelector> ";"} [else <StmtList>] end
<CaseSelector> ::= <CaseLabel> {"," <CaseLabel>} ":" <Statement>
<CaseLabel> ::= <Expression> [".." <Expression>]
<RepeatStmt> ::= repeat <StmtList> until <Expression>
<WhileStmt> ::= while <Expression> do <Statement>
<ForStmt> ::= for <Identifier> ":=" <Expression> (to | downto) <Expression> do <Statement>
<TryStmt> ::= try [<StmtList>] (except (<ExceptionBlock> | <StmtList>) | finally <StmtList>) end
<ExceptionBlock> ::= {on [<Identifier> ":"] <Expression> do <Statement> ";"} [else <StmtList>]
<RaiseStmt> ::= raise [<Expression>]
<Expression> ::= <SimpleExpression> {<RelOp> <SimpleExpression>}
<SimpleExpression> ::= <Term> {<AddOp> <Term>}
<Term> ::= <Factor> {<MulOp> <Factor>}
<Factor> ::= <Designator> | INT_LITERAL | FLOAT_LITERAL | STRING_LITERAL | nil | "(" <Expression> ")" | not <Factor> | "-" <Factor> | "+" <Factor> | <SetConstructor> | array "[" <ArrayDim> {"," <ArrayDim>} "]" [of <Identifier>] "@" <Identifier>
<ArrayDim> ::= <Expression> [".." <Expression>]
<RelOp> ::= ">" | "<" | "<=" | ">=" | "<>" | "=" | in | is
<AddOp> ::= "+" | "-" | or | xor
<MulOp> ::= "*" | "/" | div | mod | and | shl | shr
<Designator> ::= <Identifier> {"." <Identifier> | "[" <Expression> {"," <Expression>} "]" | "(" [<Expression> {"," <Expression>}] ")"}
<SetConstructor> ::= "[" [<SetElement> {"," <SetElement>}] "]"
<SetElement> ::= <Expression> [".." <Expression>]
<Identifier> ::= IDENTIFIER |