Syntax of Scripting Language

EBNF

The description of the syntax uses the EBNF ("Enhanced Bachus Nauer Form").

Syntax

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"

Reserved Words