DWS Defined Using EBNF

Top  Previous  Next  Contents  Index 

Syntax of DelphiWebScript II in EBNF

 

The description of the syntax uses the EBNF ("Enhanced Backus Naur Form").

[ ] = Optional
{ } = Zero, one or many times
Names in capital letters are symbols (non-terminals)
Names in quotes ("name") are part of the input string (terminals)

 

 

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"

  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 ")"

"[" [ 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

and
array
as
begin
case
class
const
constructor
destructor
div
do
downto
else
end
except
finally
for
forward
function
if
inherited
is
label
mod
nil
not
of
or
procedure
property
raise
record
repeat
string
then
to
try
type
until
var
while
xor

 

 

(This topic is from the DWS project and is distributed per the MOZILLA PUBLIC LICENSE Version 1.1.)