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) {
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) {
static union {
char* text;
- uint32_t character;
- intptr_t integer;
+ long long integer;
double floating;
- bool boolean;
} Value;
static char* dupstring(const char* old) {
";" { 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);
}
true {
- Value.boolean = true;
+ Value.integer = 1;
return T_BOOL;
}
false {
- Value.boolean = false;
+ Value.integer = 0;
return T_BOOL;
}
/* 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);
TokType type;
union {
char* text;
- uint32_t character;
- intptr_t integer;
+ long long integer;
double floating;
- bool boolean;
} value;
} Tok;