static int _col = 0;
static int _pline = 1;
static int _pcol = 1;
-list_t *tokens = NULL;
+static struct token *_next_token = NULL;
-int getnext(void)
+static int _getnextchar(void)
{
int ret_val;
return(ret_val);
}
-int putnext(const char c)
+static int _putnextchar(const char c)
{
int ret_val;
return(ret_val);
}
-struct token *nexttoken(void)
+struct token *lex_gettoken(void)
{
struct token *tok;
int state;
char c;
+ if(_next_token) {
+ return(_next_token);
+ }
+
state = STATE_NONE;
tok = NULL;
- while((c = getnext())) {
+ while((c = _getnextchar())) {
switch(state) {
case STATE_NONE:
switch(c) {
return(token_new2(_line, _col, "/="));
default:
- putnext(c);
+ _putnextchar(c);
return(token_new2(_line, _col, "/"));
}
break;
default:
- putnext(c);
+ _putnextchar(c);
return(token_new2(_line, _col, "<"));
}
return(token_new2(_line, _col, "<<="));
}
- putnext(c);
+ _putnextchar(c);
return(token_new2(_line, _col, "<<"));
case STATE_GT:
return(token_new2(_line, _col, ">="));
default:
- putnext(c);
+ _putnextchar(c);
return(token_new2(_line, _col, ">"));
}
return(token_new2(_line, _col, ">>="));
}
- putnext(c);
+ _putnextchar(c);
return(token_new2(_line, _col, ">>"));
case STATE_NOT:
return(token_new2(_line, _col, "!="));
}
- putnext(c);
+ _putnextchar(c);
return(token_new2(_line, _col, "!"));
case STATE_MOD:
return(token_new2(_line, _col, "%="));
}
- putnext(c);
+ _putnextchar(c);
return(token_new2(_line, _col, "%"));
case STATE_AND:
return(token_new2(_line, _col, "&="));
default:
- putnext(c);
+ _putnextchar(c);
return(token_new2(_line, _col, "&"));
}
return(token_new2(_line, _col, "|="));
default:
- putnext(c);
+ _putnextchar(c);
return(token_new2(_line, _col, "|"));
}
return(token_new2(_line, _col, "^="));
}
- putnext(c);
+ _putnextchar(c);
return(token_new2(_line, _col, "^"));
case STATE_ASSIGN:
return(token_new2(_line, _col, "=="));
}
- putnext(c);
+ _putnextchar(c);
return(token_new2(_line, _col, "="));
case STATE_STRING:
if(identifier_chr(c)) {
str_appendc(tok->value, c);
} else {
- putnext(c);
+ _putnextchar(c);
return(tok);
}
return(token_new2(_line, _col, "*="));
default:
- putnext(c);
+ _putnextchar(c);
return(token_new2(_line, _col, "*"));
}
return(token_new2(_line, _col, "+="));
default:
- putnext(c);
+ _putnextchar(c);
return(token_new2(_line, _col, "+"));
}
return(token_new2(_line, _col, "->"));
default:
- putnext(c);
+ _putnextchar(c);
return(token_new2(_line, _col, "-"));
}
case STATE_DOT:
- putnext(c);
+ _putnextchar(c);
if(c >= '0' && c <= '9') {
state = STATE_NUM;
str_appendc(tok->value, 'x');
state = STATE_NUM;
} else if(c >= '0' && c <= '9') {
- putnext(c);
+ _putnextchar(c);
state = STATE_NUM;
} else if(c == '.') {
} else {
- putnext(c);
+ _putnextchar(c);
return(tok);
}
if(c >= '0' && c <= '9' || c == '.') {
str_appendc(tok->value, c);
} else {
- putnext(c);
+ _putnextchar(c);
return(tok);
}
return(tok);
}
-int main(int argc, char *argv[])
+int lex_puttoken(struct token *tok)
{
int ret_val;
- struct token *tok;
-
- ret_val = 0;
- while((tok = nexttoken())) {
- printf("Token at %4d:%3d: \"%s\"\n", tok->line, tok->column, str_value(tok->value));
+ if(_next_token) {
+ ret_val = -EALREADY;
+ } else {
+ _next_token = tok;
+ ret_val = 0;
}
return(ret_val);