Modules
module
module: "module" <identifier> ";" {[extern] global}.
global
global: function | declaration.
Functions
function
function: functionheader [ ";" | block ].
functionheader
functionheader: ["start"] <identifier> ":" paramlist "->" returntype.
paramlist
paramlist: "void" | paramblock {";" paramblock}.
paramblock
paramblock: type param {"," param}.
param
param: {"*"} <identifier> {"[" "]"}.
returntype
returntype: type {"*"} {"[" "]"}.
Blocks and statements
block
block: "{" { statement | block } "}".
statement
statement: "label" <identifier> ";"
statement: ";"
statement: "break" ";"
statement: "continue" ";"
statement: expression ";"
statement: declarationblock ";"
statement: "if" "(" expression ")" block [ "else" block ].
statement: "goto" <identifier> ";"
statement: "while" "(" expression ")" "do" block
statement: "do" block "while" "(" expression ")" ";"
statement: "switch" "(" expression ")" "{" { "case" <int_literal> block } "default" block "}"
statement: "return" "(" expression ")"
";".
declarationblock
declarationblock: type declaration {"," declaration}.
declaration
local: {"*"} <identifier> {"[" <int_literal> "]"} [ "=" expression ].
Expressions
Assignment
expression: logicalor {"=" logicalor expression}.
Logical OR
logicalor: logicaland {"||" logicaland logicalor}.
Logical AND
logicaland: bitwiseor {"&&" bitwiseor logicaland}.
Bitwise OR
bitwiseor: bitwisexor {"|" bitwisexor bitwiseor}.
Bitwise XOR
bitwisexor: bitwiseand {"^" bitwiseand bitwisexor}.
Bitwise AND
bitwiseand: equality {"&" equality bitwiseand}.
Equality
equality: relation {("==" | "!=") relation equality}.
Relation
relation: shift {("<" | "<=" | ">" | ">=") shift relation}.
Bitwise shift
shift: addition {("<<" | ">>") addition shift}.
Addition/subtraction
addition: multiplication {("+" | "-") multiplication addition}
Multiplication/division
multiplication: unary3 {("*" | "/" | "%") unary3 multiplication}.
Unary operations
Reference, indirection and bitwise complement
unary3: {("&" | "*" | "~")} unary2.
Unary negation, unary plus and logical NOT
unary2: {("+" | "-" | "!")} factor.
Factor and application
factor
factor: <identifier> [application] | immediate | "(" expression ")".
application
application: "[" expression "]" application | "(" expression {"," expression } ")".
Types and immediates
type
type: "bool" | "char" | "float" | "int" | "string".
immediate
immediate: <boolean_literal> | <char_literal> | <float_literal> | <int_literal> | <string_literal>.