@@ 11,8 11,8 @@ program = { SOI ~ decl+ ~ EOI }
decl = { (decl_function | decl_struct) }
-// fn <name> <params> -> <rettype> = <body> end
-decl_function = {"fn" ~ varname ~ params ~ "->" ~ typename ~ "=" ~ fnbody ~ "end" }
+// fn <name> <params> -> <rettype> <body> end
+decl_function = {"fn" ~ varname ~ params ~ "->" ~ typename ~ fnbody ~ "end" }
params = {
"()" |
@@ 25,14 25,14 @@ param = { varname ~ ":" ~ typename }
fnbody = { expr+ }
expr = {
- exp_uniop |
- exp_binop |
- exp_funcall |
- exp_if |
- exp_let |
- exp_literal |
- exp_var |
- exp_block
+ exp_uniop |
+ exp_binop |
+ exp_funcall |
+ exp_if |
+ exp_let |
+ exp_literal |
+ exp_var |
+ exp_block
}
exp_uniop = { "uniop" }
@@ 40,12 40,24 @@ exp_binop = { "binop" }
exp_funcall = { "funcall"}
exp_if = { "if" ~ expr ~ "then" ~ expr+ ~ "else" ~ expr+ ~ "end" }
exp_let = { "let" ~ varname ~ ":" ~ typename ~ "=" ~ expr }
-exp_literal = { "literal" }
+exp_literal = {
+ lit_number |
+ lit_bool |
+ lit_unit
+}
exp_var = { varname }
exp_block = { "do" ~ expr+ ~ "end" }
//exp_structref = {}
//exp_match = {}
+sign = { "-" | "+" }
+digit = { '0'..'9' }
+
+lit_number = { sign? ~ digit+ ~ ("." ~ digit*)? }
+lit_bool = { "true" | "false" }
+lit_unit = { "()" }
+// TODO: Structs, vectors...
+
decl_struct = {"struct" ~ varname ~ structmember+ ~ "end" }
structmember = { varname ~ ":" ~ typename ~ "," }