Jacek Caban : vbscript: Added class parser implementation.
Alexandre Julliard
julliard at winehq.org
Thu Sep 15 12:34:54 CDT 2011
Module: wine
Branch: master
Commit: 80ad3a23fa095b420f4aed23a5f9dc9a79c13688
URL: http://source.winehq.org/git/wine.git/?a=commit;h=80ad3a23fa095b420f4aed23a5f9dc9a79c13688
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Sep 15 14:16:47 2011 +0200
vbscript: Added class parser implementation.
---
dlls/vbscript/parse.h | 6 ++++++
dlls/vbscript/parser.y | 32 +++++++++++++++++++++++++++++++-
dlls/vbscript/tests/lang.vbs | 3 +++
3 files changed, 40 insertions(+), 1 deletions(-)
diff --git a/dlls/vbscript/parse.h b/dlls/vbscript/parse.h
index 7e1124c..67fa221 100644
--- a/dlls/vbscript/parse.h
+++ b/dlls/vbscript/parse.h
@@ -142,6 +142,11 @@ typedef struct _function_statement_t {
function_decl_t *func_decl;
} function_statement_t;
+typedef struct _class_decl_t {
+ const WCHAR *name;
+ struct _class_decl_t *next;
+} class_decl_t;
+
typedef struct _elseif_decl_t {
expression_t *expr;
statement_t *stat;
@@ -170,6 +175,7 @@ typedef struct {
statement_t *stats;
statement_t *stats_tail;
+ class_decl_t *class_decls;
vbsheap_t heap;
} parser_ctx_t;
diff --git a/dlls/vbscript/parser.y b/dlls/vbscript/parser.y
index a6281d6..6d8a674 100644
--- a/dlls/vbscript/parser.y
+++ b/dlls/vbscript/parser.y
@@ -34,6 +34,7 @@ static int parser_error(const char*);
static void parse_complete(parser_ctx_t*,BOOL);
static void source_add_statement(parser_ctx_t*,statement_t*);
+static void source_add_class(parser_ctx_t*,class_decl_t*);
static void *new_expression(parser_ctx_t*,expression_type_t,size_t);
static expression_t *new_bool_expression(parser_ctx_t*,VARIANT_BOOL);
@@ -56,6 +57,7 @@ static dim_decl_t *new_dim_decl(parser_ctx_t*,const WCHAR*,dim_decl_t*);
static elseif_decl_t *new_elseif_decl(parser_ctx_t*,expression_t*,statement_t*);
static function_decl_t *new_function_decl(parser_ctx_t*,const WCHAR*,function_type_t,arg_decl_t*,statement_t*);
static arg_decl_t *new_argument_decl(parser_ctx_t*,const WCHAR*,BOOL);
+static class_decl_t *new_class_decl(parser_ctx_t*);
#define CHECK_ERROR if(((parser_ctx_t*)ctx)->hres != S_OK) YYABORT
@@ -73,6 +75,7 @@ static arg_decl_t *new_argument_decl(parser_ctx_t*,const WCHAR*,BOOL);
dim_decl_t *dim_decl;
function_decl_t *func_decl;
arg_decl_t *arg_decl;
+ class_decl_t *class_decl;
LONG lng;
BOOL bool;
double dbl;
@@ -105,6 +108,7 @@ static arg_decl_t *new_argument_decl(parser_ctx_t*,const WCHAR*,BOOL);
%type <arg_decl> ArgumentsDecl_opt ArgumentDeclList ArgumentDecl
%type <func_decl> FunctionDecl
%type <elseif> ElseIfs_opt ElseIfs ElseIf
+%type <class_decl> ClassDeclaration ClassBody
%type <dim_decl> DimDeclList
%%
@@ -118,7 +122,8 @@ OptionExplicit_opt
SourceElements
: /* empty */
- | SourceElements StatementNl { source_add_statement(ctx, $2); }
+ | SourceElements StatementNl { source_add_statement(ctx, $2); }
+ | SourceElements ClassDeclaration { source_add_class(ctx, $2); }
StatementsNl_opt
: /* empty */ { $$ = NULL; }
@@ -268,6 +273,12 @@ LiteralExpression
PrimaryExpression
: '(' Expression ')' { $$ = $2; }
+ClassDeclaration
+ : tCLASS tIdentifier tNL ClassBody tEND tCLASS tNL { $4->name = $2; $$ = $4; }
+
+ClassBody
+ : /* empty */ { $$ = new_class_decl(ctx); }
+
FunctionDecl
: /* Storage_opt */ tSUB tIdentifier ArgumentsDecl_opt tNL StatementsNl_opt tEND tSUB
{ $$ = new_function_decl(ctx, $2, FUNC_SUB, $3, $5); CHECK_ERROR; }
@@ -304,6 +315,12 @@ static void source_add_statement(parser_ctx_t *ctx, statement_t *stat)
}
}
+static void source_add_class(parser_ctx_t *ctx, class_decl_t *class_decl)
+{
+ class_decl->next = ctx->class_decls;
+ ctx->class_decls = class_decl;
+}
+
static void parse_complete(parser_ctx_t *ctx, BOOL option_explicit)
{
ctx->parse_complete = TRUE;
@@ -545,6 +562,18 @@ static statement_t *new_function_statement(parser_ctx_t *ctx, function_decl_t *d
return &stat->stat;
}
+static class_decl_t *new_class_decl(parser_ctx_t *ctx)
+{
+ class_decl_t *class_decl;
+
+ class_decl = parser_alloc(ctx, sizeof(*class_decl));
+ if(!class_decl)
+ return NULL;
+
+ class_decl->next = NULL;
+ return class_decl;
+}
+
void *parser_alloc(parser_ctx_t *ctx, size_t size)
{
void *ret;
@@ -568,6 +597,7 @@ HRESULT parse_script(parser_ctx_t *ctx, const WCHAR *code)
ctx->last_token = tNL;
ctx->last_nl = 0;
ctx->stats = ctx->stats_tail = NULL;
+ ctx->class_decls = NULL;
ctx->option_explicit = FALSE;
parser_parse(ctx);
diff --git a/dlls/vbscript/tests/lang.vbs b/dlls/vbscript/tests/lang.vbs
index b9b5c57..a338e76 100644
--- a/dlls/vbscript/tests/lang.vbs
+++ b/dlls/vbscript/tests/lang.vbs
@@ -355,4 +355,7 @@ x = false
ok SetVal(x, true), "SetVal returned false?"
Call ok(x, "x is not set to true by SetVal?")
+Class EmptyClass
+End Class
+
reportSuccess()
More information about the wine-cvs
mailing list