lexicouille
This commit is contained in:
parent
ab044c1126
commit
5bca08da05
48
lexer.c
48
lexer.c
|
@ -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;
|
||||||
|
|
5
lexer.h
5
lexer.h
|
@ -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
7
main.c
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue