euphoria-program -> top-level-statements top-level-statements -> top-level-statement top-level-statements | top-level-statement top-level-statement -> statement | include | with-options | variable-definition | "global" variable-definition | constant-definition | "global" constant-definition | subroutine | "global" subroutine include -> "include" filename with-options -> "with" option-name | "without" option-name option-name -> variable-definition -> type-name variable-list type-name -> "object" | "sequence" | "atom" | "integer" | user-defined-type variable-list -> var-name "," variable-list | var-name constant-definition -> constant-list constant-list -> var-name "=" expression "," constant-list | var-name "=" expression subroutine -> "procedure" procedure-name subroutine-body "end procedure" | "function" function-name subroutine-body "end function" | "type" type-name subroutine-body "end type" subroutine-body -> "(" arguments ")" var-defs sub-statements arguments -> type-name var-name "," arguments | type-name var-name | "" var-defs -> variable-definition var-defs | variable-definition | "" sub-statements -> sub-statement sub-statements | sub-statement | "" sub-statement -> statement | "return" expression | "return" statement-list -> statement statement-list | statement | "" statement -> var-name assignment-op expression | var-name subscripts assignment-op expression | for-loop | while-loop | if-statement | procedure-name "(" expression-list ")" | "?" expression | "--" comment-text "\n" | "exit" | "return" | "return" expression assignment-op -> "=" | "+=" | "-=" | "*=" | "/=" | "&=" for-loop -> "for" var-name "=" expression "to" expression "do" statement-list "end for" | "for" var-name "=" expression "to" expression "by" expression "do" statement-list "end for" while-loop -> "while" expression "do" statement-list "end while" if-statement -> "if" expression "then" statement-list elsif-statement elsif-statement -> else-statement | "elsif" expression "then" statement-list elsif-statement else-statement -> "end if" | "else" statement-list "end if" expression-list -> expression "," expression-list | expression | "" expression -> function-name "(" expression-list ")" | "{" expression-list "}" | "(" expression ")" | var-name | var-name subscripts | unary-operator expression | expression binary-operator expression | string-constant | character-constant | numeric-constant subscripts -> "[" expression "]" subscripts | "[" expression "]" | slice slice -> "[" expression ".." expression "]" unary-operator -> "+" | "-" | "not" binary-operator -> "+" | "-" | "*" | "/" | "&" | "=" | "<" | ">" | "!=" | "<=" | ">=" | "or" | "and" | "xor" string-constant -> """ ascii-chars """ | """" character-constant -> "'" ascii-char "'" numeric-constant -> sign decimal-digits fractional exponent | "#" hex-digits sign -> "+" | "-" | "" fractional -> "." decimal-digits exponent -> "e" sign decimal-digits | "E" sign decimal-digits | "" identifier -> alpha-char alpha-numeric-chars