static LONToken *lex(LONLexState *state) { LONToken *t = TOK_NEW(); int c; state->type = LEX_DEFAULT; for (;;) { if (t->type != TOK_NONE) { t->line = state->line; t->col = state->col; // TODO: Fix this. It's broken. return t; } // XXX: Token position may not be saved properly. c = LONInputPeek(state->input); if (c == '\n') { state->line++; LONInputRead(state->input); // TODO: improve } if (c == EOF) { t->type = TOK_EOF; return t; } // Macro soup! switch (state->type) { case LEX_DEFAULT: if (isalpha(c)) { state->type = LEX_NAME; } else if (isdigit(c)) { state->type = LEX_NUMBER; } else if (c == '"') { state->type = LEX_STRING; LEX_EAT_ONE() } else if (c == '-') { if (LONInputPeek(state->input) == '-') { state->type = LEX_SLCOMMENT; } } LEX_SINGLE('{', TOK_LBRACE) LEX_SINGLE('}', TOK_RBRACE) LEX_SINGLE('[', TOK_LBRACKET) LEX_SINGLE(']', TOK_RBRACKET) LEX_SINGLE(',', TOK_COMMA) LEX_SINGLE(';', TOK_SEMICOLON) LEX_SINGLE('=', TOK_EQ) else { LONInputRead(state->input); } break; case LEX_NAME: if (isalpha(c)) { LEX_EAT_ONE() } else { if (strcmp(BUF_STR(t->buf), "true") == 0) {
R_API char *r_anal_esil_to_sdb(char *str) { // tokenize string #define TOK_NEW(x,y) (x<<24|(y+1)) #define TOK_OP(x) (x>>24) #define TOK_ARG(x) str+(x&0xffffff) char *p = str; int tok[4096], i = 0, t = 0; tok[0] = 0; for (i=0; p[i]; i++) { char ch = p[i]; switch (ch) { case '[': // TODO case ']': // TODO case '!': case ',': case ';': case '(': case ')': case '<': case '>': case '*': case '+': case '-': case '/': case '=': p[i] = 0; tok[t++] = TOK_NEW(ch, i); break; } } // build sdb { char *a = str; char *b; int idx = 0; int top = 0; int level = 0; int stack[32]; int store = 0; stack[0] = 0; for (i=0; i<t; i++) { char op = TOK_OP(tok[i]); b = TOK_ARG(tok[i]); switch (op) { case ',': case ';': idx = 0; stack[0] = 0; level = 0; a = TOK_ARG (tok[i]); continue; case '=': if (TOK_OP (tok[i+1])=='=') { printf ("TODO: cmp\n"); return NULL; } break; case '(': level++; if (level>=(sizeof(stack)/sizeof(*stack))) { printf ("ERROR: too many open parenthesis\n"); return NULL; } stack[level] = i; a = TOK_ARG(tok[i]); continue; case ')': level--; if (level<0) { printf ("ERROR: too many closing parenthesis\n"); return NULL; } top = stack[level]; continue; default: if ( TOK_OP(tok[i+1]) == '=') { // printf ("TODO: %c= syntax sugar not yet supported\n", op); //printf ("[]%d=%s,%s,&%d\n", idx, "str", a, idx); a="&0"; store = 0; continue; } } if (store) { if (op=='=') { eprintf ("SET\n"); op='['; } store = 0; } //if (!a || (!*a) || *a==' ') //if (*a==' ') a ="8"; // for mem ref only if (*b) printf ("[]%d=%s,%s,%s\n", idx, chstr (op), a, b); else printf ("[]%d=%s,%s,&%d\n", idx, chstr (op), a, idx+1); a = b; stack[level] = top = idx; if (i>0) { int sl = stack[level]; if (sl>0) printf ("[2]%d=&%d\n", sl-1, idx); stack[level] = top = idx; } idx++; } } return NULL; }