minor implement lexer
This commit is contained in:
107
src/util.c
Normal file
107
src/util.c
Normal file
@@ -0,0 +1,107 @@
|
||||
#include "util.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
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);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
Reference in New Issue
Block a user