"struct" { return T_STRUCT; }
"union" { return T_UNION; }
-"if" { return T_IF; }
-"else" { return T_ELSE; }
-"(" { return T_LPAR; }
-")" { return T_RPAR; }
-"[" { return T_LBRACK; }
-"]" { return T_RBRACK; }
-"{" { return T_LBRACE; }
-"}" { return T_RBRACE; }
-"," { return T_COMMA; }
-"'" { return T_SQUOTE; }
-":" { return T_COLON; }
-"&" { return T_AMP; }
-"=" { return T_ASSIGN; }
-";" { return T_SEMI; }
-"*" { return T_MUL; }
+"(" { return '('; }
+")" { return ')'; }
+"[" { return '['; }
+"]" { return ']'; }
+"{" { return '{'; }
+"}" { return '}'; }
+"," { return ','; }
+"'" { return '\''; }
+":" { return ':'; }
+"&" { return '&'; }
+"=" { return '='; }
+";" { return ';'; }
+"*" { return '*'; }
\\. { Value.character = yytext[1]; return T_CHAR; }
\\space { Value.character = ' '; return T_CHAR; }
static void require_list(Parser* p) {
accept(p, T_REQUIRES);
- expect(p, T_LPAR);
- while (!matches(p, T_RPAR)) {
+ expect(p, '(');
+ while (!matches(p, ')')) {
expect(p, T_STRING);
}
- expect(p, T_RPAR);
+ expect(p, ')');
}
static void provide_list(Parser* p) {
accept(p, T_PROVIDES);
- expect(p, T_LPAR);
- while (!matches(p, T_RPAR)) {
+ expect(p, '(');
+ while (!matches(p, ')')) {
expect(p, T_ID);
}
- expect(p, T_RPAR);
+ expect(p, ')');
}
static AST* definition_list(Parser* p) {
} 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");
}
}
error(p, "constant or variable definition expected");
expect(p, T_ID);
type_expression(p);
- expect(p, T_ASSIGN);
+ expect(p, '=');
const_expression(p);
- expect(p, T_SEMI);
+ expect(p, ';');
return NULL;
}
static AST* type_definition(Parser* p) {
expect(p, T_TYPE);
expect(p, T_ID);
- expect(p, T_ASSIGN);
+ expect(p, '=');
type_expression(p);
- expect(p, T_SEMI);
+ expect(p, ';');
return NULL;
}
static AST* func_definition(Parser* p) {
expect(p, T_FUN);
expect(p, T_ID);
- expect(p, T_LPAR);
- expect(p, T_RPAR);
+ expect(p, '(');
+ expect(p, ')');
type_expression(p);
- expect(p, T_LBRACE);
- expect(p, T_RBRACE);
+ expect(p, '{');
+ expect(p, '}');
return NULL;
}
static AST* const_expression(Parser* p) {
AST* expr = NULL;
- if (accept(p, T_LPAR)) {
+ if (accept(p, '(')) {
expr = const_expression(p);
- expect(p, T_RPAR);
+ expect(p, ')');
} else if (matches(p, T_ID)) {
expr = identifier(p);
} else {
} else {
expect(p, T_ID);
}
- while (matches(p, T_MUL) || matches(p, T_LBRACK)) {
- if (matches(p, T_LBRACK)) {
- expect(p, T_LBRACK);
- expect(p, T_RBRACK);
+ while (matches(p, '*') || matches(p, '[')) {
+ if (matches(p, '[')) {
+ expect(p, '[');
+ expect(p, ']');
} else {
- expect(p, T_MUL);
+ expect(p, '*');
}
}
return NULL;
}
static AST* struct_fields(Parser* p) {
- expect(p, T_LBRACE);
+ expect(p, '{');
do {
expect(p, T_ID);
- expect(p, T_ASSIGN);
+ expect(p, '=');
type_expression(p);
- expect(p, T_SEMI);
- } while(!matches(p, T_RBRACE));
- expect(p, T_RBRACE);
+ expect(p, ';');
+ } while(!matches(p, '}'));
+ expect(p, '}');
return NULL;
}
case T_INT: return "T_INT";
case T_FLOAT: return "T_FLOAT";
case T_BOOL: return "T_BOOL";
- case T_LBRACE: return "T_LBRACE";
- case T_RBRACE: return "T_RBRACE";
- case T_LBRACK: return "T_LBRACK";
- case T_RBRACK: return "T_RBRACK";
- case T_LPAR: return "T_LPAR";
- case T_RPAR: return "T_RPAR";
- case T_COMMA: return "T_COMMA";
case T_ID: return "T_ID";
- case T_COLON: return "T_COLON";
- case T_AMP: return "T_AMP";
- case T_SQUOTE: return "T_SQUOTE";
- case T_DQUOTE: return "T_DQUOTE";
+ case '{': return "T_LBRACE";
+ case '}': return "T_RBRACE";
+ case '[': return "T_LBRACK";
+ case ']': return "T_RBRACK";
+ case '(': return "T_LPAR";
+ case ')': return "T_RPAR";
+ case ',': return "T_COMMA";
+ case ':': return "T_COLON";
+ case '&': return "T_AMP";
+ case '\'': return "T_SQUOTE";
+ case '"': return "T_DQUOTE";
case T_END_FILE: return "T_END_FILE";
default: return "???";
}
fprintf(file, "%zu:", token->col);
}
pprint_token_type(file, token);
- if (token->type < T_LBRACE) {
+ if (token->type > 256) {
fprintf(file, ":");
pprint_token_value(file, token);
}
/* Token Types
*****************************************************************************/
typedef enum {
- T_NONE, T_ERROR, T_END_FILE,
+ T_NONE = 0, T_ERROR = 256, T_END_FILE,
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, T_MUL
+// 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, T_MUL
} TokType;
typedef struct {