rkelly_for_reef 1.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (202) hide show
  1. checksums.yaml +7 -0
  2. data/.gemtest +0 -0
  3. data/CHANGELOG.rdoc +26 -0
  4. data/Manifest.txt +199 -0
  5. data/README.rdoc +58 -0
  6. data/Rakefile +39 -0
  7. data/lib/parser.y +871 -0
  8. data/lib/rkelly.rb +14 -0
  9. data/lib/rkelly/constants.rb +3 -0
  10. data/lib/rkelly/generated_parser.rb +3274 -0
  11. data/lib/rkelly/js.rb +14 -0
  12. data/lib/rkelly/js/array.rb +15 -0
  13. data/lib/rkelly/js/base.rb +91 -0
  14. data/lib/rkelly/js/boolean.rb +21 -0
  15. data/lib/rkelly/js/function.rb +39 -0
  16. data/lib/rkelly/js/function_prototype.rb +15 -0
  17. data/lib/rkelly/js/global_object.rb +52 -0
  18. data/lib/rkelly/js/math.rb +10 -0
  19. data/lib/rkelly/js/nan.rb +18 -0
  20. data/lib/rkelly/js/number.rb +22 -0
  21. data/lib/rkelly/js/object.rb +30 -0
  22. data/lib/rkelly/js/object_prototype.rb +14 -0
  23. data/lib/rkelly/js/property.rb +20 -0
  24. data/lib/rkelly/js/scope.rb +6 -0
  25. data/lib/rkelly/js/string.rb +21 -0
  26. data/lib/rkelly/lexeme.rb +18 -0
  27. data/lib/rkelly/nodes.rb +25 -0
  28. data/lib/rkelly/nodes/binary_node.rb +18 -0
  29. data/lib/rkelly/nodes/bracket_accessor_node.rb +11 -0
  30. data/lib/rkelly/nodes/case_clause_node.rb +11 -0
  31. data/lib/rkelly/nodes/comma_node.rb +11 -0
  32. data/lib/rkelly/nodes/conditional_node.rb +11 -0
  33. data/lib/rkelly/nodes/dot_accessor_node.rb +11 -0
  34. data/lib/rkelly/nodes/for_in_node.rb +12 -0
  35. data/lib/rkelly/nodes/for_node.rb +13 -0
  36. data/lib/rkelly/nodes/function_call_node.rb +16 -0
  37. data/lib/rkelly/nodes/function_decl_node.rb +6 -0
  38. data/lib/rkelly/nodes/function_expr_node.rb +12 -0
  39. data/lib/rkelly/nodes/if_node.rb +12 -0
  40. data/lib/rkelly/nodes/label_node.rb +11 -0
  41. data/lib/rkelly/nodes/new_expr_node.rb +11 -0
  42. data/lib/rkelly/nodes/node.rb +88 -0
  43. data/lib/rkelly/nodes/not_strict_equal_node.rb +6 -0
  44. data/lib/rkelly/nodes/op_equal_node.rb +16 -0
  45. data/lib/rkelly/nodes/postfix_node.rb +11 -0
  46. data/lib/rkelly/nodes/prefix_node.rb +6 -0
  47. data/lib/rkelly/nodes/property_node.rb +13 -0
  48. data/lib/rkelly/nodes/resolve_node.rb +19 -0
  49. data/lib/rkelly/nodes/strict_equal_node.rb +6 -0
  50. data/lib/rkelly/nodes/try_node.rb +13 -0
  51. data/lib/rkelly/nodes/var_decl_node.rb +15 -0
  52. data/lib/rkelly/parser.rb +104 -0
  53. data/lib/rkelly/runtime.rb +36 -0
  54. data/lib/rkelly/runtime/ruby_function.rb +13 -0
  55. data/lib/rkelly/runtime/scope_chain.rb +57 -0
  56. data/lib/rkelly/syntax_error.rb +4 -0
  57. data/lib/rkelly/token.rb +19 -0
  58. data/lib/rkelly/tokenizer.rb +161 -0
  59. data/lib/rkelly/visitable.rb +16 -0
  60. data/lib/rkelly/visitors.rb +4 -0
  61. data/lib/rkelly/visitors/dot_visitor.rb +228 -0
  62. data/lib/rkelly/visitors/ecma_visitor.rb +322 -0
  63. data/lib/rkelly/visitors/enumerable_visitor.rb +18 -0
  64. data/lib/rkelly/visitors/evaluation_visitor.rb +419 -0
  65. data/lib/rkelly/visitors/function_visitor.rb +46 -0
  66. data/lib/rkelly/visitors/pointcut_visitor.rb +31 -0
  67. data/lib/rkelly/visitors/real_sexp_visitor.rb +16 -0
  68. data/lib/rkelly/visitors/sexp_visitor.rb +373 -0
  69. data/lib/rkelly/visitors/visitor.rb +136 -0
  70. data/test/ecma_script_test_case.rb +21 -0
  71. data/test/execute_test_case.rb +16 -0
  72. data/test/execution_contexts/test_10_1_3-1.rb +32 -0
  73. data/test/expressions/test_11_3_1.rb +64 -0
  74. data/test/expressions/test_11_3_2.rb +64 -0
  75. data/test/expressions/test_11_4_2.rb +13 -0
  76. data/test/expressions/test_11_4_3.rb +52 -0
  77. data/test/expressions/test_11_4_4.rb +68 -0
  78. data/test/expressions/test_11_4_5.rb +69 -0
  79. data/test/expressions/test_11_4_6.rb +88 -0
  80. data/test/expressions/test_11_4_8.rb +28 -0
  81. data/test/expressions/test_11_4_9.rb +103 -0
  82. data/test/expressions/test_11_5_1.rb +51 -0
  83. data/test/expressions/test_11_5_2.rb +80 -0
  84. data/test/expressions/test_11_5_3.rb +88 -0
  85. data/test/expressions/test_11_6_1-1.rb +19 -0
  86. data/test/expressions/test_11_9_1.rb +19 -0
  87. data/test/function/test_15_3_1_1-1.rb +34 -0
  88. data/test/global_object/test_15_1_1_1.rb +29 -0
  89. data/test/global_object/test_15_1_1_2.rb +17 -0
  90. data/test/global_object/test_15_1_1_3.rb +9 -0
  91. data/test/helper.rb +5 -0
  92. data/test/node_test_case.rb +11 -0
  93. data/test/object/test_15_2_1_1.rb +257 -0
  94. data/test/object/test_15_2_1_2.rb +21 -0
  95. data/test/object/test_15_2_2_1.rb +52 -0
  96. data/test/statements/test_12_5-1.rb +27 -0
  97. data/test/test_add_node.rb +8 -0
  98. data/test/test_arguments_node.rb +8 -0
  99. data/test/test_array_node.rb +9 -0
  100. data/test/test_assign_expr_node.rb +8 -0
  101. data/test/test_automatic_semicolon_insertion.rb +137 -0
  102. data/test/test_bit_and_node.rb +8 -0
  103. data/test/test_bit_or_node.rb +8 -0
  104. data/test/test_bit_x_or_node.rb +8 -0
  105. data/test/test_bitwise_not_node.rb +8 -0
  106. data/test/test_block_node.rb +14 -0
  107. data/test/test_bracket_accessor_node.rb +16 -0
  108. data/test/test_break_node.rb +11 -0
  109. data/test/test_case_block_node.rb +11 -0
  110. data/test/test_case_clause_node.rb +15 -0
  111. data/test/test_comma_node.rb +13 -0
  112. data/test/test_comments.rb +44 -0
  113. data/test/test_conditional_node.rb +17 -0
  114. data/test/test_const_statement_node.rb +14 -0
  115. data/test/test_continue_node.rb +11 -0
  116. data/test/test_delete_node.rb +8 -0
  117. data/test/test_divide_node.rb +8 -0
  118. data/test/test_do_while_node.rb +13 -0
  119. data/test/test_dot_accessor_node.rb +9 -0
  120. data/test/test_ecma_visitor.rb +210 -0
  121. data/test/test_element_node.rb +8 -0
  122. data/test/test_empty_statement_node.rb +8 -0
  123. data/test/test_equal_node.rb +8 -0
  124. data/test/test_evaluation_visitor.rb +66 -0
  125. data/test/test_expression_statement_node.rb +10 -0
  126. data/test/test_false_node.rb +8 -0
  127. data/test/test_for_in_node.rb +17 -0
  128. data/test/test_for_node.rb +24 -0
  129. data/test/test_function_body_node.rb +8 -0
  130. data/test/test_function_call_node.rb +10 -0
  131. data/test/test_function_decl_node.rb +16 -0
  132. data/test/test_function_expr_node.rb +16 -0
  133. data/test/test_function_visitor.rb +26 -0
  134. data/test/test_getter_property_node.rb +10 -0
  135. data/test/test_global_object.rb +49 -0
  136. data/test/test_greater_node.rb +8 -0
  137. data/test/test_greater_or_equal_node.rb +8 -0
  138. data/test/test_if_node.rb +17 -0
  139. data/test/test_in_node.rb +8 -0
  140. data/test/test_instance_of_node.rb +8 -0
  141. data/test/test_label_node.rb +13 -0
  142. data/test/test_left_shift_node.rb +8 -0
  143. data/test/test_less_node.rb +8 -0
  144. data/test/test_less_or_equal_node.rb +8 -0
  145. data/test/test_line_number.rb +23 -0
  146. data/test/test_logical_and_node.rb +8 -0
  147. data/test/test_logical_not_node.rb +8 -0
  148. data/test/test_logical_or_node.rb +8 -0
  149. data/test/test_modulus_node.rb +8 -0
  150. data/test/test_multiply_node.rb +8 -0
  151. data/test/test_new_expr_node.rb +9 -0
  152. data/test/test_not_equal_node.rb +8 -0
  153. data/test/test_not_strict_equal_node.rb +8 -0
  154. data/test/test_null_node.rb +8 -0
  155. data/test/test_number_node.rb +8 -0
  156. data/test/test_object_literal_node.rb +9 -0
  157. data/test/test_op_and_equal_node.rb +10 -0
  158. data/test/test_op_divide_equal_node.rb +10 -0
  159. data/test/test_op_equal_node.rb +10 -0
  160. data/test/test_op_l_shift_equal_node.rb +10 -0
  161. data/test/test_op_minus_equal_node.rb +10 -0
  162. data/test/test_op_mod_equal_node.rb +10 -0
  163. data/test/test_op_multiply_equal_node.rb +10 -0
  164. data/test/test_op_or_equal_node.rb +10 -0
  165. data/test/test_op_plus_equal_node.rb +10 -0
  166. data/test/test_op_r_shift_equal_node.rb +10 -0
  167. data/test/test_op_u_r_shift_equal_node.rb +10 -0
  168. data/test/test_op_x_or_equal_node.rb +10 -0
  169. data/test/test_parameter_node.rb +8 -0
  170. data/test/test_parser.rb +1361 -0
  171. data/test/test_pointcut_visitor.rb +34 -0
  172. data/test/test_postfix_node.rb +8 -0
  173. data/test/test_prefix_node.rb +8 -0
  174. data/test/test_property_node.rb +8 -0
  175. data/test/test_regexp_node.rb +8 -0
  176. data/test/test_resolve_node.rb +22 -0
  177. data/test/test_return_node.rb +11 -0
  178. data/test/test_right_shift_node.rb +8 -0
  179. data/test/test_rkelly.rb +19 -0
  180. data/test/test_runtime.rb +12 -0
  181. data/test/test_scope_chain.rb +50 -0
  182. data/test/test_setter_property_node.rb +10 -0
  183. data/test/test_source_elements.rb +9 -0
  184. data/test/test_strict_equal_node.rb +8 -0
  185. data/test/test_string_node.rb +8 -0
  186. data/test/test_subtract_node.rb +8 -0
  187. data/test/test_switch_node.rb +12 -0
  188. data/test/test_this_node.rb +8 -0
  189. data/test/test_throw_node.rb +7 -0
  190. data/test/test_tokenizer.rb +199 -0
  191. data/test/test_true_node.rb +8 -0
  192. data/test/test_try_node.rb +59 -0
  193. data/test/test_type_of_node.rb +8 -0
  194. data/test/test_unary_minus_node.rb +8 -0
  195. data/test/test_unary_plus_node.rb +8 -0
  196. data/test/test_unsigned_right_shift_node.rb +8 -0
  197. data/test/test_var_decl_node.rb +21 -0
  198. data/test/test_var_statement_node.rb +14 -0
  199. data/test/test_void_node.rb +8 -0
  200. data/test/test_while_node.rb +15 -0
  201. data/test/test_with_node.rb +8 -0
  202. metadata +406 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 8ad4b1145d58849e3a03779cb315a5a556bcbe19
4
+ data.tar.gz: 1c502ef22b4f911df6c6e538876c8b562e0b90d3
5
+ SHA512:
6
+ metadata.gz: fb94c435533fa5ec44b4fb85ccee6fca2a62085bb31a9100c7c67d42c2ae5a41423e01bae4b2643e9e1a316dffd24ea83b1bdfc9449901ade32fb3ae7eaab8b2
7
+ data.tar.gz: 5b75976f5957f8693317a5aaec5a0aab6d9ad3d7591de9994ea85ff6ae073db5492b396371e609e92a9ce429c000928a43c62f50e4f726c056fa65f5104e5165
File without changes
@@ -0,0 +1,26 @@
1
+ = RKelly CHANGELOG
2
+
3
+ === 1.0.8
4
+ * Bugfixes
5
+
6
+ * Fixed escaping issue on ruby 1.9.3
7
+
8
+ === 1.0.3
9
+
10
+ * Bugfixes
11
+
12
+ * Fixed a typo in visitor.rb
13
+ * Fixed syntax error class
14
+ * Regex tonenization (thanks Josh Dzielak)
15
+
16
+ === 1.0.1
17
+
18
+ * Bugfixes
19
+
20
+ * Fixed nondeterministic file order loading issue.
21
+
22
+ === 0.0.1
23
+
24
+ * Added dynamic method assignment
25
+ * Birthday!
26
+
@@ -0,0 +1,199 @@
1
+ CHANGELOG.rdoc
2
+ Manifest.txt
3
+ README.rdoc
4
+ Rakefile
5
+ lib/parser.y
6
+ lib/rkelly.rb
7
+ lib/rkelly/constants.rb
8
+ lib/rkelly/generated_parser.rb
9
+ lib/rkelly/js.rb
10
+ lib/rkelly/js/array.rb
11
+ lib/rkelly/js/base.rb
12
+ lib/rkelly/js/boolean.rb
13
+ lib/rkelly/js/function.rb
14
+ lib/rkelly/js/function_prototype.rb
15
+ lib/rkelly/js/global_object.rb
16
+ lib/rkelly/js/math.rb
17
+ lib/rkelly/js/nan.rb
18
+ lib/rkelly/js/number.rb
19
+ lib/rkelly/js/object.rb
20
+ lib/rkelly/js/object_prototype.rb
21
+ lib/rkelly/js/property.rb
22
+ lib/rkelly/js/scope.rb
23
+ lib/rkelly/js/string.rb
24
+ lib/rkelly/lexeme.rb
25
+ lib/rkelly/nodes.rb
26
+ lib/rkelly/nodes/binary_node.rb
27
+ lib/rkelly/nodes/bracket_accessor_node.rb
28
+ lib/rkelly/nodes/case_clause_node.rb
29
+ lib/rkelly/nodes/comma_node.rb
30
+ lib/rkelly/nodes/conditional_node.rb
31
+ lib/rkelly/nodes/dot_accessor_node.rb
32
+ lib/rkelly/nodes/for_in_node.rb
33
+ lib/rkelly/nodes/for_node.rb
34
+ lib/rkelly/nodes/function_call_node.rb
35
+ lib/rkelly/nodes/function_decl_node.rb
36
+ lib/rkelly/nodes/function_expr_node.rb
37
+ lib/rkelly/nodes/if_node.rb
38
+ lib/rkelly/nodes/label_node.rb
39
+ lib/rkelly/nodes/new_expr_node.rb
40
+ lib/rkelly/nodes/node.rb
41
+ lib/rkelly/nodes/not_strict_equal_node.rb
42
+ lib/rkelly/nodes/op_equal_node.rb
43
+ lib/rkelly/nodes/postfix_node.rb
44
+ lib/rkelly/nodes/prefix_node.rb
45
+ lib/rkelly/nodes/property_node.rb
46
+ lib/rkelly/nodes/resolve_node.rb
47
+ lib/rkelly/nodes/strict_equal_node.rb
48
+ lib/rkelly/nodes/try_node.rb
49
+ lib/rkelly/nodes/var_decl_node.rb
50
+ lib/rkelly/parser.rb
51
+ lib/rkelly/runtime.rb
52
+ lib/rkelly/runtime/ruby_function.rb
53
+ lib/rkelly/runtime/scope_chain.rb
54
+ lib/rkelly/syntax_error.rb
55
+ lib/rkelly/token.rb
56
+ lib/rkelly/tokenizer.rb
57
+ lib/rkelly/visitable.rb
58
+ lib/rkelly/visitors.rb
59
+ lib/rkelly/visitors/dot_visitor.rb
60
+ lib/rkelly/visitors/ecma_visitor.rb
61
+ lib/rkelly/visitors/enumerable_visitor.rb
62
+ lib/rkelly/visitors/evaluation_visitor.rb
63
+ lib/rkelly/visitors/function_visitor.rb
64
+ lib/rkelly/visitors/pointcut_visitor.rb
65
+ lib/rkelly/visitors/real_sexp_visitor.rb
66
+ lib/rkelly/visitors/sexp_visitor.rb
67
+ lib/rkelly/visitors/visitor.rb
68
+ test/ecma_script_test_case.rb
69
+ test/execute_test_case.rb
70
+ test/execution_contexts/test_10_1_3-1.rb
71
+ test/expressions/test_11_3_1.rb
72
+ test/expressions/test_11_3_2.rb
73
+ test/expressions/test_11_4_2.rb
74
+ test/expressions/test_11_4_3.rb
75
+ test/expressions/test_11_4_4.rb
76
+ test/expressions/test_11_4_5.rb
77
+ test/expressions/test_11_4_6.rb
78
+ test/expressions/test_11_4_8.rb
79
+ test/expressions/test_11_4_9.rb
80
+ test/expressions/test_11_5_1.rb
81
+ test/expressions/test_11_5_2.rb
82
+ test/expressions/test_11_5_3.rb
83
+ test/expressions/test_11_6_1-1.rb
84
+ test/expressions/test_11_9_1.rb
85
+ test/function/test_15_3_1_1-1.rb
86
+ test/global_object/test_15_1_1_1.rb
87
+ test/global_object/test_15_1_1_2.rb
88
+ test/global_object/test_15_1_1_3.rb
89
+ test/helper.rb
90
+ test/node_test_case.rb
91
+ test/object/test_15_2_1_1.rb
92
+ test/object/test_15_2_1_2.rb
93
+ test/object/test_15_2_2_1.rb
94
+ test/statements/test_12_5-1.rb
95
+ test/test_add_node.rb
96
+ test/test_arguments_node.rb
97
+ test/test_array_node.rb
98
+ test/test_assign_expr_node.rb
99
+ test/test_automatic_semicolon_insertion.rb
100
+ test/test_bit_and_node.rb
101
+ test/test_bit_or_node.rb
102
+ test/test_bit_x_or_node.rb
103
+ test/test_bitwise_not_node.rb
104
+ test/test_block_node.rb
105
+ test/test_bracket_accessor_node.rb
106
+ test/test_break_node.rb
107
+ test/test_case_block_node.rb
108
+ test/test_case_clause_node.rb
109
+ test/test_comma_node.rb
110
+ test/test_comments.rb
111
+ test/test_conditional_node.rb
112
+ test/test_const_statement_node.rb
113
+ test/test_continue_node.rb
114
+ test/test_delete_node.rb
115
+ test/test_divide_node.rb
116
+ test/test_do_while_node.rb
117
+ test/test_dot_accessor_node.rb
118
+ test/test_ecma_visitor.rb
119
+ test/test_element_node.rb
120
+ test/test_empty_statement_node.rb
121
+ test/test_equal_node.rb
122
+ test/test_evaluation_visitor.rb
123
+ test/test_expression_statement_node.rb
124
+ test/test_false_node.rb
125
+ test/test_for_in_node.rb
126
+ test/test_for_node.rb
127
+ test/test_function_body_node.rb
128
+ test/test_function_call_node.rb
129
+ test/test_function_decl_node.rb
130
+ test/test_function_expr_node.rb
131
+ test/test_function_visitor.rb
132
+ test/test_getter_property_node.rb
133
+ test/test_global_object.rb
134
+ test/test_greater_node.rb
135
+ test/test_greater_or_equal_node.rb
136
+ test/test_if_node.rb
137
+ test/test_in_node.rb
138
+ test/test_instance_of_node.rb
139
+ test/test_label_node.rb
140
+ test/test_left_shift_node.rb
141
+ test/test_less_node.rb
142
+ test/test_less_or_equal_node.rb
143
+ test/test_line_number.rb
144
+ test/test_logical_and_node.rb
145
+ test/test_logical_not_node.rb
146
+ test/test_logical_or_node.rb
147
+ test/test_modulus_node.rb
148
+ test/test_multiply_node.rb
149
+ test/test_new_expr_node.rb
150
+ test/test_not_equal_node.rb
151
+ test/test_not_strict_equal_node.rb
152
+ test/test_null_node.rb
153
+ test/test_number_node.rb
154
+ test/test_object_literal_node.rb
155
+ test/test_op_and_equal_node.rb
156
+ test/test_op_divide_equal_node.rb
157
+ test/test_op_equal_node.rb
158
+ test/test_op_l_shift_equal_node.rb
159
+ test/test_op_minus_equal_node.rb
160
+ test/test_op_mod_equal_node.rb
161
+ test/test_op_multiply_equal_node.rb
162
+ test/test_op_or_equal_node.rb
163
+ test/test_op_plus_equal_node.rb
164
+ test/test_op_r_shift_equal_node.rb
165
+ test/test_op_u_r_shift_equal_node.rb
166
+ test/test_op_x_or_equal_node.rb
167
+ test/test_parameter_node.rb
168
+ test/test_parser.rb
169
+ test/test_pointcut_visitor.rb
170
+ test/test_postfix_node.rb
171
+ test/test_prefix_node.rb
172
+ test/test_property_node.rb
173
+ test/test_regexp_node.rb
174
+ test/test_resolve_node.rb
175
+ test/test_return_node.rb
176
+ test/test_right_shift_node.rb
177
+ test/test_rkelly.rb
178
+ test/test_runtime.rb
179
+ test/test_scope_chain.rb
180
+ test/test_setter_property_node.rb
181
+ test/test_source_elements.rb
182
+ test/test_strict_equal_node.rb
183
+ test/test_string_node.rb
184
+ test/test_subtract_node.rb
185
+ test/test_switch_node.rb
186
+ test/test_this_node.rb
187
+ test/test_throw_node.rb
188
+ test/test_tokenizer.rb
189
+ test/test_true_node.rb
190
+ test/test_try_node.rb
191
+ test/test_type_of_node.rb
192
+ test/test_unary_minus_node.rb
193
+ test/test_unary_plus_node.rb
194
+ test/test_unsigned_right_shift_node.rb
195
+ test/test_var_decl_node.rb
196
+ test/test_var_statement_node.rb
197
+ test/test_void_node.rb
198
+ test/test_while_node.rb
199
+ test/test_with_node.rb
@@ -0,0 +1,58 @@
1
+ = RKelly
2
+
3
+ * http://rkelly.rubyforge.org/
4
+
5
+ == DESCRIPTION
6
+
7
+ The RKelly library will parse JavaScript and return a parse tree, fixed to support ruby 1.9.3
8
+
9
+ == Example
10
+
11
+ ##
12
+ # Iterate over and modify a JavaScript AST. Then print the modified
13
+ # AST as JavaScript.
14
+ require 'rkelly'
15
+
16
+ parser = RKelly::Parser.new
17
+ ast = parser.parse(
18
+ "for(var i = 0; i < 10; i++) { var x = 5 + 5; }"
19
+ )
20
+
21
+ ast.each do |node|
22
+ node.value = 'hello' if node.value == 'i'
23
+ node.name = 'hello' if node.respond_to?(:name) && node.name == 'i'
24
+ end
25
+ puts ast.to_ecma # => awesome javascript
26
+
27
+ == Acknowledgments
28
+
29
+ The original javascript parser was was taken from rbnarcissus written by
30
+ Paul Sowden. Thanks Paul!
31
+
32
+ http://idontsmoke.co.uk/2005/rbnarcissus/
33
+
34
+ The current parser was ported from WebKit. Thank you WebKit team!
35
+
36
+ == License
37
+
38
+ The MIT License
39
+
40
+ Copyright (c) 2007, 2008, 2009 Aaron Patterson, John Barnette
41
+
42
+ Permission is hereby granted, free of charge, to any person obtaining a copy
43
+ of this software and associated documentation files (the "Software"), to deal
44
+ in the Software without restriction, including without limitation the rights
45
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
46
+ copies of the Software, and to permit persons to whom the Software is
47
+ furnished to do so, subject to the following conditions:
48
+
49
+ The above copyright notice and this permission notice shall be included in
50
+ all copies or substantial portions of the Software.
51
+
52
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
53
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
54
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
55
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
56
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
57
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
58
+ THE SOFTWARE
@@ -0,0 +1,39 @@
1
+ require 'rubygems'
2
+ require 'hoe'
3
+
4
+ Hoe.plugin :gemspec # `gem install hoe-gemspec`
5
+ Hoe.plugin :git # `gem install hoe-git`
6
+
7
+ GENERATED_PARSER = "lib/rkelly/generated_parser.rb"
8
+
9
+ HOE = Hoe.spec('rkelly_for_reef') do |p|
10
+ developer('Aaron Patterson', 'aaron.patterson@gmail.com')
11
+ self.readme_file = 'README.rdoc'
12
+ self.history_file = 'CHANGELOG.rdoc'
13
+ self.extra_rdoc_files = FileList['*.rdoc']
14
+ self.clean_globs = [GENERATED_PARSER]
15
+
16
+ end
17
+
18
+ file GENERATED_PARSER => "lib/parser.y" do |t|
19
+ if ENV['DEBUG']
20
+ sh "racc -g -v -o #{t.name} #{t.prerequisites.first}"
21
+ else
22
+ sh "racc -o #{t.name} #{t.prerequisites.first}"
23
+ end
24
+ end
25
+
26
+ task :parser => GENERATED_PARSER
27
+
28
+ # make sure the parser's up-to-date when we test
29
+ Rake::Task[:test].prerequisites << :parser
30
+ Rake::Task[:check_manifest].prerequisites << :parser
31
+
32
+ namespace :gem do
33
+ task :spec do
34
+ File.open("#{HOE.name}.gemspec", 'w') do |f|
35
+ HOE.spec.version = "#{HOE.version}.#{Time.now.strftime("%Y%m%d%H%M%S")}"
36
+ f.write(HOE.spec.to_ruby)
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,871 @@
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 = ParentheticalNode.new(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
+ VOID '(' MemberExpr ')' { result = FunctionCallNode.new(ResolveNode.new(val[0]), val[2]) }
185
+ | MemberExprNoBF Arguments { result = FunctionCallNode.new(val[0], val[1]) }
186
+ | CallExprNoBF Arguments { result = FunctionCallNode.new(val[0], val[1]) }
187
+ | CallExprNoBF '[' Expr ']' { result = BracketAccessorNode.new(val[0], val[2]) }
188
+ | CallExprNoBF '.' IDENT { result = DotAccessorNode.new(val[0], val[2]) }
189
+ ;
190
+
191
+ Arguments:
192
+ '(' ')' { result = ArgumentsNode.new([]) }
193
+ | '(' ArgumentList ')' { result = ArgumentsNode.new(val[1]); }
194
+ ;
195
+
196
+ ArgumentList:
197
+ AssignmentExpr { result = val }
198
+ | ArgumentList ',' AssignmentExpr { result = [val[0], val[2]].flatten }
199
+ ;
200
+
201
+ LeftHandSideExpr:
202
+ NewExpr
203
+ | CallExpr
204
+ ;
205
+
206
+ LeftHandSideExprNoBF:
207
+ NewExprNoBF
208
+ | CallExprNoBF
209
+ ;
210
+
211
+ PostfixExpr:
212
+ LeftHandSideExpr
213
+ | LeftHandSideExpr PLUSPLUS { result = PostfixNode.new(val[0], '++') }
214
+ | LeftHandSideExpr MINUSMINUS { result = PostfixNode.new(val[0], '--') }
215
+ ;
216
+
217
+ PostfixExprNoBF:
218
+ LeftHandSideExprNoBF
219
+ | LeftHandSideExprNoBF PLUSPLUS { result = PostfixNode.new(val[0], '++') }
220
+ | LeftHandSideExprNoBF MINUSMINUS { result = PostfixNode.new(val[0], '--') }
221
+ ;
222
+
223
+ UnaryExprCommon:
224
+ DELETE UnaryExpr { result = DeleteNode.new(val[1]) }
225
+ | VOID UnaryExpr { result = VoidNode.new(val[1]) }
226
+ | TYPEOF UnaryExpr { result = TypeOfNode.new(val[1]) }
227
+ | PLUSPLUS UnaryExpr { result = PrefixNode.new(val[1], '++') }
228
+ /* FIXME: Not sure when this can ever happen
229
+ | AUTOPLUSPLUS UnaryExpr { result = makePrefixNode($2, OpPlusPlus); } */
230
+ | MINUSMINUS UnaryExpr { result = PrefixNode.new(val[1], '--') }
231
+ /* FIXME: Not sure when this can ever happen
232
+ | AUTOMINUSMINUS UnaryExpr { result = makePrefixNode($2, OpMinusMinus); } */
233
+ | '+' UnaryExpr { result = UnaryPlusNode.new(val[1]) }
234
+ | '-' UnaryExpr { result = UnaryMinusNode.new(val[1]) }
235
+ | '~' UnaryExpr { result = BitwiseNotNode.new(val[1]) }
236
+ | '!' UnaryExpr { result = LogicalNotNode.new(val[1]) }
237
+ ;
238
+
239
+ UnaryExpr:
240
+ PostfixExpr
241
+ | UnaryExprCommon
242
+ ;
243
+
244
+ UnaryExprNoBF:
245
+ PostfixExprNoBF
246
+ | UnaryExprCommon
247
+ ;
248
+
249
+ MultiplicativeExpr:
250
+ UnaryExpr
251
+ | MultiplicativeExpr '*' UnaryExpr { result = MultiplyNode.new(val[0],val[2])}
252
+ | MultiplicativeExpr '/' UnaryExpr { result = DivideNode.new(val[0], val[2]) }
253
+ | MultiplicativeExpr '%' UnaryExpr { result = ModulusNode.new(val[0], val[2])}
254
+ ;
255
+
256
+ MultiplicativeExprNoBF:
257
+ UnaryExprNoBF
258
+ | MultiplicativeExprNoBF '*' UnaryExpr { result = MultiplyNode.new(val[0], val[2]) }
259
+ | MultiplicativeExprNoBF '/' UnaryExpr { result = DivideNode.new(val[0],val[2]) }
260
+ | MultiplicativeExprNoBF '%' UnaryExpr { result = ModulusNode.new(val[0], val[2]) }
261
+ ;
262
+
263
+ AdditiveExpr:
264
+ MultiplicativeExpr
265
+ | AdditiveExpr '+' MultiplicativeExpr { result = AddNode.new(val[0], val[2]) }
266
+ | AdditiveExpr '-' MultiplicativeExpr { result = SubtractNode.new(val[0], val[2]) }
267
+ ;
268
+
269
+ AdditiveExprNoBF:
270
+ MultiplicativeExprNoBF
271
+ | AdditiveExprNoBF '+' MultiplicativeExpr { result = AddNode.new(val[0], val[2]) }
272
+ | AdditiveExprNoBF '-' MultiplicativeExpr { result = SubtractNode.new(val[0], val[2]) }
273
+ ;
274
+
275
+ ShiftExpr:
276
+ AdditiveExpr
277
+ | ShiftExpr LSHIFT AdditiveExpr { result = LeftShiftNode.new(val[0], val[2]) }
278
+ | ShiftExpr RSHIFT AdditiveExpr { result = RightShiftNode.new(val[0], val[2]) }
279
+ | ShiftExpr URSHIFT AdditiveExpr { result = UnsignedRightShiftNode.new(val[0], val[2]) }
280
+ ;
281
+
282
+ ShiftExprNoBF:
283
+ AdditiveExprNoBF
284
+ | ShiftExprNoBF LSHIFT AdditiveExpr { result = LeftShiftNode.new(val[0], val[2]) }
285
+ | ShiftExprNoBF RSHIFT AdditiveExpr { result = RightShiftNode.new(val[0], val[2]) }
286
+ | ShiftExprNoBF URSHIFT AdditiveExpr { result = UnsignedRightShiftNode.new(val[0], val[2]) }
287
+ ;
288
+
289
+ RelationalExpr:
290
+ ShiftExpr
291
+ | RelationalExpr '<' ShiftExpr { result = LessNode.new(val[0], val[2])}
292
+ | RelationalExpr '>' ShiftExpr { result = GreaterNode.new(val[0], val[2]) }
293
+ | RelationalExpr LE ShiftExpr { result = LessOrEqualNode.new(val[0], val[2]) }
294
+ | RelationalExpr GE ShiftExpr { result = GreaterOrEqualNode.new(val[0], val[2]) }
295
+ | RelationalExpr INSTANCEOF ShiftExpr { result = InstanceOfNode.new(val[0], val[2]) }
296
+ | RelationalExpr IN ShiftExpr { result = InNode.new(val[0], val[2]) }
297
+ ;
298
+
299
+ RelationalExprNoIn:
300
+ ShiftExpr
301
+ | RelationalExprNoIn '<' ShiftExpr { result = LessNode.new(val[0], val[2])}
302
+ | RelationalExprNoIn '>' ShiftExpr { result = GreaterNode.new(val[0], val[2]) }
303
+ | RelationalExprNoIn LE ShiftExpr { result = LessOrEqualNode.new(val[0], val[2]) }
304
+ | RelationalExprNoIn GE ShiftExpr { result = GreaterOrEqualNode.new(val[0], val[2]) }
305
+ | RelationalExprNoIn INSTANCEOF ShiftExpr
306
+ { result = InstanceOfNode.new(val[0], val[2]) }
307
+ ;
308
+
309
+ RelationalExprNoBF:
310
+ ShiftExprNoBF
311
+ | RelationalExprNoBF '<' ShiftExpr { result = LessNode.new(val[0], val[2]) }
312
+ | RelationalExprNoBF '>' ShiftExpr { result = GreaterNode.new(val[0], val[2]) }
313
+ | RelationalExprNoBF LE ShiftExpr { result = LessOrEqualNode.new(val[0], val[2]) }
314
+ | RelationalExprNoBF GE ShiftExpr { result = GreaterOrEqualNode.new(val[0], val[2]) }
315
+ | RelationalExprNoBF INSTANCEOF ShiftExpr
316
+ { result = InstanceOfNode.new(val[0], val[2]) }
317
+ | RelationalExprNoBF IN ShiftExpr { result = InNode.new(val[0], val[2]) }
318
+ ;
319
+
320
+ EqualityExpr:
321
+ RelationalExpr
322
+ | EqualityExpr EQEQ RelationalExpr { result = EqualNode.new(val[0], val[2]) }
323
+ | EqualityExpr NE RelationalExpr { result = NotEqualNode.new(val[0], val[2]) }
324
+ | EqualityExpr STREQ RelationalExpr { result = StrictEqualNode.new(val[0], val[2]) }
325
+ | EqualityExpr STRNEQ RelationalExpr { result = NotStrictEqualNode.new(val[0], val[2]) }
326
+ ;
327
+
328
+ EqualityExprNoIn:
329
+ RelationalExprNoIn
330
+ | EqualityExprNoIn EQEQ RelationalExprNoIn
331
+ { result = EqualNode.new(val[0], val[2]) }
332
+ | EqualityExprNoIn NE RelationalExprNoIn
333
+ { result = NotEqualNode.new(val[0], val[2]) }
334
+ | EqualityExprNoIn STREQ RelationalExprNoIn
335
+ { result = StrictEqualNode.new(val[0], val[2]) }
336
+ | EqualityExprNoIn STRNEQ RelationalExprNoIn
337
+ { result = NotStrictEqualNode.new(val[0], val[2]) }
338
+ ;
339
+
340
+ EqualityExprNoBF:
341
+ RelationalExprNoBF
342
+ | EqualityExprNoBF EQEQ RelationalExpr
343
+ { result = EqualNode.new(val[0], val[2]) }
344
+ | EqualityExprNoBF NE RelationalExpr { result = NotEqualNode.new(val[0], val[2]) }
345
+ | EqualityExprNoBF STREQ RelationalExpr
346
+ { result = StrictEqualNode.new(val[0], val[2]) }
347
+ | EqualityExprNoBF STRNEQ RelationalExpr
348
+ { result = NotStrictEqualNode.new(val[0], val[2]) }
349
+ ;
350
+
351
+ BitwiseANDExpr:
352
+ EqualityExpr
353
+ | BitwiseANDExpr '&' EqualityExpr { result = BitAndNode.new(val[0], val[2]) }
354
+ ;
355
+
356
+ BitwiseANDExprNoIn:
357
+ EqualityExprNoIn
358
+ | BitwiseANDExprNoIn '&' EqualityExprNoIn
359
+ { result = BitAndNode.new(val[0], val[2]) }
360
+ ;
361
+
362
+ BitwiseANDExprNoBF:
363
+ EqualityExprNoBF
364
+ | BitwiseANDExprNoBF '&' EqualityExpr { result = BitAndNode.new(val[0], val[2]) }
365
+ ;
366
+
367
+ BitwiseXORExpr:
368
+ BitwiseANDExpr
369
+ | BitwiseXORExpr '^' BitwiseANDExpr { result = BitXOrNode.new(val[0], val[2]) }
370
+ ;
371
+
372
+ BitwiseXORExprNoIn:
373
+ BitwiseANDExprNoIn
374
+ | BitwiseXORExprNoIn '^' BitwiseANDExprNoIn
375
+ { result = BitXOrNode.new(val[0], val[2]) }
376
+ ;
377
+
378
+ BitwiseXORExprNoBF:
379
+ BitwiseANDExprNoBF
380
+ | BitwiseXORExprNoBF '^' BitwiseANDExpr
381
+ { result = BitXOrNode.new(val[0], val[2]) }
382
+ ;
383
+
384
+ BitwiseORExpr:
385
+ BitwiseXORExpr
386
+ | BitwiseORExpr '|' BitwiseXORExpr { result = BitOrNode.new(val[0], val[2]) }
387
+ ;
388
+
389
+ BitwiseORExprNoIn:
390
+ BitwiseXORExprNoIn
391
+ | BitwiseORExprNoIn '|' BitwiseXORExprNoIn
392
+ { result = BitOrNode.new(val[0], val[2]) }
393
+ ;
394
+
395
+ BitwiseORExprNoBF:
396
+ BitwiseXORExprNoBF
397
+ | BitwiseORExprNoBF '|' BitwiseXORExpr
398
+ { result = BitOrNode.new(val[0], val[2]) }
399
+ ;
400
+
401
+ LogicalANDExpr:
402
+ BitwiseORExpr
403
+ | LogicalANDExpr AND BitwiseORExpr { result = LogicalAndNode.new(val[0], val[2]) }
404
+ ;
405
+
406
+ LogicalANDExprNoIn:
407
+ BitwiseORExprNoIn
408
+ | LogicalANDExprNoIn AND BitwiseORExprNoIn
409
+ { result = LogicalAndNode.new(val[0], val[2]) }
410
+ ;
411
+
412
+ LogicalANDExprNoBF:
413
+ BitwiseORExprNoBF
414
+ | LogicalANDExprNoBF AND BitwiseORExpr
415
+ { result = LogicalAndNode.new(val[0], val[2]) }
416
+ ;
417
+
418
+ LogicalORExpr:
419
+ LogicalANDExpr
420
+ | LogicalORExpr OR LogicalANDExpr { result = LogicalOrNode.new(val[0], val[2]) }
421
+ ;
422
+
423
+ LogicalORExprNoIn:
424
+ LogicalANDExprNoIn
425
+ | LogicalORExprNoIn OR LogicalANDExprNoIn
426
+ { result = LogicalOrNode.new(val[0], val[2]) }
427
+ ;
428
+
429
+ LogicalORExprNoBF:
430
+ LogicalANDExprNoBF
431
+ | LogicalORExprNoBF OR LogicalANDExpr { result = LogicalOrNode.new(val[0], val[2]) }
432
+ ;
433
+
434
+ ConditionalExpr:
435
+ LogicalORExpr
436
+ | LogicalORExpr '?' AssignmentExpr ':' AssignmentExpr {
437
+ result = ConditionalNode.new(val[0], val[2], val[4])
438
+ }
439
+ ;
440
+
441
+ ConditionalExprNoIn:
442
+ LogicalORExprNoIn
443
+ | LogicalORExprNoIn '?' AssignmentExprNoIn ':' AssignmentExprNoIn {
444
+ result = ConditionalNode.new(val[0], val[2], val[4])
445
+ }
446
+ ;
447
+
448
+ ConditionalExprNoBF:
449
+ LogicalORExprNoBF
450
+ | LogicalORExprNoBF '?' AssignmentExpr ':' AssignmentExpr {
451
+ result = ConditionalNode.new(val[0], val[2], val[4])
452
+ }
453
+ ;
454
+
455
+ AssignmentExpr:
456
+ ConditionalExpr
457
+ | LeftHandSideExpr AssignmentOperator AssignmentExpr {
458
+ result = val[1].new(val.first, val.last)
459
+ }
460
+ ;
461
+
462
+ AssignmentExprNoIn:
463
+ ConditionalExprNoIn
464
+ | LeftHandSideExpr AssignmentOperator AssignmentExprNoIn {
465
+ result = val[1].new(val.first, val.last)
466
+ }
467
+ ;
468
+
469
+ AssignmentExprNoBF:
470
+ ConditionalExprNoBF
471
+ | LeftHandSideExprNoBF AssignmentOperator AssignmentExpr {
472
+ result = val[1].new(val.first, val.last)
473
+ }
474
+ ;
475
+
476
+ AssignmentOperator:
477
+ '=' { result = OpEqualNode }
478
+ | PLUSEQUAL { result = OpPlusEqualNode }
479
+ | MINUSEQUAL { result = OpMinusEqualNode }
480
+ | MULTEQUAL { result = OpMultiplyEqualNode }
481
+ | DIVEQUAL { result = OpDivideEqualNode }
482
+ | LSHIFTEQUAL { result = OpLShiftEqualNode }
483
+ | RSHIFTEQUAL { result = OpRShiftEqualNode }
484
+ | URSHIFTEQUAL { result = OpURShiftEqualNode }
485
+ | ANDEQUAL { result = OpAndEqualNode }
486
+ | XOREQUAL { result = OpXOrEqualNode }
487
+ | OREQUAL { result = OpOrEqualNode }
488
+ | MODEQUAL { result = OpModEqualNode }
489
+ ;
490
+
491
+ Expr:
492
+ AssignmentExpr
493
+ | Expr ',' AssignmentExpr { result = CommaNode.new(val[0], val[2]) }
494
+ ;
495
+
496
+ ExprNoIn:
497
+ AssignmentExprNoIn
498
+ | ExprNoIn ',' AssignmentExprNoIn { result = CommaNode.new(val[0], val[2]) }
499
+ ;
500
+
501
+ ExprNoBF:
502
+ AssignmentExprNoBF
503
+ | ExprNoBF ',' AssignmentExpr { result = CommaNode.new(val[0], val[2]) }
504
+ ;
505
+
506
+
507
+ Block:
508
+ '{' SourceElements '}' {
509
+ result = BlockNode.new(val[1])
510
+ debug(result)
511
+ }
512
+ ;
513
+
514
+ VariableStatement:
515
+ VAR VariableDeclarationList ';' {
516
+ result = VarStatementNode.new(val[1])
517
+ debug(result)
518
+ }
519
+ | VAR VariableDeclarationList error {
520
+ result = VarStatementNode.new(val[1])
521
+ debug(result)
522
+ yyabort unless allow_auto_semi?(val.last)
523
+ }
524
+ ;
525
+
526
+ VariableDeclarationList:
527
+ VariableDeclaration { result = val }
528
+ | VariableDeclarationList ',' VariableDeclaration {
529
+ result = [val.first, val.last].flatten
530
+ }
531
+ ;
532
+
533
+ VariableDeclarationListNoIn:
534
+ VariableDeclarationNoIn { result = val }
535
+ | VariableDeclarationListNoIn ',' VariableDeclarationNoIn {
536
+ result = [val.first, val.last].flatten
537
+ }
538
+ ;
539
+
540
+ VariableDeclaration:
541
+ IDENT { result = VarDeclNode.new(val.first, nil) }
542
+ | IDENT Initializer { result = VarDeclNode.new(val.first, val[1]) }
543
+ ;
544
+
545
+ VariableDeclarationNoIn:
546
+ IDENT { result = VarDeclNode.new(val[0],nil) }
547
+ | IDENT InitializerNoIn { result = VarDeclNode.new(val[0], val[1]) }
548
+ ;
549
+
550
+ ConstStatement:
551
+ CONST ConstDeclarationList ';' {
552
+ result = ConstStatementNode.new(val[1])
553
+ debug(result)
554
+ }
555
+ | CONST ConstDeclarationList error {
556
+ result = ConstStatementNode.new(val[1])
557
+ debug(result)
558
+ yyerror unless allow_auto_semi?(val.last)
559
+ }
560
+ ;
561
+
562
+ ConstDeclarationList:
563
+ ConstDeclaration { result = val }
564
+ | ConstDeclarationList ',' ConstDeclaration {
565
+ result = [val.first, val.last].flatten
566
+ }
567
+ ;
568
+
569
+ ConstDeclaration:
570
+ IDENT { result = VarDeclNode.new(val[0], nil, true) }
571
+ | IDENT Initializer { result = VarDeclNode.new(val[0], val[1], true) }
572
+ ;
573
+
574
+ Initializer:
575
+ '=' AssignmentExpr { result = AssignExprNode.new(val[1]) }
576
+ ;
577
+
578
+ InitializerNoIn:
579
+ '=' AssignmentExprNoIn { result = AssignExprNode.new(val[1]) }
580
+ ;
581
+
582
+ EmptyStatement:
583
+ ';' { result = EmptyStatementNode.new(val[0]) }
584
+ ;
585
+
586
+ ExprStatement:
587
+ ExprNoBF ';' {
588
+ result = ExpressionStatementNode.new(val.first)
589
+ debug(result)
590
+ }
591
+ | ExprNoBF error {
592
+ result = ExpressionStatementNode.new(val.first)
593
+ debug(result)
594
+ raise RKelly::SyntaxError unless allow_auto_semi?(val.last)
595
+ }
596
+ ;
597
+
598
+ IfStatement:
599
+ IF '(' Expr ')' Statement =IF_WITHOUT_ELSE {
600
+ result = IfNode.new(val[2], val[4])
601
+ debug(result)
602
+ }
603
+ | IF '(' Expr ')' Statement ELSE Statement {
604
+ result = IfNode.new(val[2], val[4], val[6])
605
+ debug(result)
606
+ }
607
+ ;
608
+
609
+ IterationStatement:
610
+ DO Statement WHILE '(' Expr ')' ';' {
611
+ result = DoWhileNode.new(val[1], val[4])
612
+ debug(result)
613
+ }
614
+ | DO Statement WHILE '(' Expr ')' error {
615
+ result = DoWhileNode.new(val[1], val[4])
616
+ debug(result)
617
+ } /* Always performs automatic semicolon insertion. */
618
+ | WHILE '(' Expr ')' Statement {
619
+ result = WhileNode.new(val[2], val[4])
620
+ debug(result)
621
+ }
622
+ | FOR '(' ExprNoInOpt ';' ExprOpt ';' ExprOpt ')' Statement {
623
+ result = ForNode.new(val[2], val[4], val[6], val[8])
624
+ debug(result)
625
+ }
626
+ | FOR '(' VAR VariableDeclarationListNoIn ';' ExprOpt ';' ExprOpt ')' Statement
627
+ {
628
+ result = ForNode.new(VarStatementNode.new(val[3]), val[5], val[7], val[9])
629
+ debug(result)
630
+ }
631
+ | FOR '(' LeftHandSideExpr IN Expr ')' Statement {
632
+ #yyabort if (!n.isLocation())
633
+ result = ForInNode.new(val[2], val[4], val[6])
634
+ debug(result);
635
+ }
636
+ | FOR '(' VAR IDENT IN Expr ')' Statement {
637
+ result = ForInNode.new(
638
+ VarDeclNode.new(val[3], nil), val[5], val[7])
639
+ debug(result)
640
+ }
641
+ | FOR '(' VAR IDENT InitializerNoIn IN Expr ')' Statement {
642
+ result = ForInNode.new(
643
+ VarDeclNode.new(val[3], val[4]), val[6], val[8]
644
+ )
645
+ debug(result)
646
+ }
647
+ ;
648
+
649
+ ExprOpt:
650
+ /* nothing */ { result = nil }
651
+ | Expr
652
+ ;
653
+
654
+ ExprNoInOpt:
655
+ /* nothing */ { result = nil }
656
+ | ExprNoIn
657
+ ;
658
+
659
+ ContinueStatement:
660
+ CONTINUE ';' {
661
+ result = ContinueNode.new(nil)
662
+ debug(result)
663
+ }
664
+ | CONTINUE error {
665
+ result = ContinueNode.new(nil)
666
+ debug(result)
667
+ yyabort unless allow_auto_semi?(val[1])
668
+ }
669
+ | CONTINUE IDENT ';' {
670
+ result = ContinueNode.new(val[1])
671
+ debug(result)
672
+ }
673
+ | CONTINUE IDENT error {
674
+ result = ContinueNode.new(val[1])
675
+ debug(result)
676
+ yyabort unless allow_auto_semi?(val[2])
677
+ }
678
+ ;
679
+
680
+ BreakStatement:
681
+ BREAK ';' {
682
+ result = BreakNode.new(nil)
683
+ debug(result)
684
+ }
685
+ | BREAK error {
686
+ result = BreakNode.new(nil)
687
+ debug(result)
688
+ yyabort unless allow_auto_semi?(val[1])
689
+ }
690
+ | BREAK IDENT ';' {
691
+ result = BreakNode.new(val[1])
692
+ debug(result)
693
+ }
694
+ | BREAK IDENT error {
695
+ result = BreakNode.new(val[1])
696
+ debug(result)
697
+ yyabort unless allow_auto_semi?(val[2])
698
+ }
699
+ ;
700
+
701
+ ReturnStatement:
702
+ RETURN ';' {
703
+ result = ReturnNode.new(nil)
704
+ debug(result)
705
+ }
706
+ | RETURN error {
707
+ result = ReturnNode.new(nil)
708
+ debug(result)
709
+ yyabort unless allow_auto_semi?(val[1])
710
+ }
711
+ | RETURN Expr ';' {
712
+ result = ReturnNode.new(val[1])
713
+ debug(result)
714
+ }
715
+ | RETURN Expr error {
716
+ result = ReturnNode.new(val[1])
717
+ debug(result)
718
+ yyabort unless allow_auto_semi?(val[2])
719
+ }
720
+ ;
721
+
722
+ WithStatement:
723
+ WITH '(' Expr ')' Statement {
724
+ result = WithNode.new(val[2], val[4])
725
+ debug(result)
726
+ }
727
+ ;
728
+
729
+ SwitchStatement:
730
+ SWITCH '(' Expr ')' CaseBlock {
731
+ result = SwitchNode.new(val[2], val[4])
732
+ debug(result)
733
+ }
734
+ ;
735
+
736
+ CaseBlock:
737
+ '{' CaseClausesOpt '}' { result = CaseBlockNode.new(val[1]) }
738
+ | '{' CaseClausesOpt DefaultClause CaseClausesOpt '}' {
739
+ result = CaseBlockNode.new([val[1], val[2], val[3]].flatten)
740
+ }
741
+ ;
742
+
743
+ CaseClausesOpt:
744
+ /* nothing */ { result = [] }
745
+ | CaseClauses
746
+ ;
747
+
748
+ CaseClauses:
749
+ CaseClause { result = val }
750
+ | CaseClauses CaseClause { result = val.flatten }
751
+ ;
752
+
753
+ CaseClause:
754
+ CASE Expr ':' SourceElements {
755
+ result = CaseClauseNode.new(val[1], val[3])
756
+ }
757
+ ;
758
+
759
+ DefaultClause:
760
+ DEFAULT ':' SourceElements {
761
+ result = CaseClauseNode.new(nil, val[2])
762
+ }
763
+ ;
764
+
765
+ LabelledStatement:
766
+ IDENT ':' Statement { result = LabelNode.new(val[0], val[2]) }
767
+ ;
768
+
769
+ ThrowStatement:
770
+ THROW Expr ';' {
771
+ result = ThrowNode.new(val[1])
772
+ debug(result)
773
+ }
774
+ | THROW Expr error {
775
+ result = ThrowNode.new(val[1])
776
+ debug(result)
777
+ yyabort unless allow_auto_semi?(val[2])
778
+ }
779
+ ;
780
+
781
+ TryStatement:
782
+ TRY Block FINALLY Block {
783
+ result = TryNode.new(val[1], nil, nil, val[3])
784
+ debug(result)
785
+ }
786
+ | TRY Block CATCH '(' IDENT ')' Block {
787
+ result = TryNode.new(val[1], val[4], val[6])
788
+ debug(result)
789
+ }
790
+ | TRY Block CATCH '(' IDENT ')' Block FINALLY Block {
791
+ result = TryNode.new(val[1], val[4], val[6], val[8])
792
+ debug(result)
793
+ }
794
+ ;
795
+
796
+ DebuggerStatement:
797
+ DEBUGGER ';' {
798
+ result = EmptyStatementNode.new(val[0])
799
+ debug(result)
800
+ }
801
+ | DEBUGGER error {
802
+ result = EmptyStatementNode.new(val[0])
803
+ debug(result)
804
+ yyabort unless allow_auto_semi?(val[1])
805
+ }
806
+ ;
807
+
808
+ FunctionDeclaration:
809
+ FUNCTION IDENT '(' ')' '{' FunctionBody '}' {
810
+ result = FunctionDeclNode.new(val[1], val[5])
811
+ debug(val[5])
812
+ }
813
+ | FUNCTION IDENT '(' FormalParameterList ')' '{' FunctionBody '}' {
814
+ result = FunctionDeclNode.new(val[1], val[6], val[3])
815
+ debug(val[6])
816
+ }
817
+ ;
818
+
819
+ FunctionExpr:
820
+ FUNCTION '(' ')' '{' FunctionBody '}' {
821
+ result = FunctionExprNode.new(val[0], val[4])
822
+ debug(val[4])
823
+ }
824
+ | FUNCTION '(' FormalParameterList ')' '{' FunctionBody '}' {
825
+ result = FunctionExprNode.new(val[0], val[5], val[2])
826
+ debug(val[5])
827
+ }
828
+ | FUNCTION IDENT '(' ')' '{' FunctionBody '}' {
829
+ result = FunctionExprNode.new(val[1], val[5])
830
+ debug(val[5])
831
+ }
832
+ | FUNCTION IDENT '(' FormalParameterList ')' '{' FunctionBody '}' {
833
+ result = FunctionExprNode.new(val[1], val[6], val[3])
834
+ debug(val[6])
835
+ }
836
+ ;
837
+
838
+ FormalParameterList:
839
+ IDENT { result = [ParameterNode.new(val[0])] }
840
+ | FormalParameterList ',' IDENT {
841
+ result = [val.first, ParameterNode.new(val.last)].flatten
842
+ }
843
+ ;
844
+
845
+ FunctionBody:
846
+ SourceElements { result = FunctionBodyNode.new(val[0]) }
847
+ ;
848
+ end
849
+
850
+ ---- header
851
+ require "rkelly/nodes"
852
+
853
+ ---- inner
854
+ include RKelly::Nodes
855
+
856
+ def allow_auto_semi?(error_token)
857
+ error_token == false || error_token == '}' || @terminator
858
+ end
859
+
860
+ def property_class_for(ident)
861
+ case ident
862
+ when 'get'
863
+ GetterPropertyNode
864
+ when 'set'
865
+ SetterPropertyNode
866
+ end
867
+ end
868
+
869
+ def debug(*args)
870
+ logger.debug(*args) if logger
871
+ end