aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/parser.c52
-rw-r--r--src/parser.h2
2 files changed, 28 insertions, 26 deletions
diff --git a/src/parser.c b/src/parser.c
index 6273fd7..b79d1f0 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -33,7 +33,7 @@ parsetoks(struct lexemes toks)
struct ast ast = mkast();
for (;;) {
- parsedecl(&ast, toks);
+ (void)parsedecl(&ast, toks);
if (toks.kinds[toksidx] == LEXEOF)
break;
}
@@ -53,7 +53,8 @@ parseblk(struct ast *ast, struct lexemes toks)
err("parser: Expected left brace");
while (toks.kinds[toksidx] != LEXRBRACE) {
- ast->kids[i].rhs = parsestmt(ast, toks);
+ idx_t_ stmt = parsestmt(ast, toks);
+ ast->kids[i].rhs = stmt;
if (ast->kids[i].lhs == AST_EMPTY)
ast->kids[i].lhs = ast->kids[i].rhs;
}
@@ -73,9 +74,9 @@ parsedecl(struct ast *ast, struct lexemes toks)
if (toks.kinds[toksidx++] != LEXCOLON)
err("parser: Expected colon");
- ast->kids[i].lhs = toks.kinds[toksidx] == LEXIDENT
- ? parsetype(ast, toks)
- : AST_EMPTY;
+ idx_t_ lhs = toks.kinds[toksidx] == LEXIDENT ? parsetype(ast, toks)
+ : AST_EMPTY;
+ ast->kids[i].lhs = lhs;
switch (toks.kinds[toksidx++]) {
case LEXSEMI:
@@ -94,7 +95,8 @@ parsedecl(struct ast *ast, struct lexemes toks)
err("parser: Expected semicolon or equals");
}
- ast->kids[i].rhs = parseexpr(ast, toks);
+ idx_t_ rhs = parseexpr(ast, toks);
+ ast->kids[i].rhs = rhs;
if (toks.kinds[toksidx++] != LEXSEMI)
err("parser: Expected semicolon");
@@ -114,8 +116,10 @@ parseexpr(struct ast *ast, struct lexemes toks)
break;
case LEXLPAR:
ast->kinds[i] = ASTFN;
- ast->kids[i].lhs = parseproto(ast, toks);
- ast->kids[i].rhs = parseblk(ast, toks);
+ idx_t_ lhs = parseproto(ast, toks);
+ idx_t_ rhs = parseblk(ast, toks);
+ ast->kids[i].lhs = lhs;
+ ast->kids[i].rhs = rhs;
break;
default:
err("parser: Expected expression");
@@ -137,9 +141,9 @@ parseproto(struct ast *ast, struct lexemes toks)
if (toks.kinds[toksidx++] != LEXRPAR)
err("parser: Expected right parenthesis");
- ast->kids[i].rhs = toks.kinds[toksidx] == LEXIDENT
- ? parsetype(ast, toks)
- : AST_EMPTY;
+ idx_t_ rhs = toks.kinds[toksidx] == LEXIDENT ? parsetype(ast, toks)
+ : AST_EMPTY;
+ ast->kids[i].rhs = rhs;
return i;
}
@@ -156,10 +160,10 @@ parsestmt(struct ast *ast, struct lexemes toks)
i = astalloc(ast);
ast->lexemes[i] = toksidx++;
ast->kinds[i] = ASTRET;
- if (toks.kinds[toksidx] != LEXSEMI)
- ast->kids[i].rhs = parseexpr(ast, toks);
- else
- ast->kids[i].rhs = AST_EMPTY;
+
+ idx_t_ rhs = toks.kinds[toksidx] != LEXSEMI ? parseexpr(ast, toks)
+ : AST_EMPTY;
+ ast->kids[i].rhs = rhs;
if (toks.kinds[toksidx++] != LEXSEMI)
err("parser: Expected semicolon");
} else if (toks.kinds[toksidx + 1] == LEXCOLON)
@@ -188,11 +192,10 @@ mkast(void)
{
struct ast soa;
- static_assert(AST_DFLT_CAP * sizeof(*soa.kinds) % alignof(*soa.lexemes)
- == 0,
+ static_assert(AST_DFLT_CAP * sizeof(*soa.kinds) % alignof(idx_t_) == 0,
"Additional padding is required to properly align LEXEMES");
static_assert(AST_DFLT_CAP * (sizeof(*soa.kinds) + sizeof(*soa.lexemes))
- % alignof(*soa.kids)
+ % alignof(struct pair)
== 0,
"Additional padding is required to properly align KIDS");
@@ -224,16 +227,15 @@ astresz(struct ast *soa)
ncap = soa->cap << 1;
/* Ensure that soa->lexemes is properly aligned */
- pad1 = alignof(*soa->lexemes)
- - ncap * sizeof(*soa->kinds) % alignof(*soa->lexemes);
- if (pad1 == alignof(*soa->lexemes))
+ pad1 = alignof(idx_t_) - ncap * sizeof(ast_kind_t_) % alignof(idx_t_);
+ if (pad1 == alignof(idx_t_))
pad1 = 0;
/* Ensure that soa->kids is properly aligned */
- pad2 = alignof(*soa->kids)
- - (ncap * (sizeof(*soa->kinds) + sizeof(*soa->lexemes)) + pad1)
- % alignof(*soa->kids);
- if (pad2 != alignof(*soa->kids))
+ pad2 = alignof(struct pair)
+ - (ncap * (sizeof(ast_kind_t_) + sizeof(idx_t_)) + pad1)
+ % alignof(struct pair);
+ if (pad2 == alignof(struct pair))
pad2 = 0;
newsz = ncap * AST_SOA_BLKSZ + pad1 + pad2;
diff --git a/src/parser.h b/src/parser.h
index ee6b324..96a0ed8 100644
--- a/src/parser.h
+++ b/src/parser.h
@@ -59,7 +59,7 @@ static_assert(_AST_LAST_ENT - 1 <= (ast_kind_t_)-1,
struct ast {
ast_kind_t_ *kinds;
idx_t_ *lexemes;
- struct {
+ struct pair {
idx_t_ lhs, rhs;
} *kids;
size_t len, cap;