From 0e415e0c0f512bf3ab937aedb917650847488d55 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Thu, 8 Sep 2011 14:56:48 +0200 Subject: [PATCH] vbscript: Added lexer support for string literals. --- dlls/vbscript/lex.c | 45 ++++++++++++++++++++++++++++++++++++++++++ dlls/vbscript/parser.y | 2 +- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/dlls/vbscript/lex.c b/dlls/vbscript/lex.c index 04ade1e8ade..2fd51bcb1c5 100644 --- a/dlls/vbscript/lex.c +++ b/dlls/vbscript/lex.c @@ -197,6 +197,49 @@ static int parse_identifier(parser_ctx_t *ctx, const WCHAR **ret) return tIdentifier; } +static int parse_string_literal(parser_ctx_t *ctx, const WCHAR **ret) +{ + const WCHAR *ptr = ++ctx->ptr; + WCHAR *rptr; + int len = 0; + + while(ctx->ptr < ctx->end) { + if(*ctx->ptr == '\n') { + FIXME("newline inside string literal\n"); + return 0; + } + + if(*ctx->ptr == '"') { + if(ctx->ptr[1] != '"') + break; + len--; + ctx->ptr++; + } + ctx->ptr++; + } + + if(ctx->ptr == ctx->end) { + FIXME("unterminated string literal\n"); + return 0; + } + + len += ctx->ptr-ptr; + + *ret = rptr = parser_alloc(ctx, (len+1)*sizeof(WCHAR)); + if(!rptr) + return 0; + + while(ptr < ctx->ptr) { + if(*ptr == '"') + ptr++; + *rptr++ = *ptr++; + } + + *rptr = 0; + ctx->ptr++; + return tString; +} + static int parse_next_token(void *lval, parser_ctx_t *ctx) { WCHAR c; @@ -238,6 +281,8 @@ static int parse_next_token(void *lval, parser_ctx_t *ctx) case '\\': case '.': return *ctx->ptr++; + case '"': + return parse_string_literal(ctx, lval); default: FIXME("Unhandled char %c in %s\n", *ctx->ptr, debugstr_w(ctx->ptr)); } diff --git a/dlls/vbscript/parser.y b/dlls/vbscript/parser.y index 3761b13616d..06a0eb3db6f 100644 --- a/dlls/vbscript/parser.y +++ b/dlls/vbscript/parser.y @@ -68,7 +68,7 @@ static statement_t *new_call_statement(parser_ctx_t*,member_expression_t*); %token tNOTHING tEMPTY tNULL %token tCLASS tSET tNEW tPUBLIC tPRIVATE tDEFAULT tME %token tERROR tNEXT tON tRESUME tGOTO -%token tIdentifier +%token tIdentifier tString %type Statement StatementNl %type Expression LiteralExpression