#include "util.h" #include #include int is_whitespace(char c) { return c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == '\v' || c == '\f'; } int is_alpha(char c) { char tmp_lower = c - 'a'; char tmp_upper = c - 'A'; return (tmp_lower <= ('z' - 'a') && 0 <= tmp_lower) || (tmp_upper <= ('Z' - 'A') && 0 <= tmp_upper); } int is_digit(char c) { char tmp = c - '0'; return 0 <= tmp && tmp <= 9; } int is_alpha_digit(char c) { return is_digit(c) || is_alpha(c) || c == '_'; } void print_token(Token tok) { char token_name[20]; switch (tok.type) { case LBRACK: strcpy(token_name, "LBRACK"); break; case RBRACK: strcpy(token_name, "RBRACK"); break; case LCURLY: strcpy(token_name, "LCURLY"); break; case RCURLY: strcpy(token_name, "RCURLY"); break; case LPAREN: strcpy(token_name, "LPAREN"); break; case RPAREN: strcpy(token_name, "RPAREN"); break; case SEMI: strcpy(token_name, "SEMI"); break; case COMMA: strcpy(token_name, "COMMA"); break; case ARROW: strcpy(token_name, "ARROW"); break; case STAR: strcpy(token_name, "STAR"); break; case ANDREF: strcpy(token_name, "ANDREF"); break; case DOLLAR: strcpy(token_name, "DOLLAR"); break; case COMMENT: strcpy(token_name, "COMMENT"); break; case ID: strcpy(token_name, "ID"); break; case NUM: strcpy(token_name, "NUM"); break; case STRING_LITERAL: strcpy(token_name, "STRING_LITERAL"); break; case VAL: strcpy(token_name, "VAL"); break; case RETURN: strcpy(token_name, "RETURN"); break; case IF: strcpy(token_name, "IF"); break; case ELSE: strcpy(token_name, "ELSE"); break; case EOF_TOKEN: strcpy(token_name, "EOF_TOKEN"); break; case ERROR: strcpy(token_name, "ERROR"); break; default: strcpy(token_name, "UNKNOWN"); break; } printf("Token Name: %s ", token_name); printf("Line: %u ", tok.line); if (tok.type == ID || tok.type == NUM || tok.type == STRING_LITERAL) { printf("Data: %s", tok.data.string); } }