The description of the syntax uses the EBNF ("Enhanced Bachus Nauer Form").
The start non-terminal is SCRIPT
SCRIPT = [ ROOTSTATEMENT { ";" ROOTSTATEMENT } [ ";" ] ] ROOTSTATEMENT = TYPEDECL | PROCDECL | STATEMENT STATEMENT = VARDECL | CONSTDECL | BLOCK VARDECL = "var" NAME ":" TYPEDEF [ "=" EXPR ] TYPEDECL = "type" NAME "=" TYPEDEF TYPEDEF = "Boolean" | "Integer" | "Float" | "String" | "DateTime" | "Variant" NAME | ENUMDEF | ARRAYDEF | RECORDDEF | CLASSDEF ENUMDEF = "(" NAME [ "=" EXPR ] { "," NAME [ "=" EXPR ] } ")" ARRAYDEF = "array" "[" EXPR ".." EXPR {"," EXPR ".." EXPR} "]" "of" TYPEDEF | "array" "of" TYPEDEF RECORDDEF = "record" ARGLIST "end" ARGLIST = ARGDECL { ";" ARGDECL } ARGDECL = NAME ":" TYPEDEF CLASSDEF = "class" [ "(" NAME ")" ] [ "private" | "public" | "protected" ] [ ARGLIST ";" ] [ METHODDECL { ";" METHODDECL } ";" ] [ "property" NAME [ "[" ARGLIST "]" ] ":" TYPEDEF [ "read" NAME ] [ "write" NAME ] ";" ] [ "default" ";" ] "end" METHODDECL = [ "class" ] "procedure" NAME ["(" [ARGLIST] ")"] [ ";" "override" | "virtual" | "reintroduce" ] | [ "class" ] "function" NAME ["(" [ARGLIST] ")"] ":" TYPEDEF [ ";" "override" | "virtual" | "reintroduce" ] | "constructor" NAME ["(" [ARGLIST] ")"] [ ";" "override" | "virtual" | "reintroduce" ] | "destructor" NAME ["(" [ARGLIST] ")"] [ ";" "override" | "virtual" | "reintroduce" ] PROCDECL = PROCHEAD ";" PROCBODY | PROCHEAD ";" "forward" | METHODDEF ";" PROCBODY PROCHEAD "procedure" NAME ["(" [ARGLIST] ")"] "function" NAME ["(" [ARGLIST] ")"] ":" TYPEDEF PROCBODY = {VARDECL ";"} "begin" SCRIPT "end" METHODDEF = [ "class" ] "procedure" NAME "." NAME ["(" [ARGLIST] ")"] | [ "class" ] "function" NAME "." NAME ["(" [ARGLIST] ")"] ":" TYPEDEF | "constructor" NAME "." NAME ["(" [ARGLIST] ")"] | "destructor" NAME "." NAME ["(" [ARGLIST] ")"] CONSTDECL = "const" NAME "=" EXPR BLOCK = "begin" [STATEMENT {";" STATEMENT} [";"]] "end" | INSTR INSTR = "if" EXPR "then" BLOCK | "if" EXPR "then" BLOCK "else" BLOCK | CASEINSTR | "for" VAR ":=" EXPR "to" EXPR "do" BLOCK | "for" VAR ":=" EXPR "downto" EXPR "do" BLOCK | "while" EXPR "do" BLOCK | "repeat" [BLOCK {";" BLOCK} [";"]] "until" EXPR | VAR ":=" EXPR | FUNC | EXCEPT | FINALLY | BLOCK CASECOND = EXPR | EXPR ".." EXPR | CASEINSTR = "case" EXPR "of" { CASECOND {"," CASECOND } : BLOCK ";" } [ "default" ":" BLOCK ";" ] "end" FUNC = NAME [ "(" [EXPR {, EXPR}] ")" ] EXCEPT = "try" STATEMENT { ";" STATEMENT } [ ";" ] "except" { "on" NAME ":" NAME "do" BLOCK; } "end" FINALLY = "try" STATEMENT { ";" STATEMENT } [ ";" ] "finally" { "on" NAME ":" NAME "do" BLOCK; } "end" EXPR = EXPRADD [ "=" | "+" | "-" | "OR" EXPRADD] EXPRADD = EXPRMUL [ "+" | "-" | "OR" EXPRADD] EXPRMUL = TERM [ "*" | "/" | "mod" | "div" EXPRMUL] TERM = "+" TERM | "-" TERM | "not" TERM | CONST | VAR | FUNC | "(" EXPR ")" "[" [ EXPR { "," EXPR } ] "]" CONST = INT | HEXINT | FLOAT | STR | CHAR | "True" | "False" VAR = NAME | NAME "[" INT "]" | NAME "." VAR | VAR "." FUNC NAME = LIT {LIT | "0".."9" | "_"} LIT = "A".."Z", "a".."z" STR = CHAR | STRING { CHAR [ STRING ] } STRING = " ' " { STRINGCHAR } " ' " { " ' " STRING } STRINGCHAR = ASCII(0)..ASCII(255) - " ' " - ASCII(13) | " ' ' " CHAR = "#" INT | "#" HEXINT HEXINT = "$" HEXNUM { HEXNUM } HEXNUM = "0".."9"|"A".."F"|"a".."f" FLOAT = INT [ "." INT] [ "E" | "e" ["+" | "-" ] INT ] INT = NUM {NUM} NUM = "0".."9"