summaryrefslogtreecommitdiff
path: root/src/core/token.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/token.c')
-rw-r--r--src/core/token.c369
1 files changed, 41 insertions, 328 deletions
diff --git a/src/core/token.c b/src/core/token.c
index b019a83..a0a6ad0 100644
--- a/src/core/token.c
+++ b/src/core/token.c
@@ -1,14 +1,13 @@
/*:*
*: File: ./src/core/token.c
- *: A simple interpreter
- *:
- *: 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.
- *:
+ *: A simple Fype interpreter
+ *:
+ *: WWW: http://fype.buetow.org
+ *: AUTHOR: http://paul.buetow.org
+ *: E-Mail: fype at dev.buetow.org
+ *:
+ *: The Fype Language; (c) 2005 - 2010 - Dipl.-Inform. (FH) Paul C. Buetow
+ *:
*: Redistribution and use in source and binary forms, with or without modi-
*: fication, are permitted provided that the following conditions are met:
*: * Redistributions of source code must retain the above copyright
@@ -16,175 +15,54 @@
*: * Redistributions in binary form must reproduce the above copyright
*: notice, this list of conditions and the following disclaimer in the
*: documentation and/or other materials provided with the distribution.
- *: * Neither the name of buetow.org nor the names of its contributors may
- *: be used to endorse or promote products derived from this software
+ *: * Neither the name of buetow.org nor the names of its contributors may
+ *: be used to endorse or promote products derived from this software
*: without specific prior written permission.
- *:
- *: THIS SOFTWARE IS PROVIDED BY PAUL C. BUETOW AS IS'' AND ANY EXPRESS OR
- *: IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ *:
+ *: THIS SOFTWARE IS PROVIDED BY PAUL C. BUETOW AS IS'' AND ANY EXPRESS OR
+ *: IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
*: WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- *: DISCLAIMED. IN NO EVENT SHALL PAUL C. BUETOW BE LIABLE FOR ANY DIRECT,
- *: INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- *: (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- *: SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ *: DISCLAIMED. IN NO EVENT SHALL PAUL C. BUETOW BE LIABLE FOR ANY DIRECT,
+ *: INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ *: (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ *: SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
*: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- *: STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- *: IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ *: STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ *: IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
*: POSSIBILITY OF SUCH DAMAGE.
*:*/
#include "token.h"
-#include "garbage.h"
-
#define CHECK(...) if (!strcmp(c_token, __VA_ARGS__)) return
+#define CASE(t,r) case t: return r;
long TOKEN_ID_COUNTER = 0;
TokenType
get_tt(char *c_token) {
- CHECK("if") TT_IF;
- CHECK("ifnot") TT_IFNOT;
- CHECK("else") TT_ELSE;
- CHECK("break") TT_BREAK;
- CHECK("while") TT_WHILE;
- CHECK("until") TT_UNTIL;
- CHECK("int") TT_INT;
- CHECK("next") TT_NEXT;
- CHECK("defined") TT_DEFINED;
- CHECK("undef") TT_UNDEF;
- CHECK("syms") TT_SYMS;
- CHECK("ret") TT_RET;
- CHECK("const") TT_CONST;
- CHECK("proc") TT_PROC;
- CHECK("func") TT_FUNC;
- CHECK("my") TT_MY;
- 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;
- CHECK(",") TT_COMMA;
- CHECK("-") TT_SUB;
- CHECK("--") TT_DECR;
+ CHECK("'") TT_SQUOTE;
CHECK(".") TT_DOT;
- CHECK("/") TT_DIV;
- CHECK("\\") TT_VID;
- CHECK(":") TT_DDOT;
- CHECK("==") TT_EQ;
- CHECK(";") TT_SEMICOLON;
- CHECK("<<") TT_LSHIFT;
- CHECK(">>") TT_RSHIFT;
- CHECK("and") TT_AND;
- CHECK("&") TT_AAND;
- CHECK("or") TT_OR;
- CHECK("xor") TT_XOR;
- CHECK("=") TT_ASSIGN;
- CHECK("<") TT_LT;
- CHECK(">") TT_GT;
- CHECK(">=") TT_GE;
- CHECK("<=") TT_LE;
- CHECK("{") TT_PARANT_CL;
- CHECK("}") TT_PARANT_CR;
- return TT_NONE;
+ return TT_IDENT;
}
-#define CASE(t,r) case t: return r;
-
char*
tt_get_name(TokenType tt_cur) {
switch (tt_cur) {
- CASE(START_TERMINALS, "START_TERMINALS")
- CASE(START_TYPES, "START_TYPES")
- CASE(START_NUMERICAL, "START_NUMERICAL")
- CASE(START_ASSIGNABLES, "START_ASSIGNABLES")
- 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")
- CASE(END_NUMERICAL, "END_NUMERICAL")
- CASE(END_TYPES, "END_TYPES")
-
- // Keywords
- CASE(START_KEYWORDS, "START_KEYWORDS")
- CASE(TT_ELSE,"TT_ELSE")
- CASE(TT_BREAK,"TT_BREAK")
- CASE(TT_IF,"TT_IF")
- CASE(TT_IFNOT,"TT_IFNOT")
- CASE(TT_RET,"TT_RET")
- CASE(TT_CONST,"TT_CONST")
- 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")
- CASE(TT_DEFINED,"TT_DEFINED")
- CASE(TT_UNDEF,"TT_UNDEF")
- CASE(TT_SYMS,"TT_SYMS")
- CASE(TT_INT,"TT_INT")
- CASE(END_KEYWORDS, "END_KEYWORDS")
-
- // Braces
- 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")
-
- // Operators
- CASE(START_OPERATORS, "START_OPERATORS")
- CASE(TT_ADD,"TT_ADD")
- CASE(TT_ASSIGN,"TT_ASSIGN")
- CASE(TT_COMMA,"TT_COMMA")
- CASE(TT_DDOT,"TT_DDOT")
- CASE(TT_DECR,"TT_DECR")
- CASE(TT_DIV,"TT_DIV")
- CASE(TT_VID,"TT_VID")
+ CASE(TT_INTEGER,"TT_INTEGER")
+ CASE(TT_DOUBLE,"TT_DOUBLE")
+ CASE(TT_STRING,"TT_STRING")
CASE(TT_DOT,"TT_DOT")
- CASE(TT_EQ,"TT_EQ")
- CASE(TT_LE,"TT_LE")
- CASE(TT_LT,"TT_LT")
- CASE(TT_GE,"TT_GE")
- CASE(TT_GT,"TT_GT")
- CASE(TT_INCR,"TT_INCR")
- CASE(TT_LSHIFT,"TT_LSHIFT")
- CASE(TT_RSHIFT,"TT_RSHIFT")
- CASE(TT_AND,"TT_AND")
- CASE(TT_AAND,"TT_AAND")
- CASE(TT_OR,"TT_OR")
- CASE(TT_XOR,"TT_XOR")
- CASE(TT_NOT,"TT_NOT")
- CASE(TT_MULT,"TT_MULT")
- CASE(TT_NEQ,"TT_NEQ")
- CASE(TT_RE,"TT_RE")
- CASE(TT_NOTEQ,"TT_NOTEQ")
- CASE(TT_SEMICOLON,"TT_SEMICOLON")
- CASE(TT_SUB,"TT_SUB")
- CASE(END_OPERATORS, "END_OPERATORS")
- CASE(END_TERMINALS, "END_TERMINALS")
-
- // Diverse
- CASE(TT_NONE,"TT_NONE")
- CASE(TT_END_OF_CODE,"TT_END_OF_CODE")
+ CASE(TT_SQUOTE,"TT_SQUOTE")
+ CASE(TT_IDENT,"TT_IDENT")
}
- // Never reach this point
- return "XXXXXXX";
+ return "TT_IDENT";
}
Token*
@@ -193,140 +71,26 @@ token_new(char *c_val, TokenType tt_cur, int i_line_nr,
Token *p_token = token_new_dummy();
p_token->c_val = c_val;
- p_token->i_val = 0;
- p_token->d_val = 0;
p_token->tt_cur = tt_cur;
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:
- p_token->i_val = atoi(c_val);
- break;
- case TT_DOUBLE:
- {
- p_token->d_val = atof(c_val);
- break;
- }
- case TT_ARRAY:
- {
- p_token->p_array = array_new();
- break;
- }
- NO_DEFAULT;
- }
-
- return p_token;
-}
-
-Token*
-token_new_integer(int i_val) {
- Token *p_token = token_new_dummy();
- token_set_tt(p_token, TT_INTEGER);
- token_set_ival(p_token, i_val);
-
- return (p_token);
-}
-
-Token*
-token_new_double(double d_val) {
- Token *p_token = token_new_dummy();
- token_set_tt(p_token, TT_DOUBLE);
- token_set_dval(p_token, d_val);
return (p_token);
}
Token*
-token_new_string(char *c_val) {
- Token *p_token = token_new_dummy();
- token_set_tt(p_token, TT_STRING);
-
- p_token->c_val = calloc(strlen(c_val)+1, sizeof(char));
- strcpy(p_token->c_val, 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);
- p_token->p_array = array_new();
-
- array_resize(p_token->p_array, i_size);
-
- return (p_token);
-}
-
-
-Token*
-token_new_(char *c_val, TokenType tt_cur, char *c_filename) {
- return token_new(c_val, tt_cur, -1, -1, c_filename);
-}
-
-Token*
token_new_dummy() {
Token *p_token = malloc(sizeof(Token));
p_token->c_val = NULL;
- p_token->tt_cur = TT_NONE;
+ p_token->tt_cur = TT_IDENT;
p_token->i_line_nr = -1;
p_token->i_pos_nr = -1;
p_token->c_filename = NULL;
p_token->u_token_id = TOKEN_ID_COUNTER++;
- p_token->i_ref_count = 0;
- p_token->p_array = NULL;
-
- /* Register the token in the garbage collector */
- garbage_add_token(p_token);
-
- return p_token;
-}
-
-Token*
-token_new_copy(Token *p_token) {
- Token *p_token_copy = malloc(sizeof(Token));
- p_token->u_token_id = TOKEN_ID_COUNTER++;
-
- if (p_token_copy == NULL)
- ERROR("Memory alloc error");
-
- p_token->p_array = NULL;
- token_copy_vals(p_token_copy, p_token);
- p_token_copy->i_ref_count = 0;
-
- /* Register the token in the garbage collector */
- garbage_add_token(p_token_copy);
-
- return (p_token_copy);
-}
-void token_copy_vals(Token *p_token_to, Token *p_token_from) {
- int i_len;
-
- if (p_token_from->c_val) {
- i_len = strlen(p_token_from->c_val);
- p_token_to->c_val = calloc(i_len+1, sizeof(char));
- strcpy(p_token_to->c_val, p_token_from->c_val);
-
- } else {
- p_token_to->c_val = NULL;
- }
-
- p_token_to->tt_cur = p_token_from->tt_cur;
- p_token_to->i_val = p_token_from->i_val;
- p_token_to->d_val = p_token_from->d_val;
- p_token_to->i_line_nr = p_token_from->i_line_nr;
- p_token_to->i_pos_nr = p_token_from->i_pos_nr;
- p_token_to->c_filename = p_token_from->c_filename;
-
- if (NULL != p_token_from->p_array)
- // Copy all tokens by reference (pointers)
- p_token_to->p_array = array_new_copy(p_token_from->p_array);
+ return (p_token);
}
void
@@ -335,81 +99,31 @@ token_delete_cb(void *p_void) {
}
void
-token_ref_down_cb(void *p_void) {
- Token *p_token = p_void;
- token_ref_down(p_token);
-}
-
-void*
-token_copy_cb(void *p_void) {
- return (token_new_copy(p_void));
-}
-
-void
token_delete(Token *p_token) {
- if (token_ref_down(p_token) <= 0) {
- if (p_token->i_ref_count == 0) {
-#ifdef DEBUG_TOKEN_REFCOUNT
- printf("DEBUG::TOKEN::REFCOUNT: Token ref count is 0 == %d\n",
- p_token->i_ref_count);
-#endif /* DEBUG_TOKEN_REFCOUNT */
- if (p_token->c_val)
- free(p_token->c_val);
+}
- if (NULL != p_token->p_array)
- array_delete_iterate(p_token->p_array, token_delete_cb);
+_Bool
+token_is(Token *p_token, char *c_str) {
+ if (p_token->tt_cur == TT_IDENT && strcmp(p_token->c_val, c_str) == 0)
+ return true;
- free(p_token);
- }
-#ifdef DEBUG_TOKEN_REFCOUNT
- else {
- printf("DEBUG::TOKEN::REFCOUNT: Token ref count is 0 > %d\n",
- p_token->i_ref_count);
- }
-#endif /* DEBUG_TOKEN_REFCOUNT */
- }
-#ifdef DEBUG_TOKEN_REFCOUNT
- else {
- printf("DEBUG::TOKEN::REFCOUNT: Token ref count is 0 < %d\n",
- p_token->i_ref_count);
- }
-#endif /* DEBUG_TOKEN_REFCOUNT */
+ return false;
}
void
token_print(Token *p_token) {
- printf("(id=%05u, line=%05d, pos=%04d, type=%s, val=%s, ival=%d, dval=%f,"
- " refs=%d)",
+ printf("(id=%05u, line=%05d, pos=%04d, type=%s, val=%s)",
p_token->u_token_id,
p_token->i_line_nr,
p_token->i_pos_nr,
tt_get_name(p_token->tt_cur),
- p_token->c_val,
- p_token->i_val,
- p_token->d_val,
- p_token->i_ref_count);
+ p_token->c_val);
}
void
-token_print_val(Token *p_token) {
- TokenType tt = token_get_tt(p_token);
- switch (tt) {
- case TT_INTEGER:
- printf("(%s, %d)", tt_get_name(tt), token_get_ival(p_token));
- break;
- case TT_DOUBLE:
- printf("(%s, %f)", tt_get_name(tt), token_get_dval(p_token));
- break;
- case TT_STRING:
- printf("(%s, %s)", tt_get_name(tt), token_get_val(p_token));
- break;
- case TT_ARRAY:
- printf("(%s, size:%d)", tt_get_name(tt),
- array_get_size(p_token->p_array));
- break;
- default:
- ERROR("Ouups(%s)!", tt_get_name(tt));
- }
+token_print_ln(Token *p_token) {
+ token_print(p_token);
+ printf("\n");
}
void
@@ -419,4 +133,3 @@ token_print_cb(void *p_void) {
token_print(p_token);
printf("\n");
}
-