Jacek Caban : vbscript: Added identifiers support to lexer.
Alexandre Julliard
julliard at winehq.org
Wed Sep 7 12:35:30 CDT 2011
Module: wine
Branch: master
Commit: 91cc7bd7197bbe51edb4ee71efde0eb779a473a1
URL: http://source.winehq.org/git/wine.git/?a=commit;h=91cc7bd7197bbe51edb4ee71efde0eb779a473a1
Author: Jacek Caban <jacek at codeweavers.com>
Date: Wed Sep 7 14:08:07 2011 +0200
vbscript: Added identifiers support to lexer.
---
dlls/vbscript/lex.c | 28 ++++++++++++++++++++++++++++
dlls/vbscript/parse.h | 1 +
dlls/vbscript/parser.y | 16 +++++++++++++---
3 files changed, 42 insertions(+), 3 deletions(-)
diff --git a/dlls/vbscript/lex.c b/dlls/vbscript/lex.c
index f3dc8ee..d481e6a 100644
--- a/dlls/vbscript/lex.c
+++ b/dlls/vbscript/lex.c
@@ -26,6 +26,31 @@
WINE_DEFAULT_DEBUG_CHANNEL(vbscript);
+static inline BOOL is_identifier_char(WCHAR c)
+{
+ return isalnumW(c) || c == '_';
+}
+
+static int parse_identifier(parser_ctx_t *ctx, const WCHAR **ret)
+{
+ const WCHAR *ptr = ctx->ptr++;
+ WCHAR *str;
+ int len;
+
+ while(ctx->ptr < ctx->end && is_identifier_char(*ctx->ptr))
+ ctx->ptr++;
+ len = ctx->ptr-ptr;
+
+ str = parser_alloc(ctx, (len+1)*sizeof(WCHAR));
+ if(!str)
+ return 0;
+
+ memcpy(str, ptr, (len+1)*sizeof(WCHAR));
+ str[len] = 0;
+ *ret = str;
+ return tIdentifier;
+}
+
static int parse_next_token(void *lval, parser_ctx_t *ctx)
{
WCHAR c;
@@ -37,6 +62,9 @@ static int parse_next_token(void *lval, parser_ctx_t *ctx)
c = *ctx->ptr;
+ if(isalphaW(c))
+ return parse_identifier(ctx, lval);
+
switch(c) {
case '\n':
ctx->ptr++;
diff --git a/dlls/vbscript/parse.h b/dlls/vbscript/parse.h
index d6dfbbc..fa6424f 100644
--- a/dlls/vbscript/parse.h
+++ b/dlls/vbscript/parse.h
@@ -30,3 +30,4 @@ typedef struct {
HRESULT parse_script(parser_ctx_t*,const WCHAR*) DECLSPEC_HIDDEN;
int parser_lex(void*,parser_ctx_t*) DECLSPEC_HIDDEN;
+void *parser_alloc(parser_ctx_t*,size_t) DECLSPEC_HIDDEN;
diff --git a/dlls/vbscript/parser.y b/dlls/vbscript/parser.y
index e895cfd..0ae6008 100644
--- a/dlls/vbscript/parser.y
+++ b/dlls/vbscript/parser.y
@@ -38,13 +38,12 @@ static void parse_complete(parser_ctx_t*);
%pure_parser
%start Program
-%token tEOF
-
%union {
const WCHAR *string;
}
-%token tNL
+%token tEOF tNL
+%token <string> tIdentifier
%%
@@ -62,6 +61,17 @@ static void parse_complete(parser_ctx_t *ctx)
ctx->parse_complete = TRUE;
}
+void *parser_alloc(parser_ctx_t *ctx, size_t size)
+{
+ void *ret;
+
+ /* FIXME: leaks! */
+ ret = heap_alloc(size);
+ if(!ret)
+ ctx->hres = E_OUTOFMEMORY;
+ return ret;
+}
+
HRESULT parse_script(parser_ctx_t *ctx, const WCHAR *code)
{
ctx->code = ctx->ptr = code;
More information about the wine-cvs
mailing list