modulr 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +22 -0
- data/README.markdown +62 -0
- data/Rakefile +55 -0
- data/VERSION +1 -0
- data/assets/modulr.js +58 -0
- data/bin/modulrize +39 -0
- data/example/foo/bar.js +1 -0
- data/example/foo/foo.js +3 -0
- data/example/increment.js +6 -0
- data/example/inspect.js +3 -0
- data/example/math.js +7 -0
- data/example/program.js +9 -0
- data/lib/modulr/collector.rb +60 -0
- data/lib/modulr/js_module.rb +88 -0
- data/lib/modulr/version.rb +6 -0
- data/lib/modulr.rb +21 -0
- data/vendor/rkelly/CHANGELOG.rdoc +13 -0
- data/vendor/rkelly/Manifest.txt +198 -0
- data/vendor/rkelly/README.rdoc +58 -0
- data/vendor/rkelly/Rakefile +39 -0
- data/vendor/rkelly/lib/parser.y +870 -0
- data/vendor/rkelly/lib/rkelly/constants.rb +3 -0
- data/vendor/rkelly/lib/rkelly/generated_parser.rb +3237 -0
- data/vendor/rkelly/lib/rkelly/js/array.rb +15 -0
- data/vendor/rkelly/lib/rkelly/js/base.rb +91 -0
- data/vendor/rkelly/lib/rkelly/js/boolean.rb +21 -0
- data/vendor/rkelly/lib/rkelly/js/function.rb +39 -0
- data/vendor/rkelly/lib/rkelly/js/function_prototype.rb +15 -0
- data/vendor/rkelly/lib/rkelly/js/global_object.rb +52 -0
- data/vendor/rkelly/lib/rkelly/js/math.rb +10 -0
- data/vendor/rkelly/lib/rkelly/js/nan.rb +18 -0
- data/vendor/rkelly/lib/rkelly/js/number.rb +22 -0
- data/vendor/rkelly/lib/rkelly/js/object.rb +30 -0
- data/vendor/rkelly/lib/rkelly/js/object_prototype.rb +14 -0
- data/vendor/rkelly/lib/rkelly/js/property.rb +20 -0
- data/vendor/rkelly/lib/rkelly/js/scope.rb +6 -0
- data/vendor/rkelly/lib/rkelly/js/string.rb +21 -0
- data/vendor/rkelly/lib/rkelly/js.rb +14 -0
- data/vendor/rkelly/lib/rkelly/lexeme.rb +18 -0
- data/vendor/rkelly/lib/rkelly/nodes/binary_node.rb +18 -0
- data/vendor/rkelly/lib/rkelly/nodes/bracket_accessor_node.rb +11 -0
- data/vendor/rkelly/lib/rkelly/nodes/case_clause_node.rb +11 -0
- data/vendor/rkelly/lib/rkelly/nodes/comma_node.rb +11 -0
- data/vendor/rkelly/lib/rkelly/nodes/conditional_node.rb +11 -0
- data/vendor/rkelly/lib/rkelly/nodes/dot_accessor_node.rb +11 -0
- data/vendor/rkelly/lib/rkelly/nodes/for_in_node.rb +12 -0
- data/vendor/rkelly/lib/rkelly/nodes/for_node.rb +13 -0
- data/vendor/rkelly/lib/rkelly/nodes/function_call_node.rb +16 -0
- data/vendor/rkelly/lib/rkelly/nodes/function_decl_node.rb +6 -0
- data/vendor/rkelly/lib/rkelly/nodes/function_expr_node.rb +12 -0
- data/vendor/rkelly/lib/rkelly/nodes/if_node.rb +12 -0
- data/vendor/rkelly/lib/rkelly/nodes/label_node.rb +11 -0
- data/vendor/rkelly/lib/rkelly/nodes/new_expr_node.rb +11 -0
- data/vendor/rkelly/lib/rkelly/nodes/node.rb +88 -0
- data/vendor/rkelly/lib/rkelly/nodes/not_strict_equal_node.rb +6 -0
- data/vendor/rkelly/lib/rkelly/nodes/op_equal_node.rb +16 -0
- data/vendor/rkelly/lib/rkelly/nodes/postfix_node.rb +11 -0
- data/vendor/rkelly/lib/rkelly/nodes/prefix_node.rb +6 -0
- data/vendor/rkelly/lib/rkelly/nodes/property_node.rb +13 -0
- data/vendor/rkelly/lib/rkelly/nodes/resolve_node.rb +19 -0
- data/vendor/rkelly/lib/rkelly/nodes/strict_equal_node.rb +6 -0
- data/vendor/rkelly/lib/rkelly/nodes/try_node.rb +13 -0
- data/vendor/rkelly/lib/rkelly/nodes/var_decl_node.rb +15 -0
- data/vendor/rkelly/lib/rkelly/nodes.rb +25 -0
- data/vendor/rkelly/lib/rkelly/parser.rb +104 -0
- data/vendor/rkelly/lib/rkelly/runtime/ruby_function.rb +13 -0
- data/vendor/rkelly/lib/rkelly/runtime/scope_chain.rb +57 -0
- data/vendor/rkelly/lib/rkelly/runtime.rb +36 -0
- data/vendor/rkelly/lib/rkelly/syntax_error.rb +4 -0
- data/vendor/rkelly/lib/rkelly/token.rb +15 -0
- data/vendor/rkelly/lib/rkelly/tokenizer.rb +122 -0
- data/vendor/rkelly/lib/rkelly/visitable.rb +16 -0
- data/vendor/rkelly/lib/rkelly/visitors/dot_visitor.rb +228 -0
- data/vendor/rkelly/lib/rkelly/visitors/ecma_visitor.rb +314 -0
- data/vendor/rkelly/lib/rkelly/visitors/enumerable_visitor.rb +18 -0
- data/vendor/rkelly/lib/rkelly/visitors/evaluation_visitor.rb +419 -0
- data/vendor/rkelly/lib/rkelly/visitors/function_visitor.rb +46 -0
- data/vendor/rkelly/lib/rkelly/visitors/pointcut_visitor.rb +31 -0
- data/vendor/rkelly/lib/rkelly/visitors/real_sexp_visitor.rb +16 -0
- data/vendor/rkelly/lib/rkelly/visitors/sexp_visitor.rb +373 -0
- data/vendor/rkelly/lib/rkelly/visitors/visitor.rb +136 -0
- data/vendor/rkelly/lib/rkelly/visitors.rb +4 -0
- data/vendor/rkelly/lib/rkelly.rb +14 -0
- data/vendor/rkelly/rkelly.gemspec +34 -0
- data/vendor/rkelly/test/ecma_script_test_case.rb +21 -0
- data/vendor/rkelly/test/execute_test_case.rb +16 -0
- data/vendor/rkelly/test/execution_contexts/test_10_1_3-1.rb +32 -0
- data/vendor/rkelly/test/expressions/test_11_3_1.rb +64 -0
- data/vendor/rkelly/test/expressions/test_11_3_2.rb +64 -0
- data/vendor/rkelly/test/expressions/test_11_4_2.rb +13 -0
- data/vendor/rkelly/test/expressions/test_11_4_3.rb +52 -0
- data/vendor/rkelly/test/expressions/test_11_4_4.rb +68 -0
- data/vendor/rkelly/test/expressions/test_11_4_5.rb +69 -0
- data/vendor/rkelly/test/expressions/test_11_4_6.rb +88 -0
- data/vendor/rkelly/test/expressions/test_11_4_8.rb +28 -0
- data/vendor/rkelly/test/expressions/test_11_4_9.rb +103 -0
- data/vendor/rkelly/test/expressions/test_11_5_1.rb +51 -0
- data/vendor/rkelly/test/expressions/test_11_5_2.rb +80 -0
- data/vendor/rkelly/test/expressions/test_11_5_3.rb +88 -0
- data/vendor/rkelly/test/expressions/test_11_6_1-1.rb +19 -0
- data/vendor/rkelly/test/expressions/test_11_9_1.rb +19 -0
- data/vendor/rkelly/test/function/test_15_3_1_1-1.rb +34 -0
- data/vendor/rkelly/test/global_object/test_15_1_1_1.rb +29 -0
- data/vendor/rkelly/test/global_object/test_15_1_1_2.rb +17 -0
- data/vendor/rkelly/test/global_object/test_15_1_1_3.rb +9 -0
- data/vendor/rkelly/test/helper.rb +5 -0
- data/vendor/rkelly/test/node_test_case.rb +11 -0
- data/vendor/rkelly/test/object/test_15_2_1_1.rb +257 -0
- data/vendor/rkelly/test/object/test_15_2_1_2.rb +21 -0
- data/vendor/rkelly/test/object/test_15_2_2_1.rb +52 -0
- data/vendor/rkelly/test/statements/test_12_5-1.rb +27 -0
- data/vendor/rkelly/test/test_add_node.rb +8 -0
- data/vendor/rkelly/test/test_arguments_node.rb +8 -0
- data/vendor/rkelly/test/test_array_node.rb +9 -0
- data/vendor/rkelly/test/test_assign_expr_node.rb +8 -0
- data/vendor/rkelly/test/test_automatic_semicolon_insertion.rb +137 -0
- data/vendor/rkelly/test/test_bit_and_node.rb +8 -0
- data/vendor/rkelly/test/test_bit_or_node.rb +8 -0
- data/vendor/rkelly/test/test_bit_x_or_node.rb +8 -0
- data/vendor/rkelly/test/test_bitwise_not_node.rb +8 -0
- data/vendor/rkelly/test/test_block_node.rb +14 -0
- data/vendor/rkelly/test/test_bracket_accessor_node.rb +16 -0
- data/vendor/rkelly/test/test_break_node.rb +11 -0
- data/vendor/rkelly/test/test_case_block_node.rb +11 -0
- data/vendor/rkelly/test/test_case_clause_node.rb +15 -0
- data/vendor/rkelly/test/test_comma_node.rb +13 -0
- data/vendor/rkelly/test/test_comments.rb +44 -0
- data/vendor/rkelly/test/test_conditional_node.rb +17 -0
- data/vendor/rkelly/test/test_const_statement_node.rb +14 -0
- data/vendor/rkelly/test/test_continue_node.rb +11 -0
- data/vendor/rkelly/test/test_delete_node.rb +8 -0
- data/vendor/rkelly/test/test_divide_node.rb +8 -0
- data/vendor/rkelly/test/test_do_while_node.rb +13 -0
- data/vendor/rkelly/test/test_dot_accessor_node.rb +9 -0
- data/vendor/rkelly/test/test_ecma_visitor.rb +192 -0
- data/vendor/rkelly/test/test_element_node.rb +8 -0
- data/vendor/rkelly/test/test_empty_statement_node.rb +8 -0
- data/vendor/rkelly/test/test_equal_node.rb +8 -0
- data/vendor/rkelly/test/test_evaluation_visitor.rb +66 -0
- data/vendor/rkelly/test/test_expression_statement_node.rb +10 -0
- data/vendor/rkelly/test/test_false_node.rb +8 -0
- data/vendor/rkelly/test/test_for_in_node.rb +17 -0
- data/vendor/rkelly/test/test_for_node.rb +24 -0
- data/vendor/rkelly/test/test_function_body_node.rb +8 -0
- data/vendor/rkelly/test/test_function_call_node.rb +10 -0
- data/vendor/rkelly/test/test_function_decl_node.rb +16 -0
- data/vendor/rkelly/test/test_function_expr_node.rb +16 -0
- data/vendor/rkelly/test/test_function_visitor.rb +26 -0
- data/vendor/rkelly/test/test_getter_property_node.rb +10 -0
- data/vendor/rkelly/test/test_global_object.rb +49 -0
- data/vendor/rkelly/test/test_greater_node.rb +8 -0
- data/vendor/rkelly/test/test_greater_or_equal_node.rb +8 -0
- data/vendor/rkelly/test/test_if_node.rb +17 -0
- data/vendor/rkelly/test/test_in_node.rb +8 -0
- data/vendor/rkelly/test/test_instance_of_node.rb +8 -0
- data/vendor/rkelly/test/test_label_node.rb +13 -0
- data/vendor/rkelly/test/test_left_shift_node.rb +8 -0
- data/vendor/rkelly/test/test_less_node.rb +8 -0
- data/vendor/rkelly/test/test_less_or_equal_node.rb +8 -0
- data/vendor/rkelly/test/test_line_number.rb +23 -0
- data/vendor/rkelly/test/test_logical_and_node.rb +8 -0
- data/vendor/rkelly/test/test_logical_not_node.rb +8 -0
- data/vendor/rkelly/test/test_logical_or_node.rb +8 -0
- data/vendor/rkelly/test/test_modulus_node.rb +8 -0
- data/vendor/rkelly/test/test_multiply_node.rb +8 -0
- data/vendor/rkelly/test/test_new_expr_node.rb +9 -0
- data/vendor/rkelly/test/test_not_equal_node.rb +8 -0
- data/vendor/rkelly/test/test_not_strict_equal_node.rb +8 -0
- data/vendor/rkelly/test/test_null_node.rb +8 -0
- data/vendor/rkelly/test/test_number_node.rb +8 -0
- data/vendor/rkelly/test/test_object_literal_node.rb +9 -0
- data/vendor/rkelly/test/test_op_and_equal_node.rb +10 -0
- data/vendor/rkelly/test/test_op_divide_equal_node.rb +10 -0
- data/vendor/rkelly/test/test_op_equal_node.rb +10 -0
- data/vendor/rkelly/test/test_op_l_shift_equal_node.rb +10 -0
- data/vendor/rkelly/test/test_op_minus_equal_node.rb +10 -0
- data/vendor/rkelly/test/test_op_mod_equal_node.rb +10 -0
- data/vendor/rkelly/test/test_op_multiply_equal_node.rb +10 -0
- data/vendor/rkelly/test/test_op_or_equal_node.rb +10 -0
- data/vendor/rkelly/test/test_op_plus_equal_node.rb +10 -0
- data/vendor/rkelly/test/test_op_r_shift_equal_node.rb +10 -0
- data/vendor/rkelly/test/test_op_u_r_shift_equal_node.rb +10 -0
- data/vendor/rkelly/test/test_op_x_or_equal_node.rb +10 -0
- data/vendor/rkelly/test/test_parameter_node.rb +8 -0
- data/vendor/rkelly/test/test_parser.rb +1361 -0
- data/vendor/rkelly/test/test_pointcut_visitor.rb +34 -0
- data/vendor/rkelly/test/test_postfix_node.rb +8 -0
- data/vendor/rkelly/test/test_prefix_node.rb +8 -0
- data/vendor/rkelly/test/test_property_node.rb +8 -0
- data/vendor/rkelly/test/test_regexp_node.rb +8 -0
- data/vendor/rkelly/test/test_resolve_node.rb +22 -0
- data/vendor/rkelly/test/test_return_node.rb +11 -0
- data/vendor/rkelly/test/test_right_shift_node.rb +8 -0
- data/vendor/rkelly/test/test_rkelly.rb +19 -0
- data/vendor/rkelly/test/test_runtime.rb +12 -0
- data/vendor/rkelly/test/test_scope_chain.rb +50 -0
- data/vendor/rkelly/test/test_setter_property_node.rb +10 -0
- data/vendor/rkelly/test/test_source_elements.rb +9 -0
- data/vendor/rkelly/test/test_strict_equal_node.rb +8 -0
- data/vendor/rkelly/test/test_string_node.rb +8 -0
- data/vendor/rkelly/test/test_subtract_node.rb +8 -0
- data/vendor/rkelly/test/test_switch_node.rb +12 -0
- data/vendor/rkelly/test/test_this_node.rb +8 -0
- data/vendor/rkelly/test/test_throw_node.rb +7 -0
- data/vendor/rkelly/test/test_tokenizer.rb +148 -0
- data/vendor/rkelly/test/test_true_node.rb +8 -0
- data/vendor/rkelly/test/test_try_node.rb +59 -0
- data/vendor/rkelly/test/test_type_of_node.rb +8 -0
- data/vendor/rkelly/test/test_unary_minus_node.rb +8 -0
- data/vendor/rkelly/test/test_unary_plus_node.rb +8 -0
- data/vendor/rkelly/test/test_unsigned_right_shift_node.rb +8 -0
- data/vendor/rkelly/test/test_var_decl_node.rb +21 -0
- data/vendor/rkelly/test/test_var_statement_node.rb +14 -0
- data/vendor/rkelly/test/test_void_node.rb +8 -0
- data/vendor/rkelly/test/test_while_node.rb +15 -0
- data/vendor/rkelly/test/test_with_node.rb +8 -0
- metadata +271 -0
@@ -0,0 +1,870 @@
|
|
1
|
+
/* vim: set filetype=racc : */
|
2
|
+
|
3
|
+
class RKelly::GeneratedParser
|
4
|
+
|
5
|
+
/* Literals */
|
6
|
+
token NULL TRUE FALSE
|
7
|
+
|
8
|
+
/* keywords */
|
9
|
+
token BREAK CASE CATCH CONST CONTINUE DEBUGGER DEFAULT DELETE DO ELSE ENUM
|
10
|
+
token FINALLY FOR FUNCTION IF IN INSTANCEOF NEW RETURN SWITCH THIS THROW TRY
|
11
|
+
token TYPEOF VAR VOID WHILE WITH
|
12
|
+
|
13
|
+
/* punctuators */
|
14
|
+
token EQEQ NE /* == and != */
|
15
|
+
token STREQ STRNEQ /* === and !== */
|
16
|
+
token LE GE /* < and > */
|
17
|
+
token OR AND /* || and && */
|
18
|
+
token PLUSPLUS MINUSMINUS /* ++ and -- */
|
19
|
+
token LSHIFT /* << */
|
20
|
+
token RSHIFT URSHIFT /* >> and >>> */
|
21
|
+
token PLUSEQUAL MINUSEQUAL /* += and -= */
|
22
|
+
token MULTEQUAL DIVEQUAL /* *= and /= */
|
23
|
+
token LSHIFTEQUAL /* <<= */
|
24
|
+
token RSHIFTEQUAL URSHIFTEQUAL /* >>= and >>>= */
|
25
|
+
token ANDEQUAL MODEQUAL /* &= and %= */
|
26
|
+
token XOREQUAL OREQUAL /* ^= and |= */
|
27
|
+
|
28
|
+
/* Terminal types */
|
29
|
+
token REGEXP
|
30
|
+
token NUMBER
|
31
|
+
token STRING
|
32
|
+
token IDENT
|
33
|
+
|
34
|
+
token AUTOPLUSPLUS AUTOMINUSMINUS IF_WITHOUT_ELSE
|
35
|
+
|
36
|
+
prechigh
|
37
|
+
nonassoc ELSE
|
38
|
+
nonassoc IF_WITHOUT_ELSE
|
39
|
+
preclow
|
40
|
+
|
41
|
+
rule
|
42
|
+
SourceElements:
|
43
|
+
/* nothing */ { result = SourceElementsNode.new([]) }
|
44
|
+
| SourceElementList { result = SourceElementsNode.new([val].flatten) }
|
45
|
+
|
46
|
+
SourceElementList:
|
47
|
+
SourceElement
|
48
|
+
| SourceElementList SourceElement { result = val.flatten }
|
49
|
+
;
|
50
|
+
|
51
|
+
SourceElement:
|
52
|
+
FunctionDeclaration
|
53
|
+
| Statement
|
54
|
+
;
|
55
|
+
|
56
|
+
Statement:
|
57
|
+
Block
|
58
|
+
| VariableStatement
|
59
|
+
| ConstStatement
|
60
|
+
| EmptyStatement
|
61
|
+
| ExprStatement
|
62
|
+
| IfStatement
|
63
|
+
| IterationStatement
|
64
|
+
| ContinueStatement
|
65
|
+
| BreakStatement
|
66
|
+
| ReturnStatement
|
67
|
+
| WithStatement
|
68
|
+
| SwitchStatement
|
69
|
+
| LabelledStatement
|
70
|
+
| ThrowStatement
|
71
|
+
| TryStatement
|
72
|
+
| DebuggerStatement
|
73
|
+
;
|
74
|
+
|
75
|
+
Literal:
|
76
|
+
NULL { result = NullNode.new(val.first) }
|
77
|
+
| TRUE { result = TrueNode.new(val.first) }
|
78
|
+
| FALSE { result = FalseNode.new(val.first) }
|
79
|
+
| NUMBER { result = NumberNode.new(val.first) }
|
80
|
+
| STRING { result = StringNode.new(val.first) }
|
81
|
+
| REGEXP { result = RegexpNode.new(val.first) }
|
82
|
+
;
|
83
|
+
|
84
|
+
Property:
|
85
|
+
IDENT ':' AssignmentExpr {
|
86
|
+
result = PropertyNode.new(val[0], val[2])
|
87
|
+
}
|
88
|
+
| STRING ':' AssignmentExpr { result = PropertyNode.new(val.first, val.last) }
|
89
|
+
| NUMBER ':' AssignmentExpr { result = PropertyNode.new(val.first, val.last) }
|
90
|
+
| IDENT IDENT '(' ')' '{' FunctionBody '}' {
|
91
|
+
klass = property_class_for(val.first)
|
92
|
+
yyabort unless klass
|
93
|
+
result = klass.new(val[1], FunctionExprNode.new(nil, val[5]))
|
94
|
+
}
|
95
|
+
| IDENT IDENT '(' FormalParameterList ')' '{' FunctionBody '}' {
|
96
|
+
klass = property_class_for(val.first)
|
97
|
+
yyabort unless klass
|
98
|
+
result = klass.new(val[1], FunctionExprNode.new(nil, val[6], val[3]))
|
99
|
+
}
|
100
|
+
;
|
101
|
+
|
102
|
+
PropertyList:
|
103
|
+
Property { result = val }
|
104
|
+
| PropertyList ',' Property { result = [val.first, val.last].flatten }
|
105
|
+
;
|
106
|
+
|
107
|
+
PrimaryExpr:
|
108
|
+
PrimaryExprNoBrace
|
109
|
+
| '{' '}' { result = ObjectLiteralNode.new([]) }
|
110
|
+
| '{' PropertyList '}' { result = ObjectLiteralNode.new(val[1]) }
|
111
|
+
| '{' PropertyList ',' '}' { result = ObjectLiteralNode.new(val[1]) }
|
112
|
+
;
|
113
|
+
|
114
|
+
PrimaryExprNoBrace:
|
115
|
+
THIS { result = ThisNode.new(val.first) }
|
116
|
+
| Literal
|
117
|
+
| ArrayLiteral
|
118
|
+
| IDENT { result = ResolveNode.new(val.first) }
|
119
|
+
| '(' Expr ')' { result = val[1] }
|
120
|
+
;
|
121
|
+
|
122
|
+
ArrayLiteral:
|
123
|
+
'[' ElisionOpt ']' { result = ArrayNode.new([] + [nil] * val[1]) }
|
124
|
+
| '[' ElementList ']' { result = ArrayNode.new(val[1]) }
|
125
|
+
| '[' ElementList ',' ElisionOpt ']' {
|
126
|
+
result = ArrayNode.new(val[1] + [nil] * val[3])
|
127
|
+
}
|
128
|
+
;
|
129
|
+
|
130
|
+
ElementList:
|
131
|
+
ElisionOpt AssignmentExpr {
|
132
|
+
result = [nil] * val[0] + [ElementNode.new(val[1])]
|
133
|
+
}
|
134
|
+
| ElementList ',' ElisionOpt AssignmentExpr {
|
135
|
+
result = [val[0], [nil] * val[2], ElementNode.new(val[3])].flatten
|
136
|
+
}
|
137
|
+
;
|
138
|
+
|
139
|
+
ElisionOpt:
|
140
|
+
/* nothing */ { result = 0 }
|
141
|
+
| Elision
|
142
|
+
;
|
143
|
+
|
144
|
+
Elision:
|
145
|
+
',' { result = 1 }
|
146
|
+
| Elision ',' { result = val.first + 1 }
|
147
|
+
;
|
148
|
+
|
149
|
+
MemberExpr:
|
150
|
+
PrimaryExpr
|
151
|
+
| FunctionExpr
|
152
|
+
| MemberExpr '[' Expr ']' { result = BracketAccessorNode.new(val[0], val[2]) }
|
153
|
+
| MemberExpr '.' IDENT { result = DotAccessorNode.new(val[0], val[2]) }
|
154
|
+
| NEW MemberExpr Arguments { result = NewExprNode.new(val[1], val[2]) }
|
155
|
+
;
|
156
|
+
|
157
|
+
MemberExprNoBF:
|
158
|
+
PrimaryExprNoBrace
|
159
|
+
| MemberExprNoBF '[' Expr ']' {
|
160
|
+
result = BracketAccessorNode.new(val[0], val[2])
|
161
|
+
}
|
162
|
+
| MemberExprNoBF '.' IDENT { result = DotAccessorNode.new(val[0], val[2]) }
|
163
|
+
| NEW MemberExpr Arguments { result = NewExprNode.new(val[1], val[2]) }
|
164
|
+
;
|
165
|
+
|
166
|
+
NewExpr:
|
167
|
+
MemberExpr
|
168
|
+
| NEW NewExpr { result = NewExprNode.new(val[1], ArgumentsNode.new([])) }
|
169
|
+
;
|
170
|
+
|
171
|
+
NewExprNoBF:
|
172
|
+
MemberExprNoBF
|
173
|
+
| NEW NewExpr { result = NewExprNode.new(val[1], ArgumentsNode.new([])) }
|
174
|
+
;
|
175
|
+
|
176
|
+
CallExpr:
|
177
|
+
MemberExpr Arguments { result = FunctionCallNode.new(val[0], val[1]) }
|
178
|
+
| CallExpr Arguments { result = FunctionCallNode.new(val[0], val[1]) }
|
179
|
+
| CallExpr '[' Expr ']' { result = BracketAccessorNode.new(val[0], val[2]) }
|
180
|
+
| CallExpr '.' IDENT { result = DotAccessorNode.new(val[0], val[2]) }
|
181
|
+
;
|
182
|
+
|
183
|
+
CallExprNoBF:
|
184
|
+
MemberExprNoBF Arguments { result = FunctionCallNode.new(val[0], val[1]) }
|
185
|
+
| CallExprNoBF Arguments { result = FunctionCallNode.new(val[0], val[1]) }
|
186
|
+
| CallExprNoBF '[' Expr ']' { result = BracketAccessorNode.new(val[0], val[2]) }
|
187
|
+
| CallExprNoBF '.' IDENT { result = DotAccessorNode.new(val[0], val[2]) }
|
188
|
+
;
|
189
|
+
|
190
|
+
Arguments:
|
191
|
+
'(' ')' { result = ArgumentsNode.new([]) }
|
192
|
+
| '(' ArgumentList ')' { result = ArgumentsNode.new(val[1]); }
|
193
|
+
;
|
194
|
+
|
195
|
+
ArgumentList:
|
196
|
+
AssignmentExpr { result = val }
|
197
|
+
| ArgumentList ',' AssignmentExpr { result = [val[0], val[2]].flatten }
|
198
|
+
;
|
199
|
+
|
200
|
+
LeftHandSideExpr:
|
201
|
+
NewExpr
|
202
|
+
| CallExpr
|
203
|
+
;
|
204
|
+
|
205
|
+
LeftHandSideExprNoBF:
|
206
|
+
NewExprNoBF
|
207
|
+
| CallExprNoBF
|
208
|
+
;
|
209
|
+
|
210
|
+
PostfixExpr:
|
211
|
+
LeftHandSideExpr
|
212
|
+
| LeftHandSideExpr PLUSPLUS { result = PostfixNode.new(val[0], '++') }
|
213
|
+
| LeftHandSideExpr MINUSMINUS { result = PostfixNode.new(val[0], '--') }
|
214
|
+
;
|
215
|
+
|
216
|
+
PostfixExprNoBF:
|
217
|
+
LeftHandSideExprNoBF
|
218
|
+
| LeftHandSideExprNoBF PLUSPLUS { result = PostfixNode.new(val[0], '++') }
|
219
|
+
| LeftHandSideExprNoBF MINUSMINUS { result = PostfixNode.new(val[0], '--') }
|
220
|
+
;
|
221
|
+
|
222
|
+
UnaryExprCommon:
|
223
|
+
DELETE UnaryExpr { result = DeleteNode.new(val[1]) }
|
224
|
+
| VOID UnaryExpr { result = VoidNode.new(val[1]) }
|
225
|
+
| TYPEOF UnaryExpr { result = TypeOfNode.new(val[1]) }
|
226
|
+
| PLUSPLUS UnaryExpr { result = PrefixNode.new(val[1], '++') }
|
227
|
+
/* FIXME: Not sure when this can ever happen
|
228
|
+
| AUTOPLUSPLUS UnaryExpr { result = makePrefixNode($2, OpPlusPlus); } */
|
229
|
+
| MINUSMINUS UnaryExpr { result = PrefixNode.new(val[1], '--') }
|
230
|
+
/* FIXME: Not sure when this can ever happen
|
231
|
+
| AUTOMINUSMINUS UnaryExpr { result = makePrefixNode($2, OpMinusMinus); } */
|
232
|
+
| '+' UnaryExpr { result = UnaryPlusNode.new(val[1]) }
|
233
|
+
| '-' UnaryExpr { result = UnaryMinusNode.new(val[1]) }
|
234
|
+
| '~' UnaryExpr { result = BitwiseNotNode.new(val[1]) }
|
235
|
+
| '!' UnaryExpr { result = LogicalNotNode.new(val[1]) }
|
236
|
+
;
|
237
|
+
|
238
|
+
UnaryExpr:
|
239
|
+
PostfixExpr
|
240
|
+
| UnaryExprCommon
|
241
|
+
;
|
242
|
+
|
243
|
+
UnaryExprNoBF:
|
244
|
+
PostfixExprNoBF
|
245
|
+
| UnaryExprCommon
|
246
|
+
;
|
247
|
+
|
248
|
+
MultiplicativeExpr:
|
249
|
+
UnaryExpr
|
250
|
+
| MultiplicativeExpr '*' UnaryExpr { result = MultiplyNode.new(val[0],val[2])}
|
251
|
+
| MultiplicativeExpr '/' UnaryExpr { result = DivideNode.new(val[0], val[2]) }
|
252
|
+
| MultiplicativeExpr '%' UnaryExpr { result = ModulusNode.new(val[0], val[2])}
|
253
|
+
;
|
254
|
+
|
255
|
+
MultiplicativeExprNoBF:
|
256
|
+
UnaryExprNoBF
|
257
|
+
| MultiplicativeExprNoBF '*' UnaryExpr { result = MultiplyNode.new(val[0], val[2]) }
|
258
|
+
| MultiplicativeExprNoBF '/' UnaryExpr { result = DivideNode.new(val[0],val[2]) }
|
259
|
+
| MultiplicativeExprNoBF '%' UnaryExpr { result = ModulusNode.new(val[0], val[2]) }
|
260
|
+
;
|
261
|
+
|
262
|
+
AdditiveExpr:
|
263
|
+
MultiplicativeExpr
|
264
|
+
| AdditiveExpr '+' MultiplicativeExpr { result = AddNode.new(val[0], val[2]) }
|
265
|
+
| AdditiveExpr '-' MultiplicativeExpr { result = SubtractNode.new(val[0], val[2]) }
|
266
|
+
;
|
267
|
+
|
268
|
+
AdditiveExprNoBF:
|
269
|
+
MultiplicativeExprNoBF
|
270
|
+
| AdditiveExprNoBF '+' MultiplicativeExpr { result = AddNode.new(val[0], val[2]) }
|
271
|
+
| AdditiveExprNoBF '-' MultiplicativeExpr { result = SubtractNode.new(val[0], val[2]) }
|
272
|
+
;
|
273
|
+
|
274
|
+
ShiftExpr:
|
275
|
+
AdditiveExpr
|
276
|
+
| ShiftExpr LSHIFT AdditiveExpr { result = LeftShiftNode.new(val[0], val[2]) }
|
277
|
+
| ShiftExpr RSHIFT AdditiveExpr { result = RightShiftNode.new(val[0], val[2]) }
|
278
|
+
| ShiftExpr URSHIFT AdditiveExpr { result = UnsignedRightShiftNode.new(val[0], val[2]) }
|
279
|
+
;
|
280
|
+
|
281
|
+
ShiftExprNoBF:
|
282
|
+
AdditiveExprNoBF
|
283
|
+
| ShiftExprNoBF LSHIFT AdditiveExpr { result = LeftShiftNode.new(val[0], val[2]) }
|
284
|
+
| ShiftExprNoBF RSHIFT AdditiveExpr { result = RightShiftNode.new(val[0], val[2]) }
|
285
|
+
| ShiftExprNoBF URSHIFT AdditiveExpr { result = UnsignedRightShiftNode.new(val[0], val[2]) }
|
286
|
+
;
|
287
|
+
|
288
|
+
RelationalExpr:
|
289
|
+
ShiftExpr
|
290
|
+
| RelationalExpr '<' ShiftExpr { result = LessNode.new(val[0], val[2])}
|
291
|
+
| RelationalExpr '>' ShiftExpr { result = GreaterNode.new(val[0], val[2]) }
|
292
|
+
| RelationalExpr LE ShiftExpr { result = LessOrEqualNode.new(val[0], val[2]) }
|
293
|
+
| RelationalExpr GE ShiftExpr { result = GreaterOrEqualNode.new(val[0], val[2]) }
|
294
|
+
| RelationalExpr INSTANCEOF ShiftExpr { result = InstanceOfNode.new(val[0], val[2]) }
|
295
|
+
| RelationalExpr IN ShiftExpr { result = InNode.new(val[0], val[2]) }
|
296
|
+
;
|
297
|
+
|
298
|
+
RelationalExprNoIn:
|
299
|
+
ShiftExpr
|
300
|
+
| RelationalExprNoIn '<' ShiftExpr { result = LessNode.new(val[0], val[2])}
|
301
|
+
| RelationalExprNoIn '>' ShiftExpr { result = GreaterNode.new(val[0], val[2]) }
|
302
|
+
| RelationalExprNoIn LE ShiftExpr { result = LessOrEqualNode.new(val[0], val[2]) }
|
303
|
+
| RelationalExprNoIn GE ShiftExpr { result = GreaterOrEqualNode.new(val[0], val[2]) }
|
304
|
+
| RelationalExprNoIn INSTANCEOF ShiftExpr
|
305
|
+
{ result = InstanceOfNode.new(val[0], val[2]) }
|
306
|
+
;
|
307
|
+
|
308
|
+
RelationalExprNoBF:
|
309
|
+
ShiftExprNoBF
|
310
|
+
| RelationalExprNoBF '<' ShiftExpr { result = LessNode.new(val[0], val[2]) }
|
311
|
+
| RelationalExprNoBF '>' ShiftExpr { result = GreaterNode.new(val[0], val[2]) }
|
312
|
+
| RelationalExprNoBF LE ShiftExpr { result = LessOrEqualNode.new(val[0], val[2]) }
|
313
|
+
| RelationalExprNoBF GE ShiftExpr { result = GreaterOrEqualNode.new(val[0], val[2]) }
|
314
|
+
| RelationalExprNoBF INSTANCEOF ShiftExpr
|
315
|
+
{ result = InstanceOfNode.new(val[0], val[2]) }
|
316
|
+
| RelationalExprNoBF IN ShiftExpr { result = InNode.new(val[0], val[2]) }
|
317
|
+
;
|
318
|
+
|
319
|
+
EqualityExpr:
|
320
|
+
RelationalExpr
|
321
|
+
| EqualityExpr EQEQ RelationalExpr { result = EqualNode.new(val[0], val[2]) }
|
322
|
+
| EqualityExpr NE RelationalExpr { result = NotEqualNode.new(val[0], val[2]) }
|
323
|
+
| EqualityExpr STREQ RelationalExpr { result = StrictEqualNode.new(val[0], val[2]) }
|
324
|
+
| EqualityExpr STRNEQ RelationalExpr { result = NotStrictEqualNode.new(val[0], val[2]) }
|
325
|
+
;
|
326
|
+
|
327
|
+
EqualityExprNoIn:
|
328
|
+
RelationalExprNoIn
|
329
|
+
| EqualityExprNoIn EQEQ RelationalExprNoIn
|
330
|
+
{ result = EqualNode.new(val[0], val[2]) }
|
331
|
+
| EqualityExprNoIn NE RelationalExprNoIn
|
332
|
+
{ result = NotEqualNode.new(val[0], val[2]) }
|
333
|
+
| EqualityExprNoIn STREQ RelationalExprNoIn
|
334
|
+
{ result = StrictEqualNode.new(val[0], val[2]) }
|
335
|
+
| EqualityExprNoIn STRNEQ RelationalExprNoIn
|
336
|
+
{ result = NotStrictEqualNode.new(val[0], val[2]) }
|
337
|
+
;
|
338
|
+
|
339
|
+
EqualityExprNoBF:
|
340
|
+
RelationalExprNoBF
|
341
|
+
| EqualityExprNoBF EQEQ RelationalExpr
|
342
|
+
{ result = EqualNode.new(val[0], val[2]) }
|
343
|
+
| EqualityExprNoBF NE RelationalExpr { result = NotEqualNode.new(val[0], val[2]) }
|
344
|
+
| EqualityExprNoBF STREQ RelationalExpr
|
345
|
+
{ result = StrictEqualNode.new(val[0], val[2]) }
|
346
|
+
| EqualityExprNoBF STRNEQ RelationalExpr
|
347
|
+
{ result = NotStrictEqualNode.new(val[0], val[2]) }
|
348
|
+
;
|
349
|
+
|
350
|
+
BitwiseANDExpr:
|
351
|
+
EqualityExpr
|
352
|
+
| BitwiseANDExpr '&' EqualityExpr { result = BitAndNode.new(val[0], val[2]) }
|
353
|
+
;
|
354
|
+
|
355
|
+
BitwiseANDExprNoIn:
|
356
|
+
EqualityExprNoIn
|
357
|
+
| BitwiseANDExprNoIn '&' EqualityExprNoIn
|
358
|
+
{ result = BitAndNode.new(val[0], val[2]) }
|
359
|
+
;
|
360
|
+
|
361
|
+
BitwiseANDExprNoBF:
|
362
|
+
EqualityExprNoBF
|
363
|
+
| BitwiseANDExprNoBF '&' EqualityExpr { result = BitAndNode.new(val[0], val[2]) }
|
364
|
+
;
|
365
|
+
|
366
|
+
BitwiseXORExpr:
|
367
|
+
BitwiseANDExpr
|
368
|
+
| BitwiseXORExpr '^' BitwiseANDExpr { result = BitXOrNode.new(val[0], val[2]) }
|
369
|
+
;
|
370
|
+
|
371
|
+
BitwiseXORExprNoIn:
|
372
|
+
BitwiseANDExprNoIn
|
373
|
+
| BitwiseXORExprNoIn '^' BitwiseANDExprNoIn
|
374
|
+
{ result = BitXOrNode.new(val[0], val[2]) }
|
375
|
+
;
|
376
|
+
|
377
|
+
BitwiseXORExprNoBF:
|
378
|
+
BitwiseANDExprNoBF
|
379
|
+
| BitwiseXORExprNoBF '^' BitwiseANDExpr
|
380
|
+
{ result = BitXOrNode.new(val[0], val[2]) }
|
381
|
+
;
|
382
|
+
|
383
|
+
BitwiseORExpr:
|
384
|
+
BitwiseXORExpr
|
385
|
+
| BitwiseORExpr '|' BitwiseXORExpr { result = BitOrNode.new(val[0], val[2]) }
|
386
|
+
;
|
387
|
+
|
388
|
+
BitwiseORExprNoIn:
|
389
|
+
BitwiseXORExprNoIn
|
390
|
+
| BitwiseORExprNoIn '|' BitwiseXORExprNoIn
|
391
|
+
{ result = BitOrNode.new(val[0], val[2]) }
|
392
|
+
;
|
393
|
+
|
394
|
+
BitwiseORExprNoBF:
|
395
|
+
BitwiseXORExprNoBF
|
396
|
+
| BitwiseORExprNoBF '|' BitwiseXORExpr
|
397
|
+
{ result = BitOrNode.new(val[0], val[2]) }
|
398
|
+
;
|
399
|
+
|
400
|
+
LogicalANDExpr:
|
401
|
+
BitwiseORExpr
|
402
|
+
| LogicalANDExpr AND BitwiseORExpr { result = LogicalAndNode.new(val[0], val[2]) }
|
403
|
+
;
|
404
|
+
|
405
|
+
LogicalANDExprNoIn:
|
406
|
+
BitwiseORExprNoIn
|
407
|
+
| LogicalANDExprNoIn AND BitwiseORExprNoIn
|
408
|
+
{ result = LogicalAndNode.new(val[0], val[2]) }
|
409
|
+
;
|
410
|
+
|
411
|
+
LogicalANDExprNoBF:
|
412
|
+
BitwiseORExprNoBF
|
413
|
+
| LogicalANDExprNoBF AND BitwiseORExpr
|
414
|
+
{ result = LogicalAndNode.new(val[0], val[2]) }
|
415
|
+
;
|
416
|
+
|
417
|
+
LogicalORExpr:
|
418
|
+
LogicalANDExpr
|
419
|
+
| LogicalORExpr OR LogicalANDExpr { result = LogicalOrNode.new(val[0], val[2]) }
|
420
|
+
;
|
421
|
+
|
422
|
+
LogicalORExprNoIn:
|
423
|
+
LogicalANDExprNoIn
|
424
|
+
| LogicalORExprNoIn OR LogicalANDExprNoIn
|
425
|
+
{ result = LogicalOrNode.new(val[0], val[2]) }
|
426
|
+
;
|
427
|
+
|
428
|
+
LogicalORExprNoBF:
|
429
|
+
LogicalANDExprNoBF
|
430
|
+
| LogicalORExprNoBF OR LogicalANDExpr { result = LogicalOrNode.new(val[0], val[2]) }
|
431
|
+
;
|
432
|
+
|
433
|
+
ConditionalExpr:
|
434
|
+
LogicalORExpr
|
435
|
+
| LogicalORExpr '?' AssignmentExpr ':' AssignmentExpr {
|
436
|
+
result = ConditionalNode.new(val[0], val[2], val[4])
|
437
|
+
}
|
438
|
+
;
|
439
|
+
|
440
|
+
ConditionalExprNoIn:
|
441
|
+
LogicalORExprNoIn
|
442
|
+
| LogicalORExprNoIn '?' AssignmentExprNoIn ':' AssignmentExprNoIn {
|
443
|
+
result = ConditionalNode.new(val[0], val[2], val[4])
|
444
|
+
}
|
445
|
+
;
|
446
|
+
|
447
|
+
ConditionalExprNoBF:
|
448
|
+
LogicalORExprNoBF
|
449
|
+
| LogicalORExprNoBF '?' AssignmentExpr ':' AssignmentExpr {
|
450
|
+
result = ConditionalNode.new(val[0], val[2], val[4])
|
451
|
+
}
|
452
|
+
;
|
453
|
+
|
454
|
+
AssignmentExpr:
|
455
|
+
ConditionalExpr
|
456
|
+
| LeftHandSideExpr AssignmentOperator AssignmentExpr {
|
457
|
+
result = val[1].new(val.first, val.last)
|
458
|
+
}
|
459
|
+
;
|
460
|
+
|
461
|
+
AssignmentExprNoIn:
|
462
|
+
ConditionalExprNoIn
|
463
|
+
| LeftHandSideExpr AssignmentOperator AssignmentExprNoIn {
|
464
|
+
result = val[1].new(val.first, val.last)
|
465
|
+
}
|
466
|
+
;
|
467
|
+
|
468
|
+
AssignmentExprNoBF:
|
469
|
+
ConditionalExprNoBF
|
470
|
+
| LeftHandSideExprNoBF AssignmentOperator AssignmentExpr {
|
471
|
+
result = val[1].new(val.first, val.last)
|
472
|
+
}
|
473
|
+
;
|
474
|
+
|
475
|
+
AssignmentOperator:
|
476
|
+
'=' { result = OpEqualNode }
|
477
|
+
| PLUSEQUAL { result = OpPlusEqualNode }
|
478
|
+
| MINUSEQUAL { result = OpMinusEqualNode }
|
479
|
+
| MULTEQUAL { result = OpMultiplyEqualNode }
|
480
|
+
| DIVEQUAL { result = OpDivideEqualNode }
|
481
|
+
| LSHIFTEQUAL { result = OpLShiftEqualNode }
|
482
|
+
| RSHIFTEQUAL { result = OpRShiftEqualNode }
|
483
|
+
| URSHIFTEQUAL { result = OpURShiftEqualNode }
|
484
|
+
| ANDEQUAL { result = OpAndEqualNode }
|
485
|
+
| XOREQUAL { result = OpXOrEqualNode }
|
486
|
+
| OREQUAL { result = OpOrEqualNode }
|
487
|
+
| MODEQUAL { result = OpModEqualNode }
|
488
|
+
;
|
489
|
+
|
490
|
+
Expr:
|
491
|
+
AssignmentExpr
|
492
|
+
| Expr ',' AssignmentExpr { result = CommaNode.new(val[0], val[2]) }
|
493
|
+
;
|
494
|
+
|
495
|
+
ExprNoIn:
|
496
|
+
AssignmentExprNoIn
|
497
|
+
| ExprNoIn ',' AssignmentExprNoIn { result = CommaNode.new(val[0], val[2]) }
|
498
|
+
;
|
499
|
+
|
500
|
+
ExprNoBF:
|
501
|
+
AssignmentExprNoBF
|
502
|
+
| ExprNoBF ',' AssignmentExpr { result = CommaNode.new(val[0], val[2]) }
|
503
|
+
;
|
504
|
+
|
505
|
+
|
506
|
+
Block:
|
507
|
+
'{' SourceElements '}' {
|
508
|
+
result = BlockNode.new(val[1])
|
509
|
+
debug(result)
|
510
|
+
}
|
511
|
+
;
|
512
|
+
|
513
|
+
VariableStatement:
|
514
|
+
VAR VariableDeclarationList ';' {
|
515
|
+
result = VarStatementNode.new(val[1])
|
516
|
+
debug(result)
|
517
|
+
}
|
518
|
+
| VAR VariableDeclarationList error {
|
519
|
+
result = VarStatementNode.new(val[1])
|
520
|
+
debug(result)
|
521
|
+
yyabort unless allow_auto_semi?(val.last)
|
522
|
+
}
|
523
|
+
;
|
524
|
+
|
525
|
+
VariableDeclarationList:
|
526
|
+
VariableDeclaration { result = val }
|
527
|
+
| VariableDeclarationList ',' VariableDeclaration {
|
528
|
+
result = [val.first, val.last].flatten
|
529
|
+
}
|
530
|
+
;
|
531
|
+
|
532
|
+
VariableDeclarationListNoIn:
|
533
|
+
VariableDeclarationNoIn { result = val }
|
534
|
+
| VariableDeclarationListNoIn ',' VariableDeclarationNoIn {
|
535
|
+
result = [val.first, val.last].flatten
|
536
|
+
}
|
537
|
+
;
|
538
|
+
|
539
|
+
VariableDeclaration:
|
540
|
+
IDENT { result = VarDeclNode.new(val.first, nil) }
|
541
|
+
| IDENT Initializer { result = VarDeclNode.new(val.first, val[1]) }
|
542
|
+
;
|
543
|
+
|
544
|
+
VariableDeclarationNoIn:
|
545
|
+
IDENT { result = VarDeclNode.new(val[0],nil) }
|
546
|
+
| IDENT InitializerNoIn { result = VarDeclNode.new(val[0], val[1]) }
|
547
|
+
;
|
548
|
+
|
549
|
+
ConstStatement:
|
550
|
+
CONST ConstDeclarationList ';' {
|
551
|
+
result = ConstStatementNode.new(val[1])
|
552
|
+
debug(result)
|
553
|
+
}
|
554
|
+
| CONST ConstDeclarationList error {
|
555
|
+
result = ConstStatementNode.new(val[1])
|
556
|
+
debug(result)
|
557
|
+
yyerror unless allow_auto_semi?(val.last)
|
558
|
+
}
|
559
|
+
;
|
560
|
+
|
561
|
+
ConstDeclarationList:
|
562
|
+
ConstDeclaration { result = val }
|
563
|
+
| ConstDeclarationList ',' ConstDeclaration {
|
564
|
+
result = [val.first, val.last].flatten
|
565
|
+
}
|
566
|
+
;
|
567
|
+
|
568
|
+
ConstDeclaration:
|
569
|
+
IDENT { result = VarDeclNode.new(val[0], nil, true) }
|
570
|
+
| IDENT Initializer { result = VarDeclNode.new(val[0], val[1], true) }
|
571
|
+
;
|
572
|
+
|
573
|
+
Initializer:
|
574
|
+
'=' AssignmentExpr { result = AssignExprNode.new(val[1]) }
|
575
|
+
;
|
576
|
+
|
577
|
+
InitializerNoIn:
|
578
|
+
'=' AssignmentExprNoIn { result = AssignExprNode.new(val[1]) }
|
579
|
+
;
|
580
|
+
|
581
|
+
EmptyStatement:
|
582
|
+
';' { result = EmptyStatementNode.new(val[0]) }
|
583
|
+
;
|
584
|
+
|
585
|
+
ExprStatement:
|
586
|
+
ExprNoBF ';' {
|
587
|
+
result = ExpressionStatementNode.new(val.first)
|
588
|
+
debug(result)
|
589
|
+
}
|
590
|
+
| ExprNoBF error {
|
591
|
+
result = ExpressionStatementNode.new(val.first)
|
592
|
+
debug(result)
|
593
|
+
raise RKelly::SyntaxError unless allow_auto_semi?(val.last)
|
594
|
+
}
|
595
|
+
;
|
596
|
+
|
597
|
+
IfStatement:
|
598
|
+
IF '(' Expr ')' Statement =IF_WITHOUT_ELSE {
|
599
|
+
result = IfNode.new(val[2], val[4])
|
600
|
+
debug(result)
|
601
|
+
}
|
602
|
+
| IF '(' Expr ')' Statement ELSE Statement {
|
603
|
+
result = IfNode.new(val[2], val[4], val[6])
|
604
|
+
debug(result)
|
605
|
+
}
|
606
|
+
;
|
607
|
+
|
608
|
+
IterationStatement:
|
609
|
+
DO Statement WHILE '(' Expr ')' ';' {
|
610
|
+
result = DoWhileNode.new(val[1], val[4])
|
611
|
+
debug(result)
|
612
|
+
}
|
613
|
+
| DO Statement WHILE '(' Expr ')' error {
|
614
|
+
result = DoWhileNode.new(val[1], val[4])
|
615
|
+
debug(result)
|
616
|
+
} /* Always performs automatic semicolon insertion. */
|
617
|
+
| WHILE '(' Expr ')' Statement {
|
618
|
+
result = WhileNode.new(val[2], val[4])
|
619
|
+
debug(result)
|
620
|
+
}
|
621
|
+
| FOR '(' ExprNoInOpt ';' ExprOpt ';' ExprOpt ')' Statement {
|
622
|
+
result = ForNode.new(val[2], val[4], val[6], val[8])
|
623
|
+
debug(result)
|
624
|
+
}
|
625
|
+
| FOR '(' VAR VariableDeclarationListNoIn ';' ExprOpt ';' ExprOpt ')' Statement
|
626
|
+
{
|
627
|
+
result = ForNode.new(VarStatementNode.new(val[3]), val[5], val[7], val[9])
|
628
|
+
debug(result)
|
629
|
+
}
|
630
|
+
| FOR '(' LeftHandSideExpr IN Expr ')' Statement {
|
631
|
+
#yyabort if (!n.isLocation())
|
632
|
+
result = ForInNode.new(val[2], val[4], val[6])
|
633
|
+
debug(result);
|
634
|
+
}
|
635
|
+
| FOR '(' VAR IDENT IN Expr ')' Statement {
|
636
|
+
result = ForInNode.new(
|
637
|
+
VarDeclNode.new(val[3], nil), val[5], val[7])
|
638
|
+
debug(result)
|
639
|
+
}
|
640
|
+
| FOR '(' VAR IDENT InitializerNoIn IN Expr ')' Statement {
|
641
|
+
result = ForInNode.new(
|
642
|
+
VarDeclNode.new(val[3], val[4]), val[6], val[8]
|
643
|
+
)
|
644
|
+
debug(result)
|
645
|
+
}
|
646
|
+
;
|
647
|
+
|
648
|
+
ExprOpt:
|
649
|
+
/* nothing */ { result = nil }
|
650
|
+
| Expr
|
651
|
+
;
|
652
|
+
|
653
|
+
ExprNoInOpt:
|
654
|
+
/* nothing */ { result = nil }
|
655
|
+
| ExprNoIn
|
656
|
+
;
|
657
|
+
|
658
|
+
ContinueStatement:
|
659
|
+
CONTINUE ';' {
|
660
|
+
result = ContinueNode.new(nil)
|
661
|
+
debug(result)
|
662
|
+
}
|
663
|
+
| CONTINUE error {
|
664
|
+
result = ContinueNode.new(nil)
|
665
|
+
debug(result)
|
666
|
+
yyabort unless allow_auto_semi?(val[1])
|
667
|
+
}
|
668
|
+
| CONTINUE IDENT ';' {
|
669
|
+
result = ContinueNode.new(val[1])
|
670
|
+
debug(result)
|
671
|
+
}
|
672
|
+
| CONTINUE IDENT error {
|
673
|
+
result = ContinueNode.new(val[1])
|
674
|
+
debug(result)
|
675
|
+
yyabort unless allow_auto_semi?(val[2])
|
676
|
+
}
|
677
|
+
;
|
678
|
+
|
679
|
+
BreakStatement:
|
680
|
+
BREAK ';' {
|
681
|
+
result = BreakNode.new(nil)
|
682
|
+
debug(result)
|
683
|
+
}
|
684
|
+
| BREAK error {
|
685
|
+
result = BreakNode.new(nil)
|
686
|
+
debug(result)
|
687
|
+
yyabort unless allow_auto_semi?(val[1])
|
688
|
+
}
|
689
|
+
| BREAK IDENT ';' {
|
690
|
+
result = BreakNode.new(val[1])
|
691
|
+
debug(result)
|
692
|
+
}
|
693
|
+
| BREAK IDENT error {
|
694
|
+
result = BreakNode.new(val[1])
|
695
|
+
debug(result)
|
696
|
+
yyabort unless allow_auto_semi?(val[2])
|
697
|
+
}
|
698
|
+
;
|
699
|
+
|
700
|
+
ReturnStatement:
|
701
|
+
RETURN ';' {
|
702
|
+
result = ReturnNode.new(nil)
|
703
|
+
debug(result)
|
704
|
+
}
|
705
|
+
| RETURN error {
|
706
|
+
result = ReturnNode.new(nil)
|
707
|
+
debug(result)
|
708
|
+
yyabort unless allow_auto_semi?(val[1])
|
709
|
+
}
|
710
|
+
| RETURN Expr ';' {
|
711
|
+
result = ReturnNode.new(val[1])
|
712
|
+
debug(result)
|
713
|
+
}
|
714
|
+
| RETURN Expr error {
|
715
|
+
result = ReturnNode.new(val[1])
|
716
|
+
debug(result)
|
717
|
+
yyabort unless allow_auto_semi?(val[2])
|
718
|
+
}
|
719
|
+
;
|
720
|
+
|
721
|
+
WithStatement:
|
722
|
+
WITH '(' Expr ')' Statement {
|
723
|
+
result = WithNode.new(val[2], val[4])
|
724
|
+
debug(result)
|
725
|
+
}
|
726
|
+
;
|
727
|
+
|
728
|
+
SwitchStatement:
|
729
|
+
SWITCH '(' Expr ')' CaseBlock {
|
730
|
+
result = SwitchNode.new(val[2], val[4])
|
731
|
+
debug(result)
|
732
|
+
}
|
733
|
+
;
|
734
|
+
|
735
|
+
CaseBlock:
|
736
|
+
'{' CaseClausesOpt '}' { result = CaseBlockNode.new(val[1]) }
|
737
|
+
| '{' CaseClausesOpt DefaultClause CaseClausesOpt '}' {
|
738
|
+
result = CaseBlockNode.new([val[1], val[2], val[3]].flatten)
|
739
|
+
}
|
740
|
+
;
|
741
|
+
|
742
|
+
CaseClausesOpt:
|
743
|
+
/* nothing */ { result = [] }
|
744
|
+
| CaseClauses
|
745
|
+
;
|
746
|
+
|
747
|
+
CaseClauses:
|
748
|
+
CaseClause { result = val }
|
749
|
+
| CaseClauses CaseClause { result = val.flatten }
|
750
|
+
;
|
751
|
+
|
752
|
+
CaseClause:
|
753
|
+
CASE Expr ':' SourceElements {
|
754
|
+
result = CaseClauseNode.new(val[1], val[3])
|
755
|
+
}
|
756
|
+
;
|
757
|
+
|
758
|
+
DefaultClause:
|
759
|
+
DEFAULT ':' SourceElements {
|
760
|
+
result = CaseClauseNode.new(nil, val[2])
|
761
|
+
}
|
762
|
+
;
|
763
|
+
|
764
|
+
LabelledStatement:
|
765
|
+
IDENT ':' Statement { result = LabelNode.new(val[0], val[2]) }
|
766
|
+
;
|
767
|
+
|
768
|
+
ThrowStatement:
|
769
|
+
THROW Expr ';' {
|
770
|
+
result = ThrowNode.new(val[1])
|
771
|
+
debug(result)
|
772
|
+
}
|
773
|
+
| THROW Expr error {
|
774
|
+
result = ThrowNode.new(val[1])
|
775
|
+
debug(result)
|
776
|
+
yyabort unless allow_auto_semi?(val[2])
|
777
|
+
}
|
778
|
+
;
|
779
|
+
|
780
|
+
TryStatement:
|
781
|
+
TRY Block FINALLY Block {
|
782
|
+
result = TryNode.new(val[1], nil, nil, val[3])
|
783
|
+
debug(result)
|
784
|
+
}
|
785
|
+
| TRY Block CATCH '(' IDENT ')' Block {
|
786
|
+
result = TryNode.new(val[1], val[4], val[6])
|
787
|
+
debug(result)
|
788
|
+
}
|
789
|
+
| TRY Block CATCH '(' IDENT ')' Block FINALLY Block {
|
790
|
+
result = TryNode.new(val[1], val[4], val[6], val[8])
|
791
|
+
debug(result)
|
792
|
+
}
|
793
|
+
;
|
794
|
+
|
795
|
+
DebuggerStatement:
|
796
|
+
DEBUGGER ';' {
|
797
|
+
result = EmptyStatementNode.new(val[0])
|
798
|
+
debug(result)
|
799
|
+
}
|
800
|
+
| DEBUGGER error {
|
801
|
+
result = EmptyStatementNode.new(val[0])
|
802
|
+
debug(result)
|
803
|
+
yyabort unless allow_auto_semi?(val[1])
|
804
|
+
}
|
805
|
+
;
|
806
|
+
|
807
|
+
FunctionDeclaration:
|
808
|
+
FUNCTION IDENT '(' ')' '{' FunctionBody '}' {
|
809
|
+
result = FunctionDeclNode.new(val[1], val[5])
|
810
|
+
debug(val[5])
|
811
|
+
}
|
812
|
+
| FUNCTION IDENT '(' FormalParameterList ')' '{' FunctionBody '}' {
|
813
|
+
result = FunctionDeclNode.new(val[1], val[6], val[3])
|
814
|
+
debug(val[6])
|
815
|
+
}
|
816
|
+
;
|
817
|
+
|
818
|
+
FunctionExpr:
|
819
|
+
FUNCTION '(' ')' '{' FunctionBody '}' {
|
820
|
+
result = FunctionExprNode.new(val[0], val[4])
|
821
|
+
debug(val[4])
|
822
|
+
}
|
823
|
+
| FUNCTION '(' FormalParameterList ')' '{' FunctionBody '}' {
|
824
|
+
result = FunctionExprNode.new(val[0], val[5], val[2])
|
825
|
+
debug(val[5])
|
826
|
+
}
|
827
|
+
| FUNCTION IDENT '(' ')' '{' FunctionBody '}' {
|
828
|
+
result = FunctionExprNode.new(val[1], val[5])
|
829
|
+
debug(val[5])
|
830
|
+
}
|
831
|
+
| FUNCTION IDENT '(' FormalParameterList ')' '{' FunctionBody '}' {
|
832
|
+
result = FunctionExprNode.new(val[1], val[6], val[3])
|
833
|
+
debug(val[6])
|
834
|
+
}
|
835
|
+
;
|
836
|
+
|
837
|
+
FormalParameterList:
|
838
|
+
IDENT { result = [ParameterNode.new(val[0])] }
|
839
|
+
| FormalParameterList ',' IDENT {
|
840
|
+
result = [val.first, ParameterNode.new(val.last)].flatten
|
841
|
+
}
|
842
|
+
;
|
843
|
+
|
844
|
+
FunctionBody:
|
845
|
+
SourceElements { result = FunctionBodyNode.new(val[0]) }
|
846
|
+
;
|
847
|
+
end
|
848
|
+
|
849
|
+
---- header
|
850
|
+
require "rkelly/nodes"
|
851
|
+
|
852
|
+
---- inner
|
853
|
+
include RKelly::Nodes
|
854
|
+
|
855
|
+
def allow_auto_semi?(error_token)
|
856
|
+
error_token == false || error_token == '}' || @terminator
|
857
|
+
end
|
858
|
+
|
859
|
+
def property_class_for(ident)
|
860
|
+
case ident
|
861
|
+
when 'get'
|
862
|
+
GetterPropertyNode
|
863
|
+
when 'set'
|
864
|
+
SetterPropertyNode
|
865
|
+
end
|
866
|
+
end
|
867
|
+
|
868
|
+
def debug(*args)
|
869
|
+
logger.debug(*args) if logger
|
870
|
+
end
|