Mercurial > hg-old > index.cgi
diff lwasm/expr.c @ 194:0d916bcebb90
First pass at allowing symbols starting with digits but containing $
author | lost |
---|---|
date | Sun, 22 Mar 2009 17:50:42 +0000 |
parents | 29ba546ceea0 |
children | 2c1afbdb2de0 |
line wrap: on
line diff
--- a/lwasm/expr.c Sun Mar 22 17:25:19 2009 +0000 +++ b/lwasm/expr.c Sun Mar 22 17:50:42 2009 +0000 @@ -284,7 +284,7 @@ /* - a symbol will be a string of characters introduced by a letter, ".", - "_" but NOT a number + "_" but NOT a number OR it may start with a digit if it contains a $ - a decimal constant will consist of only digits, optionally prefixed with "&" - a binary constant will consist of only 0s and 1s either prefixed with % @@ -423,32 +423,42 @@ } // symbol or bare decimal or suffix identified constant here - // all numbers will start with a digit at this point - if (**p < '0' || **p > '9') + + // find the end of a potential symbol + do { int l = 0; char *sb; + int havedol = 0; // evaluate a symbol here static const char *symchars = "_.$@?abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; while ((*p)[l] && strchr(symchars, (*p)[l])) + { + if ((*p)[l] == '$') + havedol = 1; l++; - + } if (l == 0) return -1; - sb = lwasm_alloc(l + 1); - sb[l] = '\0'; - memcpy(sb, *p, l); - t = lwasm_expr_term_create_sym(sb); - lwasm_expr_stack_push(s, t); - lwasm_expr_term_free(t); - (*p) += l; - debug_message(3, "Symbol: '%s'; (%s)", sb, *p); - lwasm_free(sb); - return 0; - } - + if (havedol || **p < '0' || **p > '9') + { + // have a symbol here + + sb = lwasm_alloc(l + 1); + sb[l] = '\0'; + memcpy(sb, *p, l); + t = lwasm_expr_term_create_sym(sb); + lwasm_expr_stack_push(s, t); + lwasm_expr_term_free(t); + (*p) += l; + debug_message(3, "Symbol: '%s'; (%s)", sb, *p); + lwasm_free(sb); + return 0; + } + } while (0); + if (!**p) return -1;