vbscript: Added class parser implementation.
This commit is contained in:
parent
84ec1acced
commit
80ad3a23fa
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Reference in New Issue