#include "symbol.h"
#include "lang_features.h"
#include "adt/array.h"
+#include "adt/error.h"
#include "adt/util.h"
static symbol_t *token_symbols[T_LAST_TOKEN];
}
}
+char const *get_string_encoding_prefix(string_encoding_t const enc)
+{
+ switch (enc) {
+ case STRING_ENCODING_CHAR: return "";
+ case STRING_ENCODING_WIDE: return "L";
+ }
+ panic("invalid string encoding");
+}
+
static void print_stringrep(const string_t *string, FILE *f)
{
for (size_t i = 0; i < string->size; ++i) {
{
switch(token->kind) {
case T_IDENTIFIER:
- fprintf(f, "identifier '%s'", token->identifier.symbol->string);
+ fprintf(f, "identifier '%s'", token->base.symbol->string);
break;
case T_INTEGER:
- case T_INTEGER_OCTAL:
- case T_INTEGER_HEXADECIMAL:
case T_FLOATINGPOINT:
- case T_FLOATINGPOINT_HEXADECIMAL:
print_token_kind(f, (token_kind_t)token->kind);
fputs(" '", f);
print_stringrep(&token->number.number, f);
print_stringrep(&token->number.suffix, f);
fputc('\'', f);
break;
- case T_WIDE_STRING_LITERAL:
- case T_STRING_LITERAL:
- print_token_kind(f, (token_kind_t)token->kind);
- fprintf(f, " \"%s\"", token->string.string.begin);
- break;
- case T_CHARACTER_CONSTANT:
- case T_WIDE_CHARACTER_CONSTANT:
+
+ char delim;
+ case T_STRING_LITERAL: delim = '"'; goto print_string;
+ case T_CHARACTER_CONSTANT: delim = '\''; goto print_string;
+print_string:
print_token_kind(f, (token_kind_t)token->kind);
- fputs(" \'", f);
+ fprintf(f, " %s%c", get_string_encoding_prefix(token->string.encoding), delim);
print_stringrep(&token->string.string, f);
- fputs("'", f);
+ fputc(delim, f);
break;
+
default:
- fputc('\'', f);
- print_token_kind(f, (token_kind_t)token->kind);
- fputc('\'', f);
+ if (token->base.symbol) {
+ fprintf(f, "'%s'", token->base.symbol->string);
+ } else {
+ fputc('\'', f);
+ print_token_kind(f, (token_kind_t)token->kind);
+ fputc('\'', f);
+ }
break;
}
}
{
switch((preprocessor_token_kind_t) token->kind) {
case TP_IDENTIFIER:
- fprintf(f, "identifier '%s'", token->identifier.symbol->string);
+ fprintf(f, "identifier '%s'", token->base.symbol->string);
break;
case TP_NUMBER:
fprintf(f, "number '%s'", token->number.number.begin);
case TP_IDENTIFIER:
return token2 == TP_IDENTIFIER || token2 == TP_NUMBER ||
token2 == TP_CHARACTER_CONSTANT ||
- token2 == TP_WIDE_CHARACTER_CONSTANT ||
- token2 == TP_WIDE_STRING_LITERAL ||
token2 == TP_STRING_LITERAL; /* L */
case TP_NUMBER:
return token2 == TP_NUMBER || token2 == TP_IDENTIFIER ||