lexicouille

This commit is contained in:
_N3m0 2024-01-02 21:44:27 +01:00
parent ab044c1126
commit 5bca08da05
3 changed files with 40 additions and 20 deletions

48
lexer.c
View File

@ -17,11 +17,10 @@ Cursor prev = {
.offset = -2, .offset = -2,
}; };
void increment_cursor(Cursor* cur){ int increment_cursor(Cursor* cur){
if (cur->offset+1 < 0){ if (cur->offset+1 < 0){
printf("init prev cursor.\n");
cur->offset++; cur->offset++;
return; return 0;
} }
if (page.chunks[cur->chunk][cur->offset+1] == '\0'){ if (page.chunks[cur->chunk][cur->offset+1] == '\0'){
@ -30,11 +29,18 @@ void increment_cursor(Cursor* cur){
} else { } else {
cur->offset++; cur->offset++;
} }
if (cur->chunk >= page.len){
return -1;
}
return 0;
} }
char* nextchar(void){ char* nextchar(void){
increment_cursor(&cursor); if (increment_cursor(&cursor) < 0 || increment_cursor(&prev) < 0){
increment_cursor(&prev); return NULL;
}
if (cursor.chunk >= page.len){ if (cursor.chunk >= page.len){
return NULL; return NULL;
@ -48,10 +54,7 @@ void go_back(void){
cursor.offset = prev.offset; cursor.offset = prev.offset;
prev.offset--; prev.offset--;
printf("got back mf.\n");
if (cursor.chunk < 0 || cursor.offset < 0){ if (cursor.chunk < 0 || cursor.offset < 0){
printf("chunk = %d | offset= %d\n", cursor.chunk, cursor.offset);
puts("ERROR: go way too back."); puts("ERROR: go way too back.");
exit(1); exit(1);
} }
@ -64,6 +67,14 @@ TokenType token_by_name(const char name[HTML_BALISE_LEN]){
return BODY; return BODY;
} else if (strncmp(name, "/body", HTML_BALISE_LEN) == 0){ } else if (strncmp(name, "/body", HTML_BALISE_LEN) == 0){
return END_BODY; return END_BODY;
} else if (strncmp(name, "html", HTML_BALISE_LEN) == 0){
return HTML;
} else if (strncmp(name, "/html", HTML_BALISE_LEN) == 0){
return END_HTML;
} else if (strncmp(name, "a", HTML_BALISE_LEN) == 0){
return A;
} else if (strncmp(name, "/a", HTML_BALISE_LEN) == 0){
return END_A;
} else if (strncmp(name, "ul", HTML_BALISE_LEN) == 0){ } else if (strncmp(name, "ul", HTML_BALISE_LEN) == 0){
return UL; return UL;
} else if (strncmp(name, "li", HTML_BALISE_LEN) == 0){ } else if (strncmp(name, "li", HTML_BALISE_LEN) == 0){
@ -90,8 +101,9 @@ Token* nexttoken(void){
static char* cursor = NULL; static char* cursor = NULL;
cursor = nextchar(); cursor = nextchar();
while (*cursor == '\n'){ if (cursor == NULL) return NULL;
printf("new line skipped.\n");
while (*cursor == '\0' || *cursor == ' ' || *cursor == '\n' || *cursor == '\t'){
cursor = nextchar(); cursor = nextchar();
} }
@ -101,7 +113,6 @@ Token* nexttoken(void){
do { do {
cursor = nextchar(); cursor = nextchar();
i++; i++;
printf("text: '%c'.\n", *cursor);
} while (*cursor != '<'); } while (*cursor != '<');
go_back(); go_back();
@ -117,7 +128,6 @@ Token* nexttoken(void){
while (*cursor != '>' && *cursor != ' ' && len < HTML_BALISE_LEN){ while (*cursor != '>' && *cursor != ' ' && len < HTML_BALISE_LEN){
balise[len] = *cursor; balise[len] = *cursor;
len++; len++;
printf("balise: '%c'.\n", *cursor);
cursor = nextchar(); cursor = nextchar();
} }
@ -127,9 +137,9 @@ Token* nexttoken(void){
strncpy(token->value, balise, len+1); strncpy(token->value, balise, len+1);
token->len = len; token->len = len;
go_back();
do { do {
cursor = nextchar(); cursor = nextchar();
printf("skip: '%c'.\n", *cursor);
} while (*cursor != '>'); } while (*cursor != '>');
} }
@ -158,6 +168,18 @@ void printtoken(Token* token){
case END_BODY: case END_BODY:
printf("END_BODY: "); printf("END_BODY: ");
break; break;
case HTML:
printf("HTML: ");
break;
case END_HTML:
printf("END_HTML: ");
break;
case A:
printf("A: ");
break;
case END_A:
printf("END_A: ");
break;
case UL: case UL:
printf("UL: "); printf("UL: ");
break; break;

View File

@ -11,8 +11,9 @@ typedef enum TokenType {
UNDEFINED_TYPE, UNDEFINED_TYPE,
DONT_CARE, DONT_CARE,
TEXT, TEXT,
BODY, BODY, END_BODY,
END_BODY, HTML, END_HTML,
A, END_A,
UL, LI, UL, LI,
H1, H2, H3, H4, H5, H6, H1, H2, H3, H4, H5, H6,
} TokenType; } TokenType;

7
main.c
View File

@ -7,15 +7,12 @@ int main(int argc, char* argv[]){
getUserConfig(argc, argv); getUserConfig(argc, argv);
getPage(); getPage();
printPage();
Token* token = NULL; Token* token = NULL;
do { do {
token = nexttoken(); token = nexttoken();
printtoken(token); printtoken(token);
} while (token != NULL && token->type != UNDEFINED_TYPE); //evaluate(token);
} while (token != NULL && token->type != END_HTML);
//parse(token);
return 0; return 0;
} }