scc

Simple C99 Compiler
Log | Files | Refs | README | LICENSE

commit 67dd2d72eacab11d263530d495d0019168ea9d6e
parent da40be16dc3adcabf313f467b6ac91bca512038b
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date:   Tue, 24 Sep 2013 22:22:45 +0200

Add bit fields

Bit fields are small integers with a varible size of bits. C99
defines that bit fields can be of type int or type bool.

Diffstat:
decl.c | 12++++++++++++
tokens.h | 2+-
types.c | 2+-
3 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/decl.c b/decl.c @@ -122,6 +122,18 @@ struct_dcl(unsigned char ns) do { declarator(base, ns); tp = decl_type(base); + if (accept(':')) { + expect(CONSTANT); + switch (tp->type) { + case INT: case BOOL: + tp = btype(NULL, BITFLD); + tp->len = yyval.sym->val; + break; + default: + error("bit-field '%s' has invalid type", + cursym->name); + } + } (cursym->ctype = tp)->refcnt++; } while (accept(',')); diff --git a/tokens.h b/tokens.h @@ -11,7 +11,7 @@ enum tokens { /* types */ INT = 1, CHAR, FLOAT, LONG, LLONG, SHORT, VOID, DOUBLE, LDOUBLE, STRUCT, UNION, ENUM, BOOL, ARY, PTR, FTN, - COMPLEX, IMAGINARY, + COMPLEX, IMAGINARY, BITFLD, /* storage specifier */ TYPEDEF, EXTERN, STATIC, AUTO, REGISTER, /* type qualifier */ diff --git a/types.c b/types.c @@ -93,7 +93,7 @@ btype(struct ctype *tp, unsigned char tok) type = tp->type; switch (tok) { - case VOID: case BOOL: case STRUCT: case UNION: case ENUM: + case VOID: case BOOL: case STRUCT: case UNION: case ENUM: case BITFLD: if (type) goto two_or_more;; type = tok;