requires ("fmt")
provides (main)
-let const_true bool = true
-let const_false bool = false
-let const_uint int = 123
-let const_string string = ""
+let const_true bool = true;
+let const_false bool = false;
+let const_uint int = 123;
+let const_string string = "";
-var const_true bool = true
-var const_false bool = false
-var const_uint int = 123
-var const_string string = ""
+var const_true bool = true;
+var const_false bool = false;
+var const_uint int = 123;
+var const_string string = "";
-# type type_int int
+type type_int = int;
# type type_intary int[]
# type type_intary42 int[42]
# type type_intaryary int[][]
"let" { return T_LET; }
"var" { return T_VAR; }
"fun" { return T_FUN; }
+"type" { return T_TYPE; }
"if" { return T_IF; }
"else" { return T_ELSE; }
":" { return T_COLON; }
"&" { return T_AMP; }
"=" { return T_ASSIGN; }
+";" { return T_SEMI; }
\\. { Value.character = yytext[1]; return T_CHAR; }
\\space { Value.character = ' '; return T_CHAR; }
} else if (matches(p, T_FUN)) {
func_definition(p);
} else {
+ printf("%d\n", peek(p)->type);
error(p, "only definitions are allowed at the toplevel");
}
}
Type* type = type_annotation(p);
expect(p, T_ASSIGN);
AST* expr = const_expression(p);
- sym_add(&(p->syms), (constant ? SF_CONSTANT : 0), id->value.text, type);
- if (!types_equal(type, expr->datatype))
- error(p, "type mismatch");
- return Var(id, expr, constant);
+ expect(p, T_SEMI);
+ return NULL;
}
static AST* type_definition(Parser* p) {
expect(p, T_TYPE);
expect(p, T_ID);
+ expect(p, T_ASSIGN);
type_expression(p);
+ expect(p, T_SEMI);
return NULL;
}
T_PACKAGE, T_REQUIRES, T_PROVIDES, T_LET, T_VAR, T_FUN, T_TYPE,
T_ID, T_CHAR, T_INT, T_FLOAT, T_BOOL, T_STRING,
T_LBRACE, T_RBRACE, T_LBRACK, T_RBRACK, T_LPAR, T_RPAR, T_COMMA, T_SQUOTE,
- T_DQUOTE, T_COLON, T_AMP, T_IF, T_ELSE, T_ASSIGN
+ T_DQUOTE, T_COLON, T_AMP, T_IF, T_ELSE, T_ASSIGN, T_SEMI
} TokType;
typedef struct {