Jacek Caban : vbscript: Added support for call keyword in lexer.

Alexandre Julliard julliard at winehq.org
Thu Sep 8 14:52:12 CDT 2011


Module: wine
Branch: master
Commit: b6e9a83d781e33b261fa880ef78a85025449913c
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=b6e9a83d781e33b261fa880ef78a85025449913c

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Sep  8 14:55:51 2011 +0200

vbscript: Added support for call keyword in lexer.

---

 dlls/vbscript/lex.c    |   58 ++++++++++++++++++++++++++++++++++++++++++++++-
 dlls/vbscript/parser.y |    1 +
 2 files changed, 57 insertions(+), 2 deletions(-)

diff --git a/dlls/vbscript/lex.c b/dlls/vbscript/lex.c
index d41c582..af01220 100644
--- a/dlls/vbscript/lex.c
+++ b/dlls/vbscript/lex.c
@@ -26,11 +26,61 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(vbscript);
 
+static const WCHAR callW[] = {'c','a','l','l',0};
+
+static const struct {
+    const WCHAR *word;
+    int token;
+} keywords[] = {
+    {callW, tCALL}
+};
+
 static inline BOOL is_identifier_char(WCHAR c)
 {
     return isalnumW(c) || c == '_';
 }
 
+static int check_keyword(parser_ctx_t *ctx, const WCHAR *word)
+{
+    const WCHAR *p1 = ctx->ptr;
+    const WCHAR *p2 = word;
+    WCHAR c;
+
+    while(p1 < ctx->end && *p2) {
+        c = tolowerW(*p1);
+        if(c != *p2)
+            return c - *p2;
+        p1++;
+        p2++;
+    }
+
+    if(*p2 || (p1 < ctx->end && is_identifier_char(*p1)))
+        return 1;
+
+    ctx->ptr = p1;
+    return 0;
+}
+
+static int check_keywords(parser_ctx_t *ctx)
+{
+    int min = 0, max = sizeof(keywords)/sizeof(keywords[0])-1, r, i;
+
+    while(min <= max) {
+        i = (min+max)/2;
+
+        r = check_keyword(ctx, keywords[i].word);
+        if(!r)
+            return keywords[i].token;
+
+        if(r > 0)
+            min = i+1;
+        else
+            max = i-1;
+    }
+
+    return 0;
+}
+
 static int parse_identifier(parser_ctx_t *ctx, const WCHAR **ret)
 {
     const WCHAR *ptr = ctx->ptr++;
@@ -62,8 +112,12 @@ static int parse_next_token(void *lval, parser_ctx_t *ctx)
 
     c = *ctx->ptr;
 
-    if(isalphaW(c))
-        return parse_identifier(ctx, lval);
+    if(isalphaW(c)) {
+        int ret = check_keywords(ctx);
+        if(!ret)
+            return parse_identifier(ctx, lval);
+        return ret;
+    }
 
     switch(c) {
     case '\n':
diff --git a/dlls/vbscript/parser.y b/dlls/vbscript/parser.y
index d5c7d40..447aa12 100644
--- a/dlls/vbscript/parser.y
+++ b/dlls/vbscript/parser.y
@@ -54,6 +54,7 @@ static statement_t *new_call_statement(parser_ctx_t*,member_expression_t*);
 }
 
 %token tEOF tNL blah
+%token tCALL
 %token <string> tIdentifier
 
 %type <statement> Statement StatementNl




More information about the wine-cvs mailing list