Appendix A
Pascal grammar

Below is a formal grammar of the pascal language in EBNF notation. It is not 100% complete, some parts such as assembler or objective-c have not been specified.

⟨module⟩ = ⟨programmodule ⟩ | ⟨librarymodule⟩ | ⟨packagemodule⟩ | ⟨unitmodule⟩ ;
⟨programmodule⟩ = ⟨programheader⟩ ”;” [ ⟨fullusesclause⟩ ] ⟨block ⟩ ”.” ;

⟨programheader⟩ = ”program ” ⟨identifier⟩ [ ”(” ⟨programparameters⟩ ”)” ] ;

⟨programparameters⟩ = ⟨identifierlist⟩ ;

⟨fullusesclause⟩ = ”uses” ⟨fullusesitem ⟩ ”,” ⟨fullusesitem⟩ ”;” ;

⟨fullusesitem⟩ = ⟨identifier⟩ [ ”in” ⟨stringliteral⟩ ] ;

⟨librarymodule⟩ = ⟨libraryheader⟩ ”;” [ ⟨usesclause⟩ ] ⟨block⟩ ”.” ;

⟨libraryheader⟩ = ”library” ⟨identifier⟩ ;

⟨packagemodule⟩ = ⟨packageheader⟩ ”;” [ ⟨containsclause⟩ ] [⟨requiresclause⟩] ”end ” ”.” ;

⟨packageheader⟩ = ”package ” ⟨identifier⟩ ;

⟨containsclause⟩ = ”contains” ⟨fullusesitem ⟩ ”,” ⟨fullusesitem ⟩ ”;” ;

⟨requiresclause⟩ = ”requires” ⟨qualifierlist⟩ ”;” ;

⟨unitmodule⟩ = ⟨unitheader⟩⟨interfacesection⟩⟨implementationsection⟩([⟨initializationsection⟩
    ] [ ⟨finalizationsection ⟩ ]
 |  ”begin” ⟨statementlist⟩ ) ”end” ”.” ;

⟨unitheader⟩ = ”unit” ⟨qualifier⟩ [ ⟨hintdirectives⟩ ] ”;” ;
⟨interfacesection ⟩ = ”interface” [ ⟨usesclause⟩ ] [⟨interfaceparts⟩ ] ;

⟨usesclause⟩ = ”uses” ⟨identifier⟩ ”,” ⟨identifier⟩ ”;” ;

⟨interfaceparts⟩ = ⟨interfacepart⟩ ⟨interfacepart⟩ ;

⟨interfacepart⟩ = ⟨constantdeclarationblock⟩
 |  ⟨typedeclarationblock⟩
 |  ⟨variabledeclarationblock⟩
 |  ⟨propertydeclarationblock⟩
 |  ⟨procedureheadersblock⟩ ;

⟨implementationsection⟩ = ”implementation ” [ ⟨usesclause⟩ ] ⟨declarationpart⟩ ;

⟨initializationsection⟩ = ”initialization” ⟨statementlist⟩ ;

⟨finalizationsection ⟩ = ” finalization” ⟨statementlist⟩ ;

⟨exportsclause ⟩ = ”exports ” ⟨exportslist⟩ ”;” ;

⟨exportslist⟩ = ⟨exportsentry⟩ ”,” ⟨exportsentry⟩ ;

⟨exportsentry⟩ = ⟨identifier⟩ [ ”index ” ⟨integerconstant⟩ ] [ ”name ” ⟨stringconstant⟩ ] ;

⟨procedureheadersblock ⟩ = ⟨procedureheader⟩
 |  ⟨functionheader⟩
 |  ⟨operatorheader⟩;

⟨procedureheader⟩ = ⟨genericprocedureheader⟩
 |  ⟨regularprocedureheader⟩ ;

⟨genericprocedureheader⟩ = ”generic””procedure ”⟨qualifier⟩⟨generictemplatelist⟩⟨formalparameterlist⟩
    ”;” [ ⟨callmodifiers⟩ ”;” ] [⟨hintdirectives⟩] ;

⟨regularprocedureheader⟩ = ”procedure ” ⟨qualifier⟩[⟨generictemplatelist⟩]⟨formalparameterlist⟩
    ”;” [ ⟨callmodifiers⟩ ”;” ] [⟨hintdirectives⟩] ;
⟨functionheader⟩ = ⟨genericfunctionheader⟩
 |  ⟨regularfunctionheader⟩ ;

⟨genericfunctionheader⟩ = ”generic” ”function ” ⟨qualifier⟩ [ ”¡” ⟨generictemplatelist⟩
    ”¿” ] ⟨formalparameterlist⟩ ”:” ⟨type⟩ [ ⟨callmodifiers⟩ ”;” ] [⟨hintdirectives⟩] ;

⟨regularfunctionheader⟩ = ”function” ⟨qualifier⟩[”¡”⟨generictemplatelist⟩ ”¿”]⟨formalparameterlist⟩
    ”:” ⟨type⟩ [ ⟨callmodifiers⟩ ”;” ] [⟨hintdirectives⟩] ;

⟨operatorheader⟩ = ”operator” ⟨operatordefinition⟩ [ ⟨resultidentifier⟩ ] ”:” ⟨type⟩ ;

⟨operatordefinition⟩ = ⟨assignmentoperatordefinition⟩
 |  ⟨arithmeticoperatordefinition ⟩
 |  ⟨comparisonoperatordefinition⟩
 |  ⟨logicaloperatordefinition⟩
 |  ⟨otheroperatordefinition⟩ ;

⟨generictemplatelist⟩ = ⟨constrainedtemplatelist⟩
 |  ⟨freetemplatelist⟩ ;

⟨constrainedtemplatelist⟩ = ⟨constrainedtemplates⟩ ”;” ⟨constrainedtemplates⟩ ;

⟨freetemplatelist⟩ = ⟨identifier⟩ ”,” ⟨qualifier⟩ ;

⟨constrainedtemplates⟩ = ⟨identifierlist⟩ ”:” ⟨typeconstraint⟩ ”,” ⟨typeconstraint⟩ ;

⟨identifierlist⟩ = ⟨identifier⟩ ”,” ⟨identifier⟩ ;

⟨typeconstraint⟩ = ⟨identifier⟩
 |  ”class”
 |  ”record” ;

⟨block⟩ = ⟨declarationblock⟩  ⟨statementblock⟩ ;

⟨declarationblock⟩ = ⟨labeldeclarationblock⟩
 |  ⟨constantdeclarationblock⟩
 |  ⟨resourcestringdeclarationblock⟩
 |  ⟨classfuncprocdeclarationblock⟩
 |  ⟨funcprocdeclarationblock ⟩
 |  ⟨typedeclarationblock⟩
 |  ⟨variabledeclarationblock⟩
 |  ⟨threadvariabledeclarationblock⟩
 |  ⟨exportsclause⟩ ;
⟨funcprocdeclarationblock⟩ = ⟨proceduredeclaration⟩
 |  ⟨functiondeclaration⟩
 |  ⟨constructordeclaration⟩
 |  ⟨destructordeclaration⟩
 |  ⟨operatordeclaration⟩ ;

⟨statementblock⟩ = ⟨compoundstatement ⟩ ;

⟨labeldeclarationblock⟩ = ”label” ⟨labeldef⟩ [ ”,” ⟨labeldef⟩ ] ”;” ;