-typedef struct {
- int type;
- symbol_t *symbol; /**< contains identifier. Contains number suffix for numbers */
- string_t literal; /**< string value/literal value */
- source_position_t source_position;
-} token_t;
+typedef struct token_base_t token_base_t;
+typedef struct string_literal_t string_literal_t;
+typedef struct number_literal_t number_literal_t;
+typedef union token_t token_t;
+
+struct token_base_t {
+ unsigned kind;
+ source_position_t source_position;
+ symbol_t *symbol;
+};
+
+enum string_encoding_t {
+ STRING_ENCODING_CHAR,
+ STRING_ENCODING_WIDE
+};
+typedef enum string_encoding_t string_encoding_t;
+
+struct string_literal_t {
+ token_base_t base;
+ string_encoding_t encoding;
+ string_t string;
+};
+
+struct number_literal_t {
+ token_base_t base;
+ string_t number;
+ string_t suffix;
+};
+
+union token_t {
+ unsigned kind;
+ token_base_t base;
+ string_literal_t string;
+ number_literal_t number;
+};
+
+char const *get_string_encoding_prefix(string_encoding_t);