151 lines
2.7 KiB
C
151 lines
2.7 KiB
C
#include "token.h"
|
|
|
|
#include <fx/string.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
struct lex_token *lex_token_create(enum token_type type)
|
|
{
|
|
struct lex_token *out = malloc(sizeof *out);
|
|
if (!out) {
|
|
return NULL;
|
|
}
|
|
|
|
memset(out, 0x0, sizeof *out);
|
|
|
|
out->tok_type = type;
|
|
|
|
return out;
|
|
}
|
|
|
|
struct lex_token *lex_token_create_with_string(
|
|
enum token_type type,
|
|
const char *s)
|
|
{
|
|
struct lex_token *tok = lex_token_create(type);
|
|
if (!tok) {
|
|
return NULL;
|
|
}
|
|
|
|
tok->tok_str = fx_strdup(s);
|
|
if (!tok->tok_str) {
|
|
free(tok);
|
|
return NULL;
|
|
}
|
|
|
|
return tok;
|
|
}
|
|
|
|
void lex_token_destroy(struct lex_token *tok)
|
|
{
|
|
switch (tok->tok_type) {
|
|
case TOK_WORD:
|
|
case TOK_FLAG:
|
|
case TOK_STRING:
|
|
if (tok->tok_str) {
|
|
free(tok->tok_str);
|
|
}
|
|
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
free(tok);
|
|
}
|
|
|
|
struct lex_token *lex_token_change_type(
|
|
struct lex_token *tok,
|
|
enum token_type new_type)
|
|
{
|
|
switch (tok->tok_type) {
|
|
case TOK_WORD:
|
|
case TOK_FLAG:
|
|
case TOK_STRING:
|
|
if (tok->tok_str) {
|
|
free(tok->tok_str);
|
|
tok->tok_str = NULL;
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
tok->tok_type = new_type;
|
|
return tok;
|
|
}
|
|
|
|
#define ENUM_STR(x) \
|
|
case x: \
|
|
return #x
|
|
|
|
const char *token_type_to_string(enum token_type type)
|
|
{
|
|
switch (type) {
|
|
ENUM_STR(TOK_NONE);
|
|
ENUM_STR(TOK_KEYWORD);
|
|
ENUM_STR(TOK_SYMBOL);
|
|
ENUM_STR(TOK_INT);
|
|
ENUM_STR(TOK_DOUBLE);
|
|
ENUM_STR(TOK_WORD);
|
|
ENUM_STR(TOK_VAR);
|
|
ENUM_STR(TOK_VAR_SPLAT);
|
|
ENUM_STR(TOK_FLAG);
|
|
ENUM_STR(TOK_STRING);
|
|
ENUM_STR(TOK_STR_START);
|
|
ENUM_STR(TOK_STR_END);
|
|
ENUM_STR(TOK_LINEFEED);
|
|
default:
|
|
return "<unknown>";
|
|
}
|
|
}
|
|
|
|
const char *token_keyword_to_string(enum token_keyword keyword)
|
|
{
|
|
switch (keyword) {
|
|
ENUM_STR(KW_NONE);
|
|
ENUM_STR(KW_FUNC);
|
|
ENUM_STR(KW_IF);
|
|
ENUM_STR(KW_ELSE);
|
|
default:
|
|
return "<unknown>";
|
|
}
|
|
}
|
|
|
|
const char *token_symbol_to_string(enum token_symbol sym)
|
|
{
|
|
switch (sym) {
|
|
ENUM_STR(SYM_NONE);
|
|
ENUM_STR(SYM_PLUS);
|
|
ENUM_STR(SYM_HYPHEN);
|
|
ENUM_STR(SYM_FORWARD_SLASH);
|
|
ENUM_STR(SYM_ASTERISK);
|
|
ENUM_STR(SYM_AMPERSAND);
|
|
ENUM_STR(SYM_PERCENT);
|
|
ENUM_STR(SYM_SQUOTE);
|
|
ENUM_STR(SYM_DQUOTE);
|
|
ENUM_STR(SYM_HASH);
|
|
ENUM_STR(SYM_SEMICOLON);
|
|
ENUM_STR(SYM_COMMA);
|
|
ENUM_STR(SYM_DOLLAR);
|
|
ENUM_STR(SYM_DOLLAR_LEFT_PAREN);
|
|
ENUM_STR(SYM_PIPE);
|
|
ENUM_STR(SYM_AT);
|
|
ENUM_STR(SYM_AT_LEFT_BRACE);
|
|
ENUM_STR(SYM_LEFT_BRACE);
|
|
ENUM_STR(SYM_RIGHT_BRACE);
|
|
ENUM_STR(SYM_LEFT_BRACKET);
|
|
ENUM_STR(SYM_RIGHT_BRACKET);
|
|
ENUM_STR(SYM_LEFT_PAREN);
|
|
ENUM_STR(SYM_RIGHT_PAREN);
|
|
ENUM_STR(SYM_EQUAL);
|
|
ENUM_STR(SYM_PLUS_EQUAL);
|
|
ENUM_STR(SYM_HYPHEN_EQUAL);
|
|
ENUM_STR(SYM_FORWARD_SLASH_EQUAL);
|
|
ENUM_STR(SYM_ASTERISK_EQUAL);
|
|
ENUM_STR(SYM_PERCENT_EQUAL);
|
|
default:
|
|
return "<unknown>";
|
|
}
|
|
}
|