diff options
| author | Paul Buetow <paul@buetow.org> | 2008-08-25 18:48:28 +0000 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2008-08-25 18:48:28 +0000 |
| commit | ec9899c0399f42473d311c7d0a46769d3d933c06 (patch) | |
| tree | 8396b366b5e1b665f60f5502d484985b0950a94e /src | |
| parent | cf9029ee902eda028f3efcb77e8c2aed25205b94 (diff) | |
bugs fixed, initial array
Diffstat (limited to 'src')
| -rw-r--r-- | src/build.h | 2 | ||||
| -rw-r--r-- | src/core/function.c | 147 | ||||
| -rw-r--r-- | src/core/interpret.c | 54 | ||||
| -rw-r--r-- | src/core/scanner.c | 19 | ||||
| -rw-r--r-- | src/core/scanner.h | 1 | ||||
| -rw-r--r-- | src/core/token.c | 27 | ||||
| -rw-r--r-- | src/core/token.h | 7 | ||||
| -rw-r--r-- | src/defines.h | 1 |
8 files changed, 233 insertions, 25 deletions
diff --git a/src/build.h b/src/build.h index 8be647b..5da306c 100644 --- a/src/build.h +++ b/src/build.h @@ -35,7 +35,7 @@ #ifndef BUILD_H #define BUILD_H -#define BUILDNR 9136 +#define BUILDNR 9200 #define OS_FREEBSD #endif diff --git a/src/core/function.c b/src/core/function.c index 39971a1..fda40b8 100644 --- a/src/core/function.c +++ b/src/core/function.c @@ -111,6 +111,18 @@ _process(Interpret *p_interpret, Token *p_token_store, Token *p_token_op, break; } break; + case TT_DDOT: + switch (tt_op2) { + case TT_LT: + tt_op = TT_LSHIFT; + break; + case TT_GT: + tt_op = TT_RSHIFT; + break; + default: + break; + } + break; default: break; } @@ -371,6 +383,117 @@ _process(Interpret *p_interpret, Token *p_token_store, Token *p_token_op, NO_DEFAULT; } break; + case TT_AND: + switch (tt_highest) { + case TT_INTEGER: + token_set_ival(p_token_store, + (int) token_get_ival(p_token_next) & + token_get_ival(p_token_store)); + break; + case TT_DOUBLE: + token_set_ival(p_token_store, + (int) token_get_dval(p_token_next) & + (int) token_get_dval(p_token_store)); + token_set_tt(p_token_store, TT_INTEGER); + break; + case TT_STRING: + token_set_ival(p_token_store, + atoi(token_get_val(p_token_next)) & + atoi(token_get_val(p_token_store))); + token_set_tt(p_token_store, TT_INTEGER); + break; + NO_DEFAULT; + } + break; + case TT_OR: + switch (tt_highest) { + case TT_INTEGER: + token_set_ival(p_token_store, + (int) token_get_ival(p_token_next) | + token_get_ival(p_token_store)); + break; + case TT_DOUBLE: + token_set_ival(p_token_store, + (int) token_get_dval(p_token_next) | + (int) token_get_dval(p_token_store)); + token_set_tt(p_token_store, TT_INTEGER); + break; + case TT_STRING: + token_set_ival(p_token_store, + atoi(token_get_val(p_token_next)) | + atoi(token_get_val(p_token_store))); + token_set_tt(p_token_store, TT_INTEGER); + break; + NO_DEFAULT; + } + break; + case TT_XOR: + switch (tt_highest) { + case TT_INTEGER: + token_set_ival(p_token_store, + (int) token_get_ival(p_token_next) ^ + token_get_ival(p_token_store)); + break; + case TT_DOUBLE: + token_set_ival(p_token_store, + (int) token_get_dval(p_token_next) ^ + (int) token_get_dval(p_token_store)); + token_set_tt(p_token_store, TT_INTEGER); + break; + case TT_STRING: + token_set_ival(p_token_store, + atoi(token_get_val(p_token_next)) ^ + atoi(token_get_val(p_token_store))); + token_set_tt(p_token_store, TT_INTEGER); + break; + NO_DEFAULT; + } + break; + case TT_LSHIFT: + switch (tt_highest) { + case TT_INTEGER: + token_set_ival(p_token_store, + (int) token_get_ival(p_token_next) << + token_get_ival(p_token_store)); + break; + case TT_DOUBLE: + token_set_ival(p_token_store, + (int) token_get_dval(p_token_next) << + (int) token_get_dval(p_token_store)); + token_set_tt(p_token_store, TT_INTEGER); + break; + case TT_STRING: + token_set_ival(p_token_store, + atoi(token_get_val(p_token_next)) << + atoi(token_get_val(p_token_store))); + token_set_tt(p_token_store, TT_INTEGER); + break; + NO_DEFAULT; + } + break; + case TT_RSHIFT: + switch (tt_highest) { + case TT_INTEGER: + token_set_ival(p_token_store, + (int) token_get_ival(p_token_next) >> + token_get_ival(p_token_store)); + break; + case TT_DOUBLE: + token_set_ival(p_token_store, + (int) token_get_dval(p_token_next) >> + (int) token_get_dval(p_token_store)); + token_set_tt(p_token_store, TT_INTEGER); + break; + case TT_STRING: + token_set_ival(p_token_store, + atoi(token_get_val(p_token_next)) >> + atoi(token_get_val(p_token_store))); + token_set_tt(p_token_store, TT_INTEGER); + break; + NO_DEFAULT; + } + break; + default: _FUNCTION_ERROR("No such function/operator", p_token_op); } @@ -449,6 +572,9 @@ function_is_buildin(Token *p_token_ident) { if (strcmp("yes", token_get_val(p_token_ident)) == 0) return (true); + if (strcmp("not", token_get_val(p_token_ident)) == 0) + return (true); + return (false); } @@ -665,6 +791,27 @@ function_process_buildin(Interpret *p_interpret, Token *p_token_ident, } stack_push(p_stack_args, p_token); + + } else if (strcmp("not", token_get_val(p_token_ident)) == 0) { + if (0 == stack_size(p_stack_args)) + _FUNCTION_ERROR("No argument given", p_token_ident); + + Token *p_token = token_new_copy(stack_pop(p_stack_args)); + stack_push(p_stack_args, p_token); + + switch (token_get_tt(p_token)) { + case TT_INTEGER: + token_set_ival(p_token, !token_get_ival(p_token)); + break; + case TT_DOUBLE: + token_set_dval(p_token, !token_get_dval(p_token)); + break; + case TT_STRING: + token_set_ival(p_token, !atoi(token_get_val(p_token))); + token_set_tt(p_token, TT_INTEGER); + break; + NO_DEFAULT; + } } } diff --git a/src/core/interpret.c b/src/core/interpret.c index 25f4a0d..5aa07ef 100644 --- a/src/core/interpret.c +++ b/src/core/interpret.c @@ -174,7 +174,10 @@ int _var_decl(Interpret *p_interpret) { _CHECK TRACK - if (p_interpret->tt == TT_MY) { + switch (p_interpret->tt) { + //case TT_ARR: //TODO cleanup TT_ARR + case TT_MY: + { if (_NEXT_TT != TT_IDENT) _INTERPRET_ERROR("'my' expects identifier", p_interpret->p_token); @@ -196,6 +199,9 @@ _var_decl(Interpret *p_interpret) { _INTERPRET_ERROR("Expected ';' after", p_token_ident); } } + default: + break; + } return (0); } @@ -220,7 +226,8 @@ _var_assign(Interpret *p_interpret) { p_interpret->p_stack = stack_new(); if (_expression_(p_interpret)) { - function_process_buildin(p_interpret, p_token, p_interpret->p_stack); + function_process_buildin(p_interpret, p_token, + p_interpret->p_stack); stack_merge(p_stack, p_interpret->p_stack); stack_delete(p_interpret->p_stack); @@ -605,9 +612,6 @@ _compare(Interpret *p_interpret) { _Bool b_flag = true; do { - /* - ! = < > !! != !< !> =! == =< => <! <= << <> >! >= >< >> - */ switch (p_interpret->tt) { case TT_NOT: case TT_ASSIGN: @@ -659,17 +663,30 @@ _sum(Interpret *p_interpret) { _Bool b_flag = true; do { + Token *p_token_op2 = NULL, *p_token_tmp = NULL; + switch (p_interpret->tt) { + case TT_DDOT: + p_token_tmp = p_interpret->p_token; + _NEXT case TT_ADD: case TT_SUB: + case TT_AND: + case TT_OR: + case TT_XOR: { Token *p_token_op = p_interpret->p_token; _NEXT + if (p_token_tmp != NULL) { + p_token_op2 = p_token_op; + p_token_op = p_token_tmp;; + } + if (!_product(p_interpret)) _INTERPRET_ERROR("Expected product", p_token_op); - function_process(p_interpret, p_token_op, NULL, + function_process(p_interpret, p_token_op, p_token_op2, p_interpret->p_stack, 2); } @@ -735,9 +752,8 @@ _product2(Interpret *p_interpret) { _Bool b_flag = true; do { - switch (p_interpret->tt) { - case TT_ASSIGN: - { + if (p_interpret->tt == TT_ASSIGN + && IS_NOT_OPERATOR(_NEXT_TT)) { Token *p_token = p_interpret->p_token; Token *p_token_temp = p_interpret->p_token_prev; _NEXT @@ -750,15 +766,10 @@ _product2(Interpret *p_interpret) { p_interpret->p_stack, 2); p_interpret->p_token_temp = NULL; - } - break; /* case */ - - default: + } else { b_flag = false; break; - - } /* switch */ - + } /* if */ } while (b_flag); return (1); @@ -901,6 +912,17 @@ _term(Interpret *p_interpret) { } break; + case TT_PARANT_AL: + { + Token *p_token = p_interpret->p_token; + _NEXT + + Token *p_token_arr = token_new_array(ARRAY_SIZE); + stack_push(p_interpret->p_stack, p_token_arr); + _INTERPRET_ERROR("arrays not yet fully implemented", p_token_arr); + } + break; + case TT_PARANT_L: { Token *p_token = p_interpret->p_token; diff --git a/src/core/scanner.c b/src/core/scanner.c index 2e599eb..49026c2 100644 --- a/src/core/scanner.c +++ b/src/core/scanner.c @@ -37,7 +37,7 @@ #include <ctype.h> #include <string.h> -const char _TOKENENDS[] = "})+-*/={(<>;:,.!"; +const char _TOKENENDS[] = "}])+-*/={([<>;:,.!"; #define _ADD_SEMICOLON_INDEX 2 int _CODESTR_INDEX = 0; @@ -70,6 +70,7 @@ scanner_new(List *p_list_token, Tupel *p_tupel_argv) { p_scanner->i_current_pos_nr = 0; p_scanner->i_num_tokenends = strlen(_TOKENENDS); + p_scanner->tt_last = TT_NONE; return p_scanner; } @@ -208,7 +209,7 @@ scanner_run(Fype *p_fype) { } { int i_num_nl = 0; - _Bool flag = false; + //_Bool flag = false; do { c = _scanner_get_next_char(p_scanner); if ( c == '\n' ) { @@ -226,7 +227,7 @@ scanner_run(Fype *p_fype) { c_token[i_token_len-1] = '"'; } else { - flag = true; + //flag = true; break; } @@ -244,8 +245,8 @@ 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); + //if (flag) + // _add_semicolon_to_list(p_scanner); } break; @@ -267,17 +268,19 @@ scanner_run(Fype *p_fype) { 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))) { - TokenType tt_cur = scanner_get_tt_cur(c_token); 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) { - TokenType tt_cur = scanner_get_tt_cur(c_token); scanner_add_token(p_scanner, &c_token, &i_token_len, tt_cur); if (i < _ADD_SEMICOLON_INDEX) _add_semicolon_to_list(p_scanner); @@ -342,6 +345,8 @@ scanner_add_token(Scanner *p_scanner, char **cc_token, int *p_token_len, *cc_token = malloc(sizeof(char)); (*cc_token)[0] = 0; *p_token_len = 0; + + p_scanner->tt_last = tt_cur; } TokenType diff --git a/src/core/scanner.h b/src/core/scanner.h index f5f91ad..4626595 100644 --- a/src/core/scanner.h +++ b/src/core/scanner.h @@ -55,6 +55,7 @@ typedef struct { char *c_codestring; FILE *fp; List *p_list_token; + TokenType tt_last; } Scanner; Scanner *scanner_new(List *p_list_token, Tupel *p_tupel_argv); diff --git a/src/core/token.c b/src/core/token.c index 437ed6c..1a2aec9 100644 --- a/src/core/token.c +++ b/src/core/token.c @@ -57,11 +57,14 @@ get_tt(char *c_token) { CHECK("proc") TT_PROC; CHECK("func") TT_FUNC; CHECK("my") TT_MY; - CHECK("not") TT_NOT; + CHECK("arr") TT_ARR; + CHECK("!") TT_NOT; CHECK("!=") TT_NEQ; CHECK("=~") TT_RE; CHECK("(") TT_PARANT_L; CHECK(")") TT_PARANT_R; + CHECK("[") TT_PARANT_AL; + CHECK("]") TT_PARANT_AR; CHECK("*") TT_MULT; CHECK("+") TT_ADD; CHECK("++") TT_INCR; @@ -102,6 +105,7 @@ tt_get_name(TokenType tt_cur) { CASE(TT_IDENT, "TT_IDENT") CASE(TT_DOUBLE,"TT_DOUBLE") CASE(TT_STRING,"TT_STRING") + CASE(TT_ARRAY,"TT_ARRAY") CASE(TT_INTEGER,"TT_INTEGER") CASE(TT_BOOL,"TT_BOOL") CASE(END_ASSIGNABLES, "END_ASSIGNABLES") @@ -119,6 +123,7 @@ tt_get_name(TokenType tt_cur) { CASE(TT_PROC,"TT_PROC") CASE(TT_FUNC,"TT_FUNC") CASE(TT_MY,"TT_MY") + CASE(TT_ARR,"TT_ARR") CASE(TT_WHILE,"TT_WHILE") CASE(TT_UNTIL,"TT_UNTIL") CASE(TT_NEXT,"TT_NEXT") @@ -131,6 +136,8 @@ tt_get_name(TokenType tt_cur) { CASE(START_PARANTS, "START_PARANTS") CASE(TT_PARANT_CL,"TT_PARANT_CL") CASE(TT_PARANT_CR,"TT_PARANT_CR") + CASE(TT_PARANT_AL,"TT_PARANT_AL") + CASE(TT_PARANT_AR,"TT_PARANT_AR") CASE(TT_PARANT_L,"TT_PARANT_L") CASE(TT_PARANT_R,"TT_PARANT_R") CASE(END_PARANTS, "END_PARANTS") @@ -186,6 +193,7 @@ token_new(char *c_val, TokenType tt_cur, int i_line_nr, int i_pos_nr, char *c_fi p_token->i_line_nr = i_line_nr; p_token->i_pos_nr = i_pos_nr; p_token->c_filename = c_filename; + p_token->p_array = NULL; switch (tt_cur) { case TT_INTEGER: @@ -196,6 +204,11 @@ token_new(char *c_val, TokenType tt_cur, int i_line_nr, int i_pos_nr, char *c_fi p_token->d_val = atof(c_val); break; } + case TT_ARRAY: + { + p_token->p_array = array_new(); + break; + } NO_DEFAULT; } @@ -231,6 +244,15 @@ token_new_string(char *c_val) { return (p_token); } +Token* +token_new_array(int i_size) { + Token *p_token = token_new_dummy(); + token_set_tt(p_token, TT_ARRAY); + array_resize(p_token->p_array, i_size); + + return (p_token); +} + Token* token_new_(char *c_val, TokenType tt_cur, char *c_filename) { @@ -322,6 +344,9 @@ token_delete(Token *p_token) { if (p_token->c_val) free(p_token->c_val); + if (p_token->p_array) + array_delete(p_token->p_array); + free(p_token); } #ifdef DEBUG_TOKEN_REFCOUNT diff --git a/src/core/token.h b/src/core/token.h index b73398b..caf4854 100644 --- a/src/core/token.h +++ b/src/core/token.h @@ -36,6 +36,7 @@ #define TOKEN_H #include "../defines.h" +#include "../data/array.h" #define IS_TERMINAL(t) (START_TERMINALS < t && t < END_TERMINALS) #define IS_NOT_TERMINAL(t) !IS_TERMINAL(t) @@ -86,6 +87,7 @@ typedef enum { TT_DOUBLE, END_NUMERICAL, TT_STRING, + TT_ARRAY, END_ASSIGNABLES, TT_IDENT, END_TYPES, @@ -101,6 +103,7 @@ typedef enum { TT_PROC, TT_FUNC, TT_MY, + TT_ARR, TT_WHILE, TT_UNTIL, TT_NEXT, @@ -112,6 +115,8 @@ typedef enum { START_PARANTS, TT_PARANT_CL, TT_PARANT_CR, + TT_PARANT_AL, + TT_PARANT_AR, TT_PARANT_L, TT_PARANT_R, END_PARANTS, @@ -160,12 +165,14 @@ typedef struct { char *c_filename; unsigned int u_token_id; int i_ref_count; + Array *p_array; } Token; Token* token_new(char *c_val, TokenType tt_cur, int i_line_nr, int i_pos_nr, char *c_filename); Token* token_new_integer(int i_val); Token* token_new_couble(double d_val); Token* token_new_string(char *c_val); +Token* token_new_array(int i_size); Token* token_new_copy(Token *p_token); Token* token_new_(char *c_val, TokenType tt_cur, char *c_filename); Token* token_new_dummy(); diff --git a/src/defines.h b/src/defines.h index 17e4933..a7eabd7 100644 --- a/src/defines.h +++ b/src/defines.h @@ -45,6 +45,7 @@ #define COPYRIGHT "Copyright by Paul C. Buetow (2005 - 2008) <fype@dev.buetow.org>" #define FYPE #define GRAMMAR_MAP_SIZES 128 +#define ARRAY_SIZE 16 #define HASH_MAXOCC 5 #define HASH_MKEYLEN 32 #define HASH_SCALE 10 |
