Module: wine Branch: master Commit: f8e72b295c2b5c3aa4783d753d9b15d649ac1460 URL: http://source.winehq.org/git/wine.git/?a=commit;h=f8e72b295c2b5c3aa4783d753d...
Author: Jacek Caban jacek@codeweavers.com Date: Tue Sep 6 15:18:55 2011 +0200
vbscript: Added beginning lexer implementation.
---
dlls/vbscript/Makefile.in | 1 + dlls/vbscript/lex.c | 56 +++++++++++++++++++++++++++++++++++++++++++++ dlls/vbscript/parse.h | 6 ++++- dlls/vbscript/parser.y | 11 ++++----- 4 files changed, 67 insertions(+), 7 deletions(-)
diff --git a/dlls/vbscript/Makefile.in b/dlls/vbscript/Makefile.in index 83a490d..ba267f4 100644 --- a/dlls/vbscript/Makefile.in +++ b/dlls/vbscript/Makefile.in @@ -1,6 +1,7 @@ MODULE = vbscript.dll
C_SRCS = \ + lex.c \ vbdisp.c \ vbscript.c \ vbscript_main.c diff --git a/dlls/vbscript/lex.c b/dlls/vbscript/lex.c new file mode 100644 index 0000000..0e7ecce --- /dev/null +++ b/dlls/vbscript/lex.c @@ -0,0 +1,56 @@ +/* + * Copyright 2011 Jacek Caban for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include <assert.h> + +#include "vbscript.h" +#include "parse.h" +#include "parser.tab.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(vbscript); + +static int parse_next_token(void *lval, parser_ctx_t *ctx) +{ + WCHAR c; + + while(*ctx->ptr == ' ' || *ctx->ptr == '\t' || *ctx->ptr == '\r') + ctx->ptr++; + if(ctx->ptr == ctx->end) + return ctx->last_token == tNL ? tEOF : tNL; + + c = *ctx->ptr; + FIXME("Unhandled char %c in %s\n", *ctx->ptr, debugstr_w(ctx->ptr)); + return c; +} + +int parser_lex(void *lval, parser_ctx_t *ctx) +{ + int ret; + + while(1) { + ret = parse_next_token(lval, ctx); + if(ret != tNL || ctx->last_token != tNL) + break; + + ctx->last_nl = ctx->ptr-ctx->code; + } + + return (ctx->last_token = ret); +} diff --git a/dlls/vbscript/parse.h b/dlls/vbscript/parse.h index 4c3abba..d6dfbbc 100644 --- a/dlls/vbscript/parse.h +++ b/dlls/vbscript/parse.h @@ -23,6 +23,10 @@ typedef struct {
BOOL parse_complete; HRESULT hres; + + int last_token; + unsigned last_nl; } parser_ctx_t;
-HRESULT parse_script(parser_ctx_t*,const WCHAR*); +HRESULT parse_script(parser_ctx_t*,const WCHAR*) DECLSPEC_HIDDEN; +int parser_lex(void*,parser_ctx_t*) DECLSPEC_HIDDEN; diff --git a/dlls/vbscript/parser.y b/dlls/vbscript/parser.y index 3871b62..e895cfd 100644 --- a/dlls/vbscript/parser.y +++ b/dlls/vbscript/parser.y @@ -33,12 +33,6 @@ static int parser_error(const char*);
static void parse_complete(parser_ctx_t*);
-static int parser_lex(void *lval, parser_ctx_t *ctx) -{ - FIXME("\n"); - return 0; -} - %}
%pure_parser @@ -50,6 +44,8 @@ static int parser_lex(void *lval, parser_ctx_t *ctx) const WCHAR *string; }
+%token tNL + %%
Program : tEOF { parse_complete(ctx); } @@ -74,6 +70,9 @@ HRESULT parse_script(parser_ctx_t *ctx, const WCHAR *code) ctx->parse_complete = FALSE; ctx->hres = S_OK;
+ ctx->last_token = tNL; + ctx->last_nl = 0; + parser_parse(ctx);
if(FAILED(ctx->hres))