xref: /reactos/dll/win32/jscript/parser.h (revision 019f21ee)
1 /*
2  * Copyright 2014 Jacek Caban for CodeWeavers
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  */
18 
19 #pragma once
20 
21 typedef struct _source_elements_t source_elements_t;
22 typedef struct _expression_t expression_t;
23 typedef struct _statement_t statement_t;
24 
25 typedef struct {
26     BOOL is_num;
27     union {
28         BOOL b;
29         double n;
30     } u;
31 } ccval_t;
32 
33 typedef struct _parser_ctx_t {
34     const WCHAR *begin;
35     const WCHAR *end;
36     const WCHAR *ptr;
37 
38     script_ctx_t *script;
39     struct _compiler_ctx_t *compiler;
40     source_elements_t *source;
41     BOOL nl;
42     BOOL implicit_nl_semicolon;
43     BOOL is_html;
44     BOOL lexer_error;
45     HRESULT hres;
46 
47     ccval_t ccval;
48     unsigned cc_if_depth;
49 
50     heap_pool_t heap;
51 } parser_ctx_t;
52 
53 HRESULT script_parse(script_ctx_t*,struct _compiler_ctx_t*,const WCHAR*,const WCHAR*,BOOL,parser_ctx_t**) DECLSPEC_HIDDEN;
54 void parser_release(parser_ctx_t*) DECLSPEC_HIDDEN;
55 
56 int parser_lex(void*,parser_ctx_t*) DECLSPEC_HIDDEN;
57 
58 static inline void *parser_alloc(parser_ctx_t *ctx, DWORD size)
59 {
60     return heap_pool_alloc(&ctx->heap, size);
61 }
62 
63 static inline void *parser_alloc_tmp(parser_ctx_t *ctx, DWORD size)
64 {
65     return heap_pool_alloc(&ctx->script->tmp_heap, size);
66 }
67 
68 BOOL is_identifier_char(WCHAR) DECLSPEC_HIDDEN;
69 BOOL unescape(WCHAR*,size_t*) DECLSPEC_HIDDEN;
70 HRESULT parse_decimal(const WCHAR**,const WCHAR*,double*) DECLSPEC_HIDDEN;
71 
72 typedef enum {
73     LT_DOUBLE,
74     LT_STRING,
75     LT_BOOL,
76     LT_NULL,
77     LT_REGEXP
78 }literal_type_t;
79 
80 typedef struct {
81     literal_type_t type;
82     union {
83         double dval;
84         jsstr_t *str;
85         BOOL bval;
86         struct {
87             jsstr_t *str;
88             DWORD flags;
89         } regexp;
90     } u;
91 } literal_t;
92 
93 literal_t *parse_regexp(parser_ctx_t*) DECLSPEC_HIDDEN;
94 literal_t *new_boolean_literal(parser_ctx_t*,BOOL) DECLSPEC_HIDDEN;
95 
96 typedef struct _variable_declaration_t {
97     const WCHAR *identifier;
98     expression_t *expr;
99 
100     struct _variable_declaration_t *next;
101     struct _variable_declaration_t *global_next; /* for compiler */
102 } variable_declaration_t;
103 
104 typedef enum {
105     STAT_BLOCK,
106     STAT_BREAK,
107     STAT_CONTINUE,
108     STAT_EMPTY,
109     STAT_EXPR,
110     STAT_FOR,
111     STAT_FORIN,
112     STAT_IF,
113     STAT_LABEL,
114     STAT_RETURN,
115     STAT_SWITCH,
116     STAT_THROW,
117     STAT_TRY,
118     STAT_VAR,
119     STAT_WHILE,
120     STAT_WITH
121 } statement_type_t;
122 
123 struct _statement_t {
124     statement_type_t type;
125     statement_t *next;
126 };
127 
128 typedef struct {
129     statement_t stat;
130     statement_t *stat_list;
131 } block_statement_t;
132 
133 typedef struct {
134     statement_t stat;
135     variable_declaration_t *variable_list;
136 } var_statement_t;
137 
138 typedef struct {
139     statement_t stat;
140     expression_t *expr;
141 } expression_statement_t;
142 
143 typedef struct {
144     statement_t stat;
145     expression_t *expr;
146     statement_t *if_stat;
147     statement_t *else_stat;
148 } if_statement_t;
149 
150 typedef struct {
151     statement_t stat;
152     BOOL do_while;
153     expression_t *expr;
154     statement_t *statement;
155 } while_statement_t;
156 
157 typedef struct {
158     statement_t stat;
159     variable_declaration_t *variable_list;
160     expression_t *begin_expr;
161     expression_t *expr;
162     expression_t *end_expr;
163     statement_t *statement;
164 } for_statement_t;
165 
166 typedef struct {
167     statement_t stat;
168     variable_declaration_t *variable;
169     expression_t *expr;
170     expression_t *in_expr;
171     statement_t *statement;
172 } forin_statement_t;
173 
174 typedef struct {
175     statement_t stat;
176     const WCHAR *identifier;
177 } branch_statement_t;
178 
179 typedef struct {
180     statement_t stat;
181     expression_t *expr;
182     statement_t *statement;
183 } with_statement_t;
184 
185 typedef struct {
186     statement_t stat;
187     const WCHAR *identifier;
188     statement_t *statement;
189 } labelled_statement_t;
190 
191 typedef struct _case_clausule_t {
192     expression_t *expr;
193     statement_t *stat;
194 
195     struct _case_clausule_t *next;
196 } case_clausule_t;
197 
198 typedef struct {
199     statement_t stat;
200     expression_t *expr;
201     case_clausule_t *case_list;
202 } switch_statement_t;
203 
204 typedef struct {
205     const WCHAR *identifier;
206     statement_t *statement;
207 } catch_block_t;
208 
209 typedef struct {
210     statement_t stat;
211     statement_t *try_statement;
212     catch_block_t *catch_block;
213     statement_t *finally_statement;
214 } try_statement_t;
215 
216 typedef enum {
217      EXPR_COMMA,
218      EXPR_OR,
219      EXPR_AND,
220      EXPR_BOR,
221      EXPR_BXOR,
222      EXPR_BAND,
223      EXPR_INSTANCEOF,
224      EXPR_IN,
225      EXPR_ADD,
226      EXPR_SUB,
227      EXPR_MUL,
228      EXPR_DIV,
229      EXPR_MOD,
230      EXPR_DELETE,
231      EXPR_VOID,
232      EXPR_TYPEOF,
233      EXPR_MINUS,
234      EXPR_PLUS,
235      EXPR_POSTINC,
236      EXPR_POSTDEC,
237      EXPR_PREINC,
238      EXPR_PREDEC,
239      EXPR_EQ,
240      EXPR_EQEQ,
241      EXPR_NOTEQ,
242      EXPR_NOTEQEQ,
243      EXPR_LESS,
244      EXPR_LESSEQ,
245      EXPR_GREATER,
246      EXPR_GREATEREQ,
247      EXPR_BITNEG,
248      EXPR_LOGNEG,
249      EXPR_LSHIFT,
250      EXPR_RSHIFT,
251      EXPR_RRSHIFT,
252      EXPR_ASSIGN,
253      EXPR_ASSIGNLSHIFT,
254      EXPR_ASSIGNRSHIFT,
255      EXPR_ASSIGNRRSHIFT,
256      EXPR_ASSIGNADD,
257      EXPR_ASSIGNSUB,
258      EXPR_ASSIGNMUL,
259      EXPR_ASSIGNDIV,
260      EXPR_ASSIGNMOD,
261      EXPR_ASSIGNAND,
262      EXPR_ASSIGNOR,
263      EXPR_ASSIGNXOR,
264      EXPR_COND,
265      EXPR_ARRAY,
266      EXPR_MEMBER,
267      EXPR_NEW,
268      EXPR_CALL,
269      EXPR_THIS,
270      EXPR_FUNC,
271      EXPR_IDENT,
272      EXPR_ARRAYLIT,
273      EXPR_PROPVAL,
274      EXPR_LITERAL
275 } expression_type_t;
276 
277 struct _expression_t {
278     expression_type_t type;
279 };
280 
281 typedef struct _parameter_t {
282     const WCHAR *identifier;
283     struct _parameter_t *next;
284 } parameter_t;
285 
286 struct _source_elements_t {
287     statement_t *statement;
288     statement_t *statement_tail;
289 };
290 
291 typedef struct _function_expression_t {
292     expression_t expr;
293     const WCHAR *identifier;
294     const WCHAR *event_target;
295     parameter_t *parameter_list;
296     source_elements_t *source_elements;
297     const WCHAR *src_str;
298     DWORD src_len;
299     unsigned func_id;
300 
301     struct _function_expression_t *next; /* for compiler */
302 } function_expression_t;
303 
304 typedef struct {
305     expression_t expr;
306     expression_t *expression1;
307     expression_t *expression2;
308 } binary_expression_t;
309 
310 typedef struct {
311     expression_t expr;
312     expression_t *expression;
313 } unary_expression_t;
314 
315 typedef struct {
316     expression_t expr;
317     expression_t *expression;
318     expression_t *true_expression;
319     expression_t *false_expression;
320 } conditional_expression_t;
321 
322 typedef struct {
323     expression_t expr;
324     expression_t *expression;
325     const WCHAR *identifier;
326 } member_expression_t;
327 
328 typedef struct _argument_t {
329     expression_t *expr;
330 
331     struct _argument_t *next;
332 } argument_t;
333 
334 typedef struct {
335     expression_t expr;
336     expression_t *expression;
337     argument_t *argument_list;
338 } call_expression_t;
339 
340 typedef struct {
341     expression_t expr;
342     const WCHAR *identifier;
343 } identifier_expression_t;
344 
345 typedef struct {
346     expression_t expr;
347     literal_t *literal;
348 } literal_expression_t;
349 
350 typedef struct _array_element_t {
351     int elision;
352     expression_t *expr;
353 
354     struct _array_element_t *next;
355 } array_element_t;
356 
357 typedef struct {
358     expression_t expr;
359     array_element_t *element_list;
360     int length;
361 } array_literal_expression_t;
362 
363 typedef struct _property_definition_t {
364     unsigned type;
365     literal_t *name;
366     expression_t *value;
367 
368     struct _property_definition_t *next;
369 } property_definition_t;
370 
371 typedef struct {
372     expression_t expr;
373     property_definition_t *property_list;
374 } property_value_expression_t;
375 
376 BOOL try_parse_ccval(parser_ctx_t*,ccval_t*) DECLSPEC_HIDDEN;
377 BOOL parse_cc_expr(parser_ctx_t*) DECLSPEC_HIDDEN;
378 
379 static inline ccval_t ccval_num(double n)
380 {
381     ccval_t r;
382     r.is_num = TRUE;
383     r.u.n = n;
384     return r;
385 }
386 
387 static inline ccval_t ccval_bool(BOOL b)
388 {
389     ccval_t r;
390     r.is_num = FALSE;
391     r.u.b = b;
392     return r;
393 }
394 
395 static inline BOOL get_ccbool(ccval_t v)
396 {
397     return v.is_num ? v.u.n != 0 : v.u.b;
398 }
399 
400 static inline double get_ccnum(ccval_t v)
401 {
402     return v.is_num ? v.u.n : v.u.b;
403 }
404 
405 jsstr_t *compiler_alloc_string_len(struct _compiler_ctx_t*,const WCHAR *,unsigned) DECLSPEC_HIDDEN;
406