#include #include #include #include #include #include /// gcc -g ../lexer.c ../token.c test_lexer.c -o test_lexer /* tok_tConstant { int have; union { char ch; int i; float f; double d; long long ll; char* str; }; }; */ int g_num; int g_num_arr[3]; int main(int argc, char *argv[]) { // int num = 0; if (argc == 3 && strcmp(argv[2], "--debug") == 0) { log_set_level(NULL, LOG_LEVEL_ALL); } else { // FIXME it is a hack lexer_logger log_set_level(&__smcc_lexer_log, LOG_LEVEL_NOTSET); log_set_level(NULL, LOG_LEVEL_INFO | LOG_LEVEL_WARN | LOG_LEVEL_ERROR); } const char *file_name = __FILE__; if (argc == 2) { file_name = argv[1]; } FILE *fp = fopen(file_name, "rb"); if (fp == NULL) { perror("open file failed"); return 1; } if (fseek(fp, 0, SEEK_END) != 0) { perror("fseek failed"); return 1; } usize fsize = ftell(fp); LOG_INFO("file size: %zu", fsize); if (fseek(fp, 0, SEEK_SET)) { perror("fseek failed"); return 1; } char *buffer = (char *)malloc(fsize); usize read_ret = fread(buffer, 1, fsize, fp); fclose(fp); if (read_ret != fsize) { LOG_FATAL("fread failed read_ret %u != fsize %u", read_ret, fsize); free(buffer); return 1; } scc_lexer_t lexer; scc_mem_probe_stream_t mem_stream = {0}; scc_probe_stream_t *stream = scc_mem_probe_stream_init(&mem_stream, buffer, fsize, false); Assert(stream != null); scc_cstring_clear(&stream->name); scc_cstring_append_cstr(&stream->name, file_name, strlen(file_name)); scc_lexer_init(&lexer, stream); scc_lexer_tok_t tok; while (1) { scc_lexer_get_valid_token(&lexer, &tok); if (tok.type == SCC_TOK_EOF) { break; } LOG_DEBUG("token `%s` at %s:%u:%u", scc_get_tok_name(tok.type), scc_cstring_as_cstr(&tok.loc.name), tok.loc.line, tok.loc.col); Assert(tok.loc.offset <= fsize); // LOG_DEBUG("%s", tok.val.str); // printf("line: %d, column: %d, type: %3d, typename: %s\n", // lexer.line, lexer.index, tok.type, scc_get_tok_name(tok.type)); } free(buffer); LOG_INFO("Lexer is Ok..."); return 0; }