module = statement+
statement = ( defstmt | externstmt ) <semicol>
semicol = [<ws>] <";"> [<ws>]
<defstmt> = def name arglist expr
<externstmt> = extern name arglist
extern = <"extern"> <ws>
def = <"def"> <ws>
<ws> = <#"\s*">
<name> = #"[a-zA-Z][a-zA-Z0-9_]*" [ws]
arglist = <"("> [argname [<","> [ws] argname]* ] <")">
argname = name
<expr> = [<ws>] (int | binaryop | funcall | <"("> expr <")"> | ref)
ref = name
funcall = name <"("> [expr] [<","> expr]* <")">
int = #"[0-9]+"
binaryop = expr [<ws>] operator [<ws>] expr
operator = "+" | "-" | "*" | "/"