Syntax of DelphiWebScript II

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 |
	ARRAYDEF |
	RECORDDEF |
	CLASSDEF

ARRAYDEF =
	"array" "[" EXPR ".." EXPR {"," EXPR ".." EXPR} "]" "of" TYPEDEF

RECORDDEF =
	"record" ARGLIST "end"

ARGLIST =
	ARGDECL { ";" ARGDECL }

ARGDECL =
	NAME ":" TYPEDEF

CLASSDEF =
	"class" [ "(" NAME ")" ]
	    [ "private" | "public" | "protected" ]
	    [ ARGLIST ";" ]
	    [ METHODDECL { ";" METHODDECL } ";" ]
	    [ "property" NAME ":" TYPEDEF [ "read" NAME ] [ "write" NAME ] ";" ]
	"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" "=" 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" 
		BLOCK { ";" BLOCK } [ ";" ] 
	"except"
		{ "on" NAME ":" NAME "do" BLOCK; }
	"end"

FINALLY = 
	"try"
		BLOCK { ";" BLOCK } [ ";" ] 
	"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 ")" 

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