summaryrefslogtreecommitdiff
path: root/parse.c
diff options
context:
space:
mode:
Diffstat (limited to 'parse.c')
-rw-r--r--parse.c56
1 files changed, 30 insertions, 26 deletions
diff --git a/parse.c b/parse.c
index 6b0a59a..99489be 100644
--- a/parse.c
+++ b/parse.c
@@ -48,6 +48,7 @@ static const char *expr_kind_to_str(ExprKind k) {
case EXPR_SLICE: return "slice";
case EXPR_TYPE: return "type";
case EXPR_VAL: return "value";
+ case EXPR_NMS: return "namespace";
}
assert(0);
return "";
@@ -152,6 +153,7 @@ static int kw_to_builtin_type(Keyword kw) {
case KW_BOOL: return BUILTIN_BOOL;
case KW_CHAR: return BUILTIN_CHAR;
case KW_TYPE: return BUILTIN_TYPE;
+ case KW_NAMESPACE: return BUILTIN_NMS;
default: return -1;
}
return -1;
@@ -172,6 +174,7 @@ static Keyword builtin_type_to_kw(BuiltinType t) {
case BUILTIN_BOOL: return KW_BOOL;
case BUILTIN_CHAR: return KW_CHAR;
case BUILTIN_TYPE: return KW_TYPE;
+ case BUILTIN_NMS: return KW_NAMESPACE;
}
assert(0);
return KW_COUNT;
@@ -575,7 +578,6 @@ static bool parse_type(Parser *p, Type *type) {
/* help cgen out */
struc->c.id = 0;
struc->fields = NULL;
- struc->export.id = 0;
struc->where = parser_mk_loc(p);
struc->where.start = t->token;
@@ -1042,7 +1044,6 @@ static bool parse_expr(Parser *p, Expression *e, Token *end) {
e->kind = EXPR_FN;
if (!parse_fn_expr(p, e->fn = parser_calloc(p, 1, sizeof *e->fn)))
return false;
- e->fn->export.id = 0;
if (t->token != end) {
if (token_is_kw(t->token, KW_LPAREN))
tokr_err(t, "Direct function calling in an expression is not supported.\nYou can wrap the function in parentheses.");
@@ -1052,6 +1053,20 @@ static bool parse_expr(Parser *p, Expression *e, Token *end) {
}
goto success;
}
+ case KW_NMS: {
+ Namespace *n = &e->nms;
+ e->kind = EXPR_NMS;
+ ++t->token;
+ if (!parse_block(p, &n->body))
+ return false;
+ arr_foreach(e->nms.body.stmts, Statement, sub) {
+ if (sub->kind != STMT_DECL) {
+ err_print(sub->where, "Only declarations can be in namespaces.");
+ return false;
+ }
+ }
+ goto success;
+ }
case KW_IF: {
IfExpr *i = &e->if_;
e->kind = EXPR_IF;
@@ -1996,6 +2011,10 @@ static bool parse_stmt(Parser *p, Statement *s, bool *was_a_statement) {
*was_a_statement = true;
if (t->token->kind == TOKEN_KW) {
switch (t->token->kw) {
+ case KW_SEMICOLON:
+ *was_a_statement = false;
+ ++t->token;
+ return true;
case KW_RETURN: {
s->kind = STMT_RET;
++t->token;
@@ -2020,24 +2039,6 @@ static bool parse_stmt(Parser *p, Statement *s, bool *was_a_statement) {
t->token = end + 1;
return success;
}
- case KW_NAMESPACE: {
- s->kind = STMT_NAMESPACE;
- ++t->token;
- if (t->token->kind == TOKEN_IDENT) {
- s->ns.name = t->token->ident;
- ++t->token;
- } else {
- s->ns.name = NULL;
- }
- if (!parse_block(p, &s->ns.body))
- return false;
- arr_foreach(s->ns.body.stmts, Statement, sub) {
- if (sub->kind != STMT_DECL) {
- err_print(s->where, "Only declarations can be in namespaces.");
- return false;
- }
- }
- } break;
default: break;
}
} else if (t->token->kind == TOKEN_DIRECT) {
@@ -2181,6 +2182,11 @@ static void fprint_arg_exprs(FILE *out, Expression *args) {
fprintf(out, ")");
}
+static inline void fprint_nms(FILE *out, Namespace *nms) {
+ fprintf(out, "namespace ");
+ fprint_block(out, &nms->body);
+}
+
static void fprint_val(FILE *f, Value v, Type *t);
static void fprint_expr(FILE *out, Expression *e) {
@@ -2333,6 +2339,9 @@ static void fprint_expr(FILE *out, Expression *e) {
case EXPR_VAL:
fprint_val(out, e->val, &e->type);
break;
+ case EXPR_NMS:
+ fprint_nms(out, &e->nms);
+ break;
}
if (found_type) {
fprintf(out, ":");
@@ -2399,12 +2408,6 @@ static void fprint_stmt(FILE *out, Statement *s) {
fprintf(out, ";\n");
}
break;
- case STMT_NAMESPACE:
- fprintf(out, "namespace ");
- if (s->ns.name)
- fprint_ident(out, s->ns.name);
- fprint_block(out, &s->ns.body);
- break;
}
}
@@ -2460,6 +2463,7 @@ static bool expr_is_definitely_const(Expression *e) {
case EXPR_LITERAL_BOOL:
case EXPR_TYPE:
case EXPR_VAL:
+ case EXPR_NMS:
return true;
case EXPR_IF:
case EXPR_WHILE: