var const_string string = "";
type type_int = int;
+type type_struct = struct;
+type type_union = union;
# type type_intary int[]
# type type_intary42 int[42]
# type type_intaryary int[][]
"require" { return T_REQUIRES; }
"provide" { return T_PROVIDES; }
-"let" { return T_LET; }
-"var" { return T_VAR; }
-"fun" { return T_FUN; }
-"type" { return T_TYPE; }
+"let" { return T_LET; }
+"var" { return T_VAR; }
+"fun" { return T_FUN; }
+"type" { return T_TYPE; }
+"struct" { return T_STRUCT; }
+"union" { return T_UNION; }
"if" { return T_IF; }
"else" { return T_ELSE; }
/* Grammar Definition
*****************************************************************************/
AST* toplevel(Parser* p) {
- if (matches(p, T_REQUIRES)) {
+ if (matches(p, T_REQUIRES))
require_list(p);
- }
- if (matches(p, T_PROVIDES)) {
+ if (matches(p, T_PROVIDES))
provide_list(p);
- }
definition_list(p);
return NULL;
}
}
static AST* type_expression(Parser* p) {
- expect(p, T_ID);
+ if (matches(p, T_STRUCT)) {
+ expect(p, T_STRUCT);
+ } else if (matches(p, T_UNION)) {
+ expect(p, T_UNION);
+ } else {
+ expect(p, T_ID);
+ }
return NULL;
}
*****************************************************************************/
typedef enum {
T_NONE, T_ERROR, T_END_FILE,
- T_PACKAGE, T_REQUIRES, T_PROVIDES, T_LET, T_VAR, T_FUN, T_TYPE,
+ T_PACKAGE, T_REQUIRES, T_PROVIDES, T_LET, T_VAR, T_FUN, T_TYPE, T_STRUCT,
+ T_UNION,
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_SEMI