]> git.saurik.com Git - cycript.git/blob - Cycript.y
f6ac4de9a71c868c00292f80711425051c0cda94
[cycript.git] / Cycript.y
1 %code top {
2 #include "Parser.hpp"
3 #include "Cycript.tab.h"
4 void cyerror(YYLTYPE *locp, CYParser *context, const char *msg);
5 int cylex(YYSTYPE *lvalp, YYLTYPE *llocp);
6 }
7
8 %name-prefix "cy"
9
10 %locations
11 %define api.pure
12 %glr-parser
13
14 %defines
15
16 %debug
17 %error-verbose
18
19 %parse-param { CYParser *context }
20
21 %token CYTokenAmpersand "&"
22 %token CYTokenAmpersandAmpersand "&&"
23 %token CYTokenAmpersandEqual "&="
24 %token CYTokenCarrot "^"
25 %token CYTokenCarrotEqual "^="
26 %token CYTokenEqual "="
27 %token CYTokenEqualEqual "=="
28 %token CYTokenEqualEqualEqual "==="
29 %token CYTokenExclamation "!"
30 %token CYTokenExclamationEqual "!="
31 %token CYTokenExclamationEqualEqual "!=="
32 %token CYTokenHyphen "-"
33 %token CYTokenHyphenEqual "-="
34 %token CYTokenHyphenHyphen "--"
35 %token CYTokenHyphenRight "->"
36 %token CYTokenLeft "<"
37 %token CYTokenLeftEqual "<="
38 %token CYTokenLeftLeft "<<"
39 %token CYTokenLeftLeftEqual "<<="
40 %token CYTokenPercent "%"
41 %token CYTokenPercentEqual "%="
42 %token CYTokenPeriod "."
43 %token CYTokenPipe "|"
44 %token CYTokenPipeEqual "|="
45 %token CYTokenPipePipe "||"
46 %token CYTokenPlus "+"
47 %token CYTokenPlusEqual "+="
48 %token CYTokenPlusPlus "++"
49 %token CYTokenRight ">"
50 %token CYTokenRightEqual ">="
51 %token CYTokenRightRight ">>"
52 %token CYTokenRightRightEqual ">>="
53 %token CYTokenRightRightRight ">>>"
54 %token CYTokenRightRightRightEqual ">>>="
55 %token CYTokenSlash "/"
56 %token CYTokenSlashEqual "/="
57 %token CYTokenStar "*"
58 %token CYTokenStarEqual "*="
59 %token CYTokenTilde "~"
60
61 %token CYTokenColon ":"
62 %token CYTokenComma ","
63 %token CYTokenQuestion "?"
64 %token CYTokenSemiColon ";"
65
66 %token CYTokenOpenParen "("
67 %token CYTokenCloseParen ")"
68 %token CYTokenOpenBrace "{"
69 %token CYTokenCloseBrace "}"
70 %token CYTokenOpenBracket "["
71 %token CYTokenCloseBracket "]"
72
73 %token CYTokenBreak "break"
74 %token CYTokenCase "case"
75 %token CYTokenCatch "catch"
76 %token CYTokenContinue "continue"
77 %token CYTokenDefault "default"
78 %token CYTokenDelete "delete"
79 %token CYTokenDo "do"
80 %token CYTokenElse "else"
81 %token CYTokenFalse "false"
82 %token CYTokenFinally "finally"
83 %token CYTokenFor "for"
84 %token CYTokenFunction "function"
85 %token CYTokenIf "if"
86 %token CYTokenIn "in"
87 %token CYTokenInstanceOf "instanceof"
88 %token CYTokenNew "new"
89 %token CYTokenNull "null"
90 %token CYTokenReturn "return"
91 %token CYTokenSwitch "switch"
92 %token CYTokenThis "this"
93 %token CYTokenThrow "throw"
94 %token CYTokenTrue "true"
95 %token CYTokenTry "try"
96 %token CYTokenTypeOf "typeof"
97 %token CYTokenVar "var"
98 %token CYTokenVoid "void"
99 %token CYTokenWhile "while"
100 %token CYTokenWith "with"
101
102 %token CYTokenIdentifier
103 %token CYTokenNumber
104 %token CYTokenString
105
106 %%
107
108 Start
109 : Program
110 ;
111
112 IdentifierOpt
113 : Identifier
114 |
115 ;
116
117 Identifier
118 : CYTokenIdentifier
119 ;
120
121 Literal
122 : NullLiteral
123 | BooleanLiteral
124 | NumericLiteral
125 | StringLiteral
126 ;
127
128 NullLiteral
129 : "null"
130 ;
131
132 BooleanLiteral
133 : "true"
134 | "false"
135 ;
136
137 NumericLiteral
138 : CYTokenNumber
139 ;
140
141 StringLiteral
142 : CYTokenString
143 ;
144
145 /* Objective-C Extensions {{{ */
146 VariadicCall
147 : "," AssignmentExpression VariadicCall
148 |
149 ;
150
151 SelectorCall_
152 : SelectorCall
153 | VariadicCall
154 ;
155
156 SelectorCall
157 : IdentifierOpt ":" AssignmentExpression SelectorCall_
158 ;
159
160 SelectorList
161 : SelectorCall
162 | Identifier
163 ;
164
165 ObjectiveCall
166 : "[" AssignmentExpression SelectorList "]"
167 ;
168 /* }}} */
169
170 /* 11.1 Primary Expressions {{{ */
171 PrimaryExpression
172 : "this"
173 | Identifier
174 | Literal
175 | ArrayLiteral
176 | ObjectLiteral
177 | "(" Expression ")"
178 | ObjectiveCall
179 ;
180 /* }}} */
181 /* 11.1.4 Array Initialiser {{{ */
182 ArrayLiteral
183 : "[" ElementList "]"
184 ;
185
186 Element
187 : AssignmentExpression
188 |
189 ;
190
191 ElementList_
192 : "," ElementList
193 |
194 ;
195
196 ElementList
197 : Element ElementList_
198 ;
199 /* }}} */
200 /* 11.1.5 Object Initialiser {{{ */
201 ObjectLiteral
202 : "{" PropertyNameAndValueListOpt "}"
203 ;
204
205 PropertyNameAndValueList_
206 : "," PropertyNameAndValueList
207 |
208 ;
209
210 PropertyNameAndValueListOpt
211 : PropertyNameAndValueList
212 |
213 ;
214
215 PropertyNameAndValueList
216 : PropertyName ":" AssignmentExpression PropertyNameAndValueList_
217 ;
218
219 PropertyName
220 : Identifier
221 | StringLiteral
222 | NumericLiteral
223 ;
224 /* }}} */
225
226 MemberExpression
227 : PrimaryExpression
228 | FunctionExpression
229 | MemberExpression "[" Expression "]"
230 | MemberExpression "." Identifier
231 | "new" MemberExpression Arguments
232 ;
233
234 NewExpression
235 : MemberExpression
236 | "new" NewExpression
237 ;
238
239 CallExpression
240 : MemberExpression Arguments
241 | CallExpression Arguments
242 | CallExpression "[" Expression "]"
243 | CallExpression "." Identifier
244 ;
245
246 ArgumentList_
247 : "," ArgumentList
248 |
249 ;
250
251 ArgumentListOpt
252 : ArgumentList
253 |
254 ;
255
256 ArgumentList
257 : AssignmentExpression ArgumentList_
258 ;
259
260 Arguments
261 : "(" ArgumentListOpt ")"
262 ;
263
264 LeftHandSideExpression
265 : NewExpression
266 | CallExpression
267 ;
268
269 PostfixExpression
270 : LeftHandSideExpression
271 | LeftHandSideExpression "++"
272 | LeftHandSideExpression "--"
273 ;
274
275 UnaryExpression
276 : PostfixExpression
277 | "delete" UnaryExpression
278 | "void" UnaryExpression
279 | "typeof" UnaryExpression
280 | "++" UnaryExpression
281 | "--" UnaryExpression
282 | "+" UnaryExpression
283 | "-" UnaryExpression
284 | "~" UnaryExpression
285 | "!" UnaryExpression
286 | "*" UnaryExpression
287 | "&" UnaryExpression
288 ;
289
290 MultiplicativeExpression
291 : UnaryExpression
292 | MultiplicativeExpression "*" UnaryExpression
293 | MultiplicativeExpression "/" UnaryExpression
294 | MultiplicativeExpression "%" UnaryExpression
295 ;
296
297 AdditiveExpression
298 : MultiplicativeExpression
299 | AdditiveExpression "+" MultiplicativeExpression
300 | AdditiveExpression "-" MultiplicativeExpression
301 ;
302
303 ShiftExpression
304 : AdditiveExpression
305 | ShiftExpression "<<" AdditiveExpression
306 | ShiftExpression ">>" AdditiveExpression
307 | ShiftExpression ">>>" AdditiveExpression
308 ;
309
310 RelationalExpression
311 : ShiftExpression
312 | RelationalExpression "<" ShiftExpression
313 | RelationalExpression ">" ShiftExpression
314 | RelationalExpression "<=" ShiftExpression
315 | RelationalExpression ">=" ShiftExpression
316 | RelationalExpression "instanceof" ShiftExpression
317 | RelationalExpression "in" ShiftExpression
318 ;
319
320 EqualityExpression
321 : RelationalExpression
322 | EqualityExpression "==" RelationalExpression
323 | EqualityExpression "!=" RelationalExpression
324 | EqualityExpression "===" RelationalExpression
325 | EqualityExpression "!==" RelationalExpression
326 ;
327
328 BitwiseANDExpression
329 : EqualityExpression
330 | BitwiseANDExpression "&" EqualityExpression
331 ;
332
333 BitwiseXORExpression
334 : BitwiseANDExpression
335 | BitwiseXORExpression "^" BitwiseANDExpression
336 ;
337
338 BitwiseORExpression
339 : BitwiseXORExpression
340 | BitwiseORExpression "|" BitwiseXORExpression
341 ;
342
343 LogicalANDExpression
344 : BitwiseORExpression
345 | LogicalANDExpression "&&" BitwiseORExpression
346 ;
347
348 LogicalORExpression
349 : LogicalANDExpression
350 | LogicalORExpression "||" LogicalANDExpression
351 ;
352
353 ConditionalExpression
354 : LogicalORExpression
355 | LogicalORExpression "?" AssignmentExpression ":" AssignmentExpression
356 ;
357
358 AssignmentExpression
359 : ConditionalExpression
360 | LeftHandSideExpression AssignmentOperator AssignmentExpression
361 ;
362
363 AssignmentOperator
364 : "="
365 | "*="
366 | "/="
367 | "%="
368 | "+="
369 | "-="
370 | "<<="
371 | ">>="
372 | ">>>="
373 | "&="
374 | "^="
375 | "|="
376 ;
377
378 Expression_
379 : "," Expression
380 |
381 ;
382
383 ExpressionOpt
384 : Expression
385 |
386 ;
387
388 Expression
389 : AssignmentExpression Expression_
390 ;
391
392 Statement
393 : Block
394 | VariableStatement
395 | EmptyStatement
396 | ExpressionStatement
397 | IfStatement
398 | IterationStatement
399 | ContinueStatement
400 | BreakStatement
401 | ReturnStatement
402 | WithStatement
403 | LabelledStatement
404 | SwitchStatement
405 | ThrowStatement
406 | TryStatement
407 ;
408
409 Block
410 : "{" StatementListOpt "}"
411 ;
412
413 StatementListOpt
414 : Statement StatementListOpt
415 |
416 ;
417
418 VariableStatement
419 : "var" VariableDeclarationList ";"
420 ;
421
422 VariableDeclarationList_
423 : "," VariableDeclarationList
424 |
425 ;
426
427 VariableDeclarationList
428 : VariableDeclaration VariableDeclarationList_
429 ;
430
431 VariableDeclaration
432 : Identifier InitialiserOpt
433 ;
434
435 InitialiserOpt
436 : Initialiser
437 |
438 ;
439
440 Initialiser
441 : "=" AssignmentExpression
442 ;
443
444 EmptyStatement
445 : ";"
446 ;
447
448 ExpressionStatement
449 : Expression ";"
450 ;
451
452 ElseStatementOpt
453 : "else" Statement
454 |
455 ;
456
457 IfStatement
458 : "if" "(" Expression ")" Statement ElseStatementOpt
459 ;
460
461 IterationStatement
462 : DoWhileStatement
463 | WhileStatement
464 | ForStatement
465 | ForInStatement
466 ;
467
468 DoWhileStatement
469 : "do" Statement "while" "(" Expression ")" ";"
470 ;
471
472 WhileStatement
473 : "while" "(" Expression ")" Statement
474 ;
475
476 ForStatement
477 : "for" "(" ForStatementInitialiser ";" ExpressionOpt ";" ExpressionOpt ")" Statement
478 ;
479
480 ForStatementInitialiser
481 : ExpressionOpt
482 | "var" VariableDeclarationList
483 ;
484
485 ForInStatement
486 : "for" "(" ForInStatementInitialiser "in" Expression ")" Statement
487 ;
488
489 ForInStatementInitialiser
490 : LeftHandSideExpression
491 | "var" VariableDeclaration
492 ;
493
494 ContinueStatement
495 : "continue" IdentifierOpt ";"
496 ;
497
498 BreakStatement
499 : "break" IdentifierOpt ";"
500 ;
501
502 ReturnStatement
503 : "return" ExpressionOpt ";"
504 ;
505
506 WithStatement
507 : "with" "(" Expression ")" Statement
508 ;
509
510 SwitchStatement
511 : "switch" "(" Expression ")" CaseBlock
512 ;
513
514 CaseBlock
515 : "{" CaseClausesOpt "}"
516 ;
517
518 CaseClausesOpt
519 : CaseClause CaseClausesOpt
520 | DefaultClause CaseClausesOpt
521 |
522 ;
523
524 CaseClause
525 : "case" Expression ":" StatementListOpt
526 ;
527
528 DefaultClause
529 : "default" ":" StatementListOpt
530 ;
531
532 LabelledStatement
533 : Identifier ":" Statement
534 ;
535
536 ThrowStatement
537 : "throw" Expression ";"
538 ;
539
540 TryStatement
541 : "try" Block CatchOpt FinallyOpt
542 ;
543
544 CatchOpt
545 : "catch" "(" Identifier ")" Block
546 |
547 ;
548
549 FinallyOpt
550 : "finally" Block
551 |
552 ;
553
554 FunctionDeclaration
555 : "function" Identifier "(" FormalParameterList ")" "{" FunctionBody "}"
556 ;
557
558 FunctionExpression
559 : "function" IdentifierOpt "(" FormalParameterList ")" "{" FunctionBody "}"
560 ;
561
562 FormalParameterList_
563 : "," FormalParameterList
564 |
565 ;
566
567 FormalParameterList
568 : Identifier FormalParameterList_
569 |
570 ;
571
572 FunctionBody
573 : SourceElements
574 ;
575
576 Program
577 : SourceElements
578 ;
579
580 SourceElements
581 : SourceElement SourceElements
582 |
583 ;
584
585 SourceElement
586 : Statement
587 | FunctionDeclaration
588 ;
589
590 %%
591
592 #include <stdio.h>
593
594 void cyerror(YYLTYPE *locp, CYParser *context, const char *msg) {
595 fprintf(stderr, "err:%s\n", msg);
596 }