diff options
author | Teddy <[email protected]> | 2014-04-06 07:13:31 +0800 |
---|---|---|
committer | Teddy <[email protected]> | 2014-04-06 07:13:31 +0800 |
commit | fdd965eb0e9bab7a06de7d40824e1168aabdcd36 (patch) | |
tree | 7439c177213973b8b8163ff891c0f388121c2199 | |
parent | 4f0f6f064fc5c878bee2f614e1296b14e66fef8d (diff) |
...
-rw-r--r-- | README.rst | 2 | ||||
-rw-r--r-- | TODO.rst | 4 | ||||
-rw-r--r-- | semantics.c | 61 |
3 files changed, 39 insertions, 28 deletions
@@ -9,7 +9,7 @@ Build Requirements Features --------- -- Complex pointer support +- Complex declaration support (`int (*a)[10]`, `int (*f)()`, `int (*g(int ***e[10]))()`, etc.) - Forward declaration - Sophisticated error reporting - User-friendly AST printing @@ -9,3 +9,7 @@ TODO - Fix: - local function declaration is not in a local scope + +- Not Implemented: + + - Complex type name (to be in agreement with complex decl) diff --git a/semantics.c b/semantics.c index 81cbf11..68884ce 100644 --- a/semantics.c +++ b/semantics.c @@ -451,32 +451,6 @@ CVar_t semantics_p_decl(CNode *p, CScope_t scope) { return var; } -CType_t semantics_type_name(CNode *p, CScope_t scope) { - CNode *t, *ast; - CType_t tt, type; - if (p->type == TYPE_SPEC) - { - type = semantics_type_spec(p, scope); - ast = p; - } - else - { - type = ctype_create("", CPTR, p); /* pointer */ - for (t = p, tt = type;; t = t->chd) - { - if (t->chd->type == TYPE_SPEC) - { - tt->rec.ref = semantics_type_spec(t->chd, scope); - ast = t; - break; - } - tt->rec.ref = ctype_create("", CPTR, t); - tt = tt->rec.ref; - } - } - type->ast = ast; - return type; -} CVar_t semantics_params(CNode *p, CScope_t scope) { CHECK_TYPE(p, PARAMS); @@ -709,6 +683,39 @@ ExpType exp_check_aseq(ExpType lhs, ExpType rhs, CNode *ast) { #define IS_ARITH(tt) IS_INT(tt) #define IS_SCALAR(tt) (IS_ARITH(tt) || (tt) == CPTR || (tt) == CARR) +CType_t semantics_cast(CNode *p, CScope_t scope) { + CNode *t, *ast; + CType_t tt, type; + if (p->type == TYPE_SPEC) + { + type = semantics_type_spec(p, scope); + ast = p; + } + else + { + type = ctype_create("", CPTR, p); /* pointer */ + for (t = p, tt = type;; t = t->chd) + { + if (t->chd->type == TYPE_SPEC) + { + tt->rec.ref = semantics_type_spec(t->chd, scope); + ast = t; + break; + } + tt->rec.ref = ctype_create("", CPTR, t); + tt = tt->rec.ref; + } + } + if (!IS_SCALAR(type->type)) + { + sprintf(err_buff, "conversion to non-scalar type requested"); + ERROR(ast); + } + type->ast = ast; + return type; +} + + ExpType exp_check_arith(ExpType op1, ExpType op2, CNode *ast) { int t1 = op1.type->type, t2 = op2.type->type; @@ -1114,7 +1121,7 @@ ExpType semantics_exp(CNode *p, CScope_t scope) { res = exp_check_arith(op1, op2, p); break; case EXP_CAST: - res.type = semantics_type_name(p->chd, scope); + res.type = semantics_cast(p->chd, scope); res.lval = 0; break; case '&': |