From 46f7b8b34c9909dc091a60dd6584267db8b0871e Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Fri, 15 Mar 2019 22:54:55 -0400 Subject: [PATCH] combined integer fields in the token union --- source/ast.c | 8 ++++---- source/lexer.l | 20 +++++++++----------- source/pprint.c | 6 +++--- source/sclpl.h | 4 +--- 4 files changed, 17 insertions(+), 21 deletions(-) diff --git a/source/ast.c b/source/ast.c index 380e186..2a8afbe 100644 --- a/source/ast.c +++ b/source/ast.c @@ -20,13 +20,13 @@ char* string_value(AST* val) { AST* Char(Tok* val) { AST* node = ast(AST_CHAR); - node->value.character = val->value.character; + node->value.integer = val->value.integer; return node; } uint32_t char_value(AST* val) { assert(val->nodetype == AST_CHAR); - return val->value.character; + return val->value.integer; } AST* Integer(Tok* val) { @@ -53,13 +53,13 @@ double float_value(AST* val) { AST* Bool(Tok* val) { AST* node = ast(AST_BOOL); - node->value.boolean = val->value.boolean; + node->value.integer = val->value.integer; return node; } bool bool_value(AST* val) { assert(val->nodetype == AST_BOOL); - return val->value.boolean; + return val->value.integer; } AST* Ident(Tok* val) { diff --git a/source/lexer.l b/source/lexer.l index e5a4587..4958cb4 100644 --- a/source/lexer.l +++ b/source/lexer.l @@ -3,10 +3,8 @@ static union { char* text; - uint32_t character; - intptr_t integer; + long long integer; double floating; - bool boolean; } Value; static char* dupstring(const char* old) { @@ -62,12 +60,12 @@ NOSPACE [^ \t\r\n] ";" { return ';'; } "*" { return '*'; } -\\. { Value.character = yytext[1]; return T_CHAR; } -\\space { Value.character = ' '; return T_CHAR; } -\\newline { Value.character = '\n'; return T_CHAR; } -\\return { Value.character = '\r'; return T_CHAR; } -\\tab { Value.character = '\t'; return T_CHAR; } -\\vtab { Value.character = '\v'; return T_CHAR; } +\\. { Value.integer = yytext[1]; return T_CHAR; } +\\space { Value.integer = ' '; return T_CHAR; } +\\newline { Value.integer = '\n'; return T_CHAR; } +\\return { Value.integer = '\r'; return T_CHAR; } +\\tab { Value.integer = '\t'; return T_CHAR; } +\\vtab { Value.integer = '\v'; return T_CHAR; } 0b[01]+ { Value.integer = strtol(&yytext[2], NULL, 2); @@ -107,12 +105,12 @@ NOSPACE [^ \t\r\n] } true { - Value.boolean = true; + Value.integer = 1; return T_BOOL; } false { - Value.boolean = false; + Value.integer = 0; return T_BOOL; } diff --git a/source/pprint.c b/source/pprint.c index b4e3344..7eb8bba 100644 --- a/source/pprint.c +++ b/source/pprint.c @@ -61,10 +61,10 @@ void pprint_token_value(FILE* file, Tok* token) { /* value tokens */ case T_STRING: fprintf(file, "\"%s\"", token->value.text); break; case T_ID: fprintf(file, "%s", token->value.text); break; - case T_CHAR: print_char(file, token->value.character); break; - case T_INT: fprintf(file, "%ld", token->value.integer); break; + case T_CHAR: print_char(file, token->value.integer); break; + case T_INT: fprintf(file, "%lld", token->value.integer); break; case T_FLOAT: fprintf(file, "%f", token->value.floating); break; - case T_BOOL: fprintf(file, "%s", (token->value.boolean)?"true":"false"); break; + case T_BOOL: fprintf(file, "%s", (token->value.integer)?"true":"false"); break; /* keyword tokens */ TOK(T_NONE); TOK(T_ERROR); TOK(T_END_FILE); TOK(T_PACKAGE); diff --git a/source/sclpl.h b/source/sclpl.h index f3c435c..a9429af 100644 --- a/source/sclpl.h +++ b/source/sclpl.h @@ -36,10 +36,8 @@ typedef struct { TokType type; union { char* text; - uint32_t character; - intptr_t integer; + long long integer; double floating; - bool boolean; } value; } Tok; -- 2.54.0