minor implement lexer

This commit is contained in:
2025-11-15 08:01:34 +09:00
parent 171006117e
commit 682cbdc216
10 changed files with 407 additions and 20 deletions

107
src/util.c Normal file
View 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");
}