Noodling around with parser a little.
1 files changed, 51 insertions(+), 4 deletions(-)

M src/parser.pest
M src/parser.pest +51 -4
@@ 1,6 1,53 @@ 
-alpha = { 'a'..'z' | 'A'..'Z' }
-digit = { '0'..'9' }
+
+id_char = { ASCII_ALPHANUMERIC | "_" }
+
+// Variable identifiers start with lowercase letters
+varname = { ASCII_ALPHA_LOWER ~ id_char* }
+
+// types start with uppercase letters
+typename = { ASCII_ALPHA_UPPER ~ id_char* }
+
+program = { SOI ~ decl+ ~ EOI }
+
+decl = { (decl_function | decl_struct) }
+
+// fn <name> <params> -> <rettype> = <body> end
+decl_function = {"fn" ~ varname ~ params ~ "->" ~ typename ~ "=" ~ fnbody ~ "end" }
+
+params = {
+       "()" |
+       param ~ ("," ~ param)*
+}
+
+param = { varname ~ ":" ~ typename }
+
+
+fnbody = { expr+ }
 
-ident = { (alpha | digit)+ }
+expr = {
+     exp_uniop |
+     exp_binop |
+     exp_funcall |
+     exp_if |
+     exp_let |
+     exp_literal |
+     exp_var |
+     exp_block
+}
 
-program = { ident }
  No newline at end of file
+exp_uniop = { "uniop" }
+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_var = { varname }
+exp_block = { "do" ~ expr+ ~ "end" }
+//exp_structref = {}
+//exp_match = {}
+
+decl_struct = {"struct" ~ varname ~ structmember+ ~ "end" }
+
+structmember = { varname ~ ":" ~ typename ~ "," }
+
+WHITESPACE = _{ " " | "\t" | "\r" | "\n" }
  No newline at end of file