Grammar

This section contains all the grammar rules from the previous sections collected together.

id :: alpha alphanum+
alpha :: "a".."z" | "A".."Z" | "_"
alphanum :: alpha | digit
digit :: "0".."9"
int :: digit+
float :: digit+ exponent | digit* "." digit+ [ exponent ]
exponent :: ("e" | "E") ["+" | "-"] digit+
str :: <"> (<any character except ", CR or LF> | <"> <">)* <">
opsym :: "+" | "-" | "*" | "/" | "**" | ":" | "==" | "!=" | "<" | ">" | ">=" | "<="
punct :: "(" | ")" | "[" | "]" | "," | "=" | "+=" | "-=" | "*=" | "/=" | "**=" | "::"
br :: (newline | ";")+
newline :: <CR> <LF> | <LF> | <CR>
whitespace :: " " | <TAB>
comment :: "--" <any character except CR or LF>*
initial-comment :: "#!" <any character except CR or LF>*
utf8-bom :: <EF> <BB> <BF>
main :: [ utf8-bom ] [ initial-comment newline ] [ br] [ encoding-decl ] imports defs
module :: [ utf8-bom ] [ encoding-decl ] module-decl imports defs
module-decl :: "module" module-name br
module-name :: id ("::" id)*
imports :: ("import" module-name ("," module-name)* br)*
encoding-decl :: "encoding" ("utf8" | "ascii" | "latin1") br
defs :: (def br)*
def :: statement | [ "private" ] (var-def | function-def | class-def)
var-def :: ("var" | "const") id-list [ "=" expression ]
id-list :: id ("," id)*
function-def :: "sub" id "(" arg-list ")" br block "end"
arg-list :: [ var-args ] | argument ("," argument)* [ "," var-args ]
var-args :: "*" id
argument :: id [ "=" single-expression ]
class-def :: "class" id [ "is" gvar ] br (cdef br)* "end"
cdef :: [ "private" ] (member-var-def | method-def | getter-def | setter-def)
method-def :: function-def
member-var-def :: var-def
getter-def :: "sub" id br block "end"
setter-def :: "sub" id "=" id br block "end"
block :: ((lvar-def | statement) br)*
statement :: expression | assignment-stmt | operator-assignment-stmt
  | if-stmt | switch-stmt | while-stmt | repeat-stmt | for-stmt
  | break-stmt | return-stmt | try-stmt | raise-stmt
assignment-stmt :: expression "=" expression
operator-assignment-stmt :: expression operator-assignment expression
operator-assignment :: "+=" | "-=" | "*=" | "/=" | "**="
lvar-def :: "var" id-list [ "=" expression ]
if-stmt ::
  "if" expression br block
  ( "elif" expression br block )*
  [ "else" br block ]
  "end"
switch-stmt ::
  "switch" expression br
  ( "case" expression-list br block )+
  [ "else" br block ]
  "end"
expression-list :: single-expression ("," single-expression)*
while-stmt :: "while" expression br block "end"
repeat-stmt :: "repeat" br block "until" expression
for-stmt :: "for" id-list "in" expression br block "end"
break-stmt :: "break"
return-stmt :: "return" [ expression ]
try-stmt ::
  "try" br block
  ( ("except" [ id "is" ] gvar br block)+ | "finally" br block )
  "end"
raise-stmt :: "raise" expression
expression :: list-expression | single-expression
single-expression :: simple-expression
  | gvar
  | "(" expression ")"
  | binary-operation
  | boolean-operation
  | unary-operation
  | subscript-expression
  | call-expression
  | array-expression
  | member-reference
  | super-reference
  | anonymous-function
simple-expression :: int | float | str | "nil" | id | "self"
gvar :: id ("::" id)+ | "::" id
binary-operation :: expression binary-op expression
binary-op :: "+" | "-" | "*" | "/" | "div" | "mod" | "**" | "==" | "!="
  | "<" | "<=" | ">" | ">=" | "is" | "in" | "to" | ":"
boolean-operation :: expression ("and" | "or") expression
unary-operation :: ("-" | "not") expression
subscript-expression :: expression "[" expression "]"
call-expression :: expression "(" args ")"
args :: [ "*" expression ] 
  | single-expression ("," single-expression)* [ "," "*" expression ]
array-expression :: "[" comma-list "]"
comma-list :: single-expression | list-expression
list-expression :: single-expression ("," | ("," single-expression)+ [ "," ])
member-reference :: expression "." id
super-reference :: "super" "." id
anonymous-function :: "sub" "(" arg-list ")" br block "end"