diff options
author | c+1 | 2023-05-12 11:49:12 -0400 |
---|---|---|
committer | c+1 | 2023-05-12 11:49:12 -0400 |
commit | 17d6e6a265c44569f4533e12cc04442013ab3b3e (patch) | |
tree | 25233a2ca455b220a6ecae4d46139a55fd8b100b /src/lexer.c | |
parent | 07077e2974d74efaee109c9da3500ef86aeecd06 (diff) |
nothing workds help
Diffstat (limited to 'src/lexer.c')
-rw-r--r-- | src/lexer.c | 88 |
1 files changed, 73 insertions, 15 deletions
diff --git a/src/lexer.c b/src/lexer.c index 77de3e4..d8534c2 100644 --- a/src/lexer.c +++ b/src/lexer.c @@ -19,10 +19,9 @@ lexer_t* lexer_init(char* content) { } void lexer_next(lexer_t* lexer) { - // if not at end of line or file if (lexer->c != '\0' && lexer->i < strlen(lexer->content)) { - lexer->i += 1; // advance index 1 character - lexer->c = lexer->content[lexer->i]; // set character w/ index + lexer->i += 1; + lexer->c = lexer->content[lexer->i]; } } @@ -37,20 +36,33 @@ void lexer_pass(lexer_t* lexer) { token_t* lexer_get_next_token(lexer_t* lexer) { while (lexer->c != '\0' && lexer->i < strlen(lexer->content)) { - if (lexer->c == ' ' || - lexer->c == '\t' || - lexer->c == '\n') { - lexer_pass(lexer); + if ( + lexer->c == ' ' || + lexer->c == '\t' || + lexer->c == '\n' + ) { + lexer_pass(lexer); } - if (isalnum(lexer->c)) + if ( + isalnum(lexer->c) || + lexer->c == '_' + ) { return lexer_get_keyword(lexer); + } switch (lexer->c) { - case '"': + case '\'': return lexer_get_string(lexer); break; case '[': return lexer_get_comment(lexer); break; + case ']': return lexer_next_token( + lexer, + token_init( + TOKEN_COMM_DELIM_END, + lexer_get_c_as_string(lexer) + ) + ); break; case '=': return lexer_get_def_const(lexer); break; case '-': @@ -76,8 +88,45 @@ token_t* lexer_get_next_token(lexer_t* lexer) { lexer_get_c_as_string(lexer) ) ); break; - case '#': + case '#': + return lexer_get_directive(lexer); break; + case '.': return lexer_next_token( + lexer, + token_init( + TOKEN_FN_APPLY, + lexer_get_c_as_string(lexer) + ) + ); break; + case ',': return lexer_next_token( + lexer, + token_init( + TOKEN_LIST_DELIM, + lexer_get_c_as_string(lexer) + ) + ); break; + case ':': return lexer_next_token( + lexer, + token_init( + TOKEN_MODULE_MEMBER_DELIM, + lexer_get_c_as_string(lexer) + ) + ); break; + case '{': return lexer_next_token( + lexer, + token_init( + TOKEN_BLOCK_DELIM_START, + lexer_get_c_as_string(lexer) + ) + ); break; + case '}': return lexer_next_token( + lexer, + token_init( + TOKEN_BLOCK_DELIM_END, + lexer_get_c_as_string(lexer) + ) + ); break; default: + fputs("Unrecognized token.", stderr); exit(1); } } @@ -91,7 +140,7 @@ token_t* lexer_get_string(lexer_t* lexer) { char* str_so_far = calloc(1, sizeof(char)); str_so_far[0] = '\0'; - while (lexer->c != '"') { + while (lexer->c != '\'') { char* current = lexer_get_c_as_string(lexer); str_so_far = realloc( str_so_far, @@ -110,14 +159,23 @@ token_t* lexer_get_string(lexer_t* lexer) { token_t* lexer_get_comment(lexer_t* lexer) { lexer_next(lexer); + char* comment_so_far = calloc(1, sizeof(char)); + while (lexer->c != ']') { - lexer_next(lexer); // don't need to keep track of comments - // for now. might change this later. + char* current = lexer_get_c_as_string(lexer); + comment_so_far = realloc( + comment_so_far, + (strlen(comment_so_far) + strlen(current) * sizeof(char)) + ); + + strcat(comment_so_far, current); + + lexer_next(lexer); } lexer_next(lexer); // skip over closing ] - return token_init(TOKEN_COMM, lexer_get_c_as_string(lexer)); + return token_init(TOKEN_COMM, comment_so_far); } token_t* lexer_get_def_const(lexer_t* lexer) { @@ -165,7 +223,7 @@ token_t* lexer_get_keyword(lexer_t* lexer) { char* str_so_far = calloc(1, sizeof(char)); str_so_far[0] = '\0'; - while (isalnum(lexer->c)) { + while (isalnum(lexer->c) || (lexer->c != '.' && lexer->c != ',')) { char* current = lexer_get_c_as_string(lexer); str_so_far = realloc(str_so_far, (strlen(str_so_far) + strlen(current) * sizeof(char))); strcat(str_so_far, current); |