diff options
Diffstat (limited to 'src/core/scanner.c')
| -rw-r--r-- | src/core/scanner.c | 139 |
1 files changed, 31 insertions, 108 deletions
diff --git a/src/core/scanner.c b/src/core/scanner.c index 96d3756..8b4c373 100644 --- a/src/core/scanner.c +++ b/src/core/scanner.c @@ -1,13 +1,12 @@ /*:* *: File: ./src/core/scanner.c - *: A simple interpreter + *: A simple Fype interpreter *: - *: WWW : http://fype.buetow.org - *: AUTHOR : http://paul.buetow.org - *: E-Mail : fype at dev.buetow.org + *: WWW: http://fype.buetow.org + *: AUTHOR: http://paul.buetow.org + *: E-Mail: fype at dev.buetow.org *: - *: Copyright (c) 2005 - 2009, Dipl.-Inform. (FH) Paul C. Buetow - *: All rights reserved. + *: The Fype Language; (c) 2005 - 2010 Paul Buetow *: *: Redistribution and use in source and binary forms, with or without modi- *: fication, are permitted provided that the following conditions are met: @@ -38,8 +37,7 @@ #include <ctype.h> #include <string.h> -const char _TOKENENDS[] = "}])+-*/={([<>;:,.!"; -#define _ADD_SEMICOLON_INDEX 2 +const char _TOKEN_ENDS[] = "()"; int _CODESTR_INDEX = 0; Scanner* @@ -70,8 +68,8 @@ scanner_new(List *p_list_token, Tupel *p_tupel_argv) { p_scanner->i_current_line_nr = 1; p_scanner->i_current_pos_nr = 0; - p_scanner->i_num_tokenends = strlen(_TOKENENDS); - p_scanner->tt_last = TT_NONE; + p_scanner->i_num_tokenends = strlen(_TOKEN_ENDS); + p_scanner->tt_last = TT_IDENT; return p_scanner; } @@ -83,66 +81,6 @@ scanner_delete(Scanner *p_scanner) { free(p_scanner); } -void -_add_semicolon_to_list(Scanner *p_scanner) { - int i_token_len = 1; - char *c_token = calloc(2, sizeof(char*)); - c_token[0] = ';'; - c_token[1] = '\0'; - scanner_add_token(p_scanner, &c_token, &i_token_len, TT_SEMICOLON); -} - -void -scanner_post_task(Scanner *p_scanner) { - List *p_list_token = scanner_get_list_token(p_scanner); - ListIterator *p_iter = listiterator_new(p_list_token); - - Token *pt_last[] = { NULL, NULL }; - TokenType tt_last[] = { TT_NONE, TT_NONE }; - - while (listiterator_has_next(p_iter)) { - ListElem *p_le = listiterator_next_elem(p_iter); - Token *p_token = p_le->p_val; - TokenType tt_cur = token_get_tt(p_token); - - if (pt_last[0]) { - if (tt_cur == TT_INTEGER && tt_last[1] == TT_DOT - && tt_last[0] == TT_INTEGER) { - - token_ref_down(pt_last[0]); - token_ref_down(pt_last[1]); - - char *c_2 = token_get_val(p_token); - char *c_0 = token_get_val(pt_last[0]); - int i_len = strlen(c_2) + strlen(c_0) + 1; - char *c_new = calloc(i_len+1, sizeof(char)); - - sprintf(c_new, "%s.%s", c_0, c_2); - free(c_2); - c_new[i_len] = 0; - - token_set_val(p_token, c_new); - token_set_tt(p_token, TT_DOUBLE); - token_set_dval(p_token, atof(c_new)); - - list_remove_elem(p_list_token, p_le->p_prev); - list_remove_elem(p_list_token, p_le->p_prev); - - pt_last[0] = pt_last[1] = NULL; - tt_last[0] = tt_last[1] = TT_NONE; - } - } - - tt_last[0] = tt_last[1]; - tt_last[1] = tt_cur; - - pt_last[0] = pt_last[1]; - pt_last[1] = p_token; - } - - listiterator_delete(p_iter); -} - _Bool _scanner_has_next_char(Scanner *p_scanner) { if (p_scanner->fp) @@ -211,7 +149,6 @@ scanner_run(Fype *p_fype) { } { int i_num_nl = 0; - //_Bool flag = false; do { c = _scanner_get_next_char(p_scanner); if ( c == '\n' ) { @@ -229,7 +166,6 @@ scanner_run(Fype *p_fype) { c_token[i_token_len-1] = '"'; } else { - //flag = true; break; } @@ -246,9 +182,6 @@ scanner_run(Fype *p_fype) { if (i_num_nl) p_scanner->i_current_line_nr += i_num_nl; - - //if (flag) - // _add_semicolon_to_list(p_scanner); } break; @@ -268,27 +201,31 @@ scanner_run(Fype *p_fype) { break; + case '(': + case '.': + { + if (i_token_len) { + TokenType tt_cur = scanner_get_tt_cur(c_token); + scanner_add_token(p_scanner, &c_token, &i_token_len, tt_cur); + } + ++i_token_len; + c_token = realloc(c_token, sizeof(char) * i_token_len + 1); + c_token[i_token_len-1] = c; + c_token[i_token_len] = 0; + TokenType tt_cur = scanner_get_tt_cur(c_token); + scanner_add_token(p_scanner, &c_token, &i_token_len, tt_cur); + } + break; + default: if (i_token_len) { TokenType tt_cur = scanner_get_tt_cur(c_token); - if (tt_cur == TT_PARANT_CR && p_scanner->tt_last == TT_STRING) - _add_semicolon_to_list(p_scanner); - - char d = c_token[i_token_len-1]; - if ((!isalpha(d) && !isdigit(d) /*&& d != '-'*/) && - (isalpha(c) || isdigit(c))) { - - scanner_add_token(p_scanner, &c_token, &i_token_len, tt_cur); - - } else { - for (int i = 0; i < p_scanner->i_num_tokenends; ++i) { - if (_TOKENENDS[i] == c) { - scanner_add_token(p_scanner, &c_token, - &i_token_len, tt_cur); - if (i < _ADD_SEMICOLON_INDEX) - _add_semicolon_to_list(p_scanner); - break; - } + + for (int i = 0; i < p_scanner->i_num_tokenends; ++i) { + if (_TOKEN_ENDS[i] == c) { + scanner_add_token(p_scanner, &c_token, + &i_token_len, tt_cur); + break; } } } @@ -305,14 +242,6 @@ scanner_run(Fype *p_fype) { scanner_add_token(p_scanner, &c_token, &i_token_len, tt_cur); } - /* Check if there is a ; missing */ - List *p_list_token = scanner_get_list_token(p_scanner); - Token *p_last_token = list_last(p_list_token); - if (token_get_tt(p_last_token) != TT_SEMICOLON) - _add_semicolon_to_list(p_scanner); - - scanner_post_task(p_scanner); - char *c_filename = scanner_get_filename(p_scanner); scanner_delete(p_scanner); @@ -345,7 +274,6 @@ scanner_add_token(Scanner *p_scanner, char **cc_token, int *p_token_len, p_scanner->c_filename); list_add_back(p_list_token, p_token); - token_ref_up(p_token); *cc_token = malloc(sizeof(char)); (*cc_token)[0] = 0; @@ -359,12 +287,7 @@ scanner_get_tt_cur(char *c_token) { if (isdigit(c_token[0])) return TT_INTEGER; - if (c_token[0] == '-' && 1 < strlen(c_token) && isdigit(c_token[1])) - return TT_INTEGER; - - TokenType tt_cur = get_tt(c_token); - - return tt_cur == TT_NONE ? TT_IDENT : tt_cur; + return (get_tt(c_token)); } void |
