Files
bshell/bshell/parse/token.c
T

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>";
}
}