opal 0.3.2 → 0.3.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (203) hide show
  1. data/README.md +85 -127
  2. data/bin/opal +3 -3
  3. data/lib/core.rb +114 -0
  4. data/{gems/core/lib → lib}/core/array.rb +68 -187
  5. data/{gems/core/lib → lib}/core/basic_object.rb +22 -5
  6. data/lib/core/class.rb +38 -0
  7. data/{gems/core/lib → lib}/core/dir.rb +1 -1
  8. data/lib/core/enumerable.rb +33 -0
  9. data/{gems/core/lib → lib}/core/error.rb +1 -4
  10. data/{gems/core/lib → lib}/core/false_class.rb +0 -0
  11. data/{gems/core/lib → lib}/core/file.rb +11 -3
  12. data/{gems/core/lib → lib}/core/hash.rb +12 -0
  13. data/{gems/core/lib → lib}/core/kernel.rb +114 -86
  14. data/lib/core/match_data.rb +33 -0
  15. data/lib/core/module.rb +97 -0
  16. data/{gems/core/lib → lib}/core/nil_class.rb +0 -0
  17. data/{gems/core/lib → lib}/core/numeric.rb +5 -0
  18. data/{gems/core/lib → lib}/core/object.rb +0 -0
  19. data/{gems/core/lib → lib}/core/proc.rb +13 -3
  20. data/{gems/core/lib → lib}/core/range.rb +10 -0
  21. data/{gems/core/lib → lib}/core/regexp.rb +33 -1
  22. data/{gems/core/lib → lib}/core/string.rb +25 -10
  23. data/{gems/core/lib → lib}/core/symbol.rb +3 -3
  24. data/{gems/core/lib → lib}/core/top_self.rb +0 -0
  25. data/{gems/core/lib → lib}/core/true_class.rb +0 -0
  26. data/lib/dev.rb +169 -0
  27. data/{gems/ospec/lib → lib}/ospec.rb +1 -0
  28. data/lib/ospec/autorun.rb +8 -0
  29. data/{gems/ospec/lib → lib}/ospec/dsl.rb +2 -2
  30. data/{gems/ospec/lib → lib}/ospec/example.rb +0 -0
  31. data/{gems/ospec/lib → lib}/ospec/example/before_and_after_hooks.rb +0 -0
  32. data/{gems/ospec/lib → lib}/ospec/example/errors.rb +0 -0
  33. data/{gems/ospec/lib → lib}/ospec/example/example_group.rb +0 -0
  34. data/{gems/ospec/lib → lib}/ospec/example/example_group_factory.rb +0 -3
  35. data/{gems/ospec/lib → lib}/ospec/example/example_group_hierarchy.rb +4 -3
  36. data/{gems/ospec/lib → lib}/ospec/example/example_group_methods.rb +1 -1
  37. data/{gems/ospec/lib → lib}/ospec/example/example_group_proxy.rb +3 -2
  38. data/{gems/ospec/lib → lib}/ospec/example/example_methods.rb +1 -1
  39. data/{gems/ospec/lib → lib}/ospec/example/example_proxy.rb +7 -7
  40. data/{gems/ospec/lib → lib}/ospec/expectations.rb +0 -0
  41. data/{gems/ospec/lib → lib}/ospec/expectations/errors.rb +0 -0
  42. data/{gems/ospec/lib → lib}/ospec/expectations/fail_with.rb +4 -3
  43. data/{gems/ospec/lib → lib}/ospec/expectations/handler.rb +6 -0
  44. data/lib/ospec/helpers/scratch.rb +18 -0
  45. data/{gems/ospec/lib → lib}/ospec/matchers.rb +2 -2
  46. data/{gems/ospec/lib → lib}/ospec/matchers/be.rb +0 -0
  47. data/{gems/ospec/lib → lib}/ospec/matchers/generated_descriptions.rb +0 -0
  48. data/{gems/ospec/lib → lib}/ospec/matchers/operator_matcher.rb +2 -0
  49. data/lib/ospec/matchers/raise_error.rb +38 -0
  50. data/lib/ospec/runner.rb +90 -0
  51. data/{gems/ospec/lib → lib}/ospec/runner/example_group_runner.rb +10 -13
  52. data/lib/ospec/runner/formatter/html_formatter.rb +139 -0
  53. data/{gems/ospec/lib → lib}/ospec/runner/formatter/terminal_formatter.rb +0 -0
  54. data/{gems/ospec/lib → lib}/ospec/runner/options.rb +1 -3
  55. data/{gems/ospec/lib → lib}/ospec/runner/reporter.rb +0 -9
  56. data/lib/racc/parser.rb +165 -0
  57. data/lib/strscan.rb +52 -0
  58. data/{lib → opal_lib}/opal.rb +2 -0
  59. data/opal_lib/opal/build_methods.rb +51 -0
  60. data/opal_lib/opal/builder.rb +164 -0
  61. data/opal_lib/opal/bundle.rb +70 -0
  62. data/opal_lib/opal/command.rb +68 -0
  63. data/{lib → opal_lib}/opal/context.rb +21 -9
  64. data/{lib → opal_lib}/opal/context/console.rb +0 -2
  65. data/opal_lib/opal/context/file_system.rb +34 -0
  66. data/{lib → opal_lib}/opal/context/loader.rb +26 -8
  67. data/opal_lib/opal/gem.rb +84 -0
  68. data/{lib → opal_lib}/opal/rake/builder_task.rb +2 -2
  69. data/opal_lib/opal/rake/spec_task.rb +32 -0
  70. data/{lib → opal_lib}/opal/ruby/nodes.rb +730 -109
  71. data/{lib → opal_lib}/opal/ruby/parser.rb +90 -23
  72. data/opal_lib/opal/ruby/ruby_parser.rb +4862 -0
  73. data/opal_lib/opal/ruby/ruby_parser.y +1454 -0
  74. data/opal_lib/opal/version.rb +4 -0
  75. data/runtime/class.js +359 -0
  76. data/runtime/debug.js +84 -0
  77. data/runtime/fs.js +199 -0
  78. data/runtime/init.js +558 -0
  79. data/runtime/loader.js +351 -0
  80. data/runtime/module.js +109 -0
  81. data/runtime/post.js +10 -0
  82. data/runtime/pre.js +7 -0
  83. data/runtime/runtime.js +351 -0
  84. metadata +88 -175
  85. data/.gitignore +0 -7
  86. data/Changelog +0 -31
  87. data/LICENSE +0 -75
  88. data/Rakefile +0 -86
  89. data/gems/core/README.md +0 -14
  90. data/gems/core/Rakefile +0 -8
  91. data/gems/core/core.gemspec +0 -13
  92. data/gems/core/lib/core.rb +0 -34
  93. data/gems/core/lib/core/class.rb +0 -31
  94. data/gems/core/lib/core/module.rb +0 -100
  95. data/gems/core/lib/core/vm.rb +0 -16
  96. data/gems/core/spec/core/array/append_spec.rb +0 -30
  97. data/gems/core/spec/core/array/assoc_spec.rb +0 -29
  98. data/gems/core/spec/core/array/at_spec.rb +0 -37
  99. data/gems/core/spec/core/array/clear_spec.rb +0 -22
  100. data/gems/core/spec/core/array/collect_bang_spec.rb +0 -27
  101. data/gems/core/spec/core/array/collect_spec.rb +0 -27
  102. data/gems/core/spec/core/array/compact_spec.rb +0 -41
  103. data/gems/core/spec/core/array/concat_spec.rb +0 -15
  104. data/gems/core/spec/core/array/constructor_spec.rb +0 -14
  105. data/gems/core/spec/core/array/each_spec.rb +0 -9
  106. data/gems/core/spec/core/array/element_reference_spec.rb +0 -4
  107. data/gems/core/spec/core/array/first_spec.rb +0 -35
  108. data/gems/core/spec/core/array/include_spec.rb +0 -9
  109. data/gems/core/spec/core/array/join_spec.rb +0 -6
  110. data/gems/core/spec/core/array/last_spec.rb +0 -51
  111. data/gems/core/spec/core/array/length_spec.rb +0 -6
  112. data/gems/core/spec/core/array/map_spec.rb +0 -33
  113. data/gems/core/spec/core/array/reverse_spec.rb +0 -6
  114. data/gems/core/spec/core/builtin_constants/builtin_constants_spec.rb +0 -7
  115. data/gems/core/spec/core/false/and_spec.rb +0 -10
  116. data/gems/core/spec/core/false/inspect_spec.rb +0 -6
  117. data/gems/core/spec/core/false/or_spec.rb +0 -10
  118. data/gems/core/spec/core/false/to_s_spec.rb +0 -6
  119. data/gems/core/spec/core/false/xor_spec.rb +0 -10
  120. data/gems/core/spec/core/file/join_spec.rb +0 -19
  121. data/gems/core/spec/core/hash/assoc_spec.rb +0 -32
  122. data/gems/core/spec/core/kernel/instance_eval_spec.rb +0 -0
  123. data/gems/core/spec/core/kernel/loop_spec.rb +0 -24
  124. data/gems/core/spec/core/kernel/raise_spec.rb +0 -0
  125. data/gems/core/spec/core/module/attr_accessor_spec.rb +0 -28
  126. data/gems/core/spec/core/number/lt_spec.rb +0 -12
  127. data/gems/core/spec/core/string/sub_spec.rb +0 -24
  128. data/gems/core/spec/core/true/and_spec.rb +0 -10
  129. data/gems/core/spec/core/true/inspect_spec.rb +0 -6
  130. data/gems/core/spec/core/true/or_spec.rb +0 -10
  131. data/gems/core/spec/core/true/to_s_spec.rb +0 -6
  132. data/gems/core/spec/core/true/xor_spec.rb +0 -10
  133. data/gems/core/spec/language/and_spec.rb +0 -61
  134. data/gems/core/spec/language/array_spec.rb +0 -68
  135. data/gems/core/spec/language/block_spec.rb +0 -38
  136. data/gems/core/spec/language/break_spec.rb +0 -36
  137. data/gems/core/spec/language/case_spec.rb +0 -103
  138. data/gems/core/spec/language/def_spec.rb +0 -21
  139. data/gems/core/spec/language/eigenclass_spec.rb +0 -60
  140. data/gems/core/spec/language/file_spec.rb +0 -13
  141. data/gems/core/spec/language/fixtures/block.rb +0 -21
  142. data/gems/core/spec/language/fixtures/super.rb +0 -293
  143. data/gems/core/spec/language/hash_spec.rb +0 -29
  144. data/gems/core/spec/language/if_spec.rb +0 -54
  145. data/gems/core/spec/language/loop_spec.rb +0 -11
  146. data/gems/core/spec/language/metaclass_spec.rb +0 -21
  147. data/gems/core/spec/language/method_spec.rb +0 -124
  148. data/gems/core/spec/language/next_spec.rb +0 -25
  149. data/gems/core/spec/language/or_spec.rb +0 -34
  150. data/gems/core/spec/language/redo_spec.rb +0 -24
  151. data/gems/core/spec/language/regexp_spec.rb +0 -26
  152. data/gems/core/spec/language/rescue_spec.rb +0 -20
  153. data/gems/core/spec/language/return_spec.rb +0 -47
  154. data/gems/core/spec/language/string_spec.rb +0 -25
  155. data/gems/core/spec/language/super_spec.rb +0 -32
  156. data/gems/core/spec/language/until_spec.rb +0 -157
  157. data/gems/core/spec/language/variables_spec.rb +0 -155
  158. data/gems/core/spec/language/while_spec.rb +0 -163
  159. data/gems/core/spec/spec_helper.rb +0 -5
  160. data/gems/core_fs/README.md +0 -19
  161. data/gems/dev/Rakefile +0 -5
  162. data/gems/dev/lib/dev.js +0 -99
  163. data/gems/dev/lib/dev/generator.js +0 -1264
  164. data/gems/dev/lib/dev/parser.js +0 -979
  165. data/gems/dev/lib/dev/ruby_parser.js +0 -1088
  166. data/gems/dev/lib/dev/ruby_parser.y +0 -1267
  167. data/gems/dev/lib/dev/string_scanner.js +0 -38
  168. data/gems/dev/tools/racc2js/README.md +0 -39
  169. data/gems/dev/tools/racc2js/math_parser.js +0 -222
  170. data/gems/dev/tools/racc2js/math_parser.rb +0 -133
  171. data/gems/dev/tools/racc2js/math_parser.y +0 -28
  172. data/gems/dev/tools/racc2js/parser.js +0 -218
  173. data/gems/dev/tools/racc2js/racc2js.rb +0 -153
  174. data/gems/json/README.md +0 -4
  175. data/gems/json/json.gemspec +0 -14
  176. data/gems/json/lib/json.rb +0 -64
  177. data/gems/json/lib/json/ext.rb +0 -51
  178. data/gems/json/lib/json/json2.js +0 -481
  179. data/gems/ospec/README.md +0 -0
  180. data/gems/ospec/lib/ospec/autorun.rb +0 -3
  181. data/gems/ospec/lib/ospec/runner.rb +0 -40
  182. data/gems/ospec/lib/ospec/runner/formatter/html_formatter.rb +0 -91
  183. data/gems/ospec/ospec.gemspec +0 -0
  184. data/gems/rquery/README.md +0 -9
  185. data/gems/rquery/lib/rquery.rb +0 -10
  186. data/gems/rquery/lib/rquery/ajax.rb +0 -4
  187. data/gems/rquery/lib/rquery/css.rb +0 -96
  188. data/gems/rquery/lib/rquery/document.rb +0 -25
  189. data/gems/rquery/lib/rquery/element.rb +0 -292
  190. data/gems/rquery/lib/rquery/event.rb +0 -108
  191. data/gems/rquery/lib/rquery/jquery.js +0 -8177
  192. data/gems/rquery/lib/rquery/request.rb +0 -138
  193. data/gems/rquery/lib/rquery/response.rb +0 -49
  194. data/gems/rquery/rquery.gemspec +0 -16
  195. data/lib/opal.js +0 -1597
  196. data/lib/opal/builder.rb +0 -117
  197. data/lib/opal/bundle.rb +0 -131
  198. data/lib/opal/command.rb +0 -11
  199. data/lib/opal/context/file_system.rb +0 -19
  200. data/lib/opal/gem.rb +0 -153
  201. data/lib/opal/ruby/ruby_parser.rb +0 -5170
  202. data/lib/opal/ruby/ruby_parser.y +0 -1298
  203. data/opal.gemspec +0 -15
@@ -1,979 +0,0 @@
1
- // if (typeof require !== 'undefined') {
2
- // var RubyParser = require('./ruby_parser').RubyParser,
3
- // // Lexer = require('./lexer').Lexer,
4
- // StringScanner = require('./string_scanner').StringScanner;
5
- // } else {
6
- // // var RubyParser = parser;
7
- // }
8
-
9
- var RubyParser = require('opal_dev/ruby_parser').RubyParser;
10
- var StringScanner = require('opal_dev/string_scanner').StringScanner;
11
- var RubyGenerator = require('opal_dev/generator');
12
-
13
- for (var prop in RubyGenerator) {
14
- if (RubyGenerator.hasOwnProperty(prop)) {
15
- // console.log("adding prop " + prop);
16
- RubyParser.prototype[prop] = RubyGenerator[prop];
17
- }
18
- }
19
-
20
- exports.compile = function(source) {
21
- var nodes = exports.RubyParser.parse(source);
22
- // print('nodes are:');
23
- // print(nodes);
24
- // print('generating:');
25
- // var g = new RubyGenerator(nodes, {});
26
- // var res = g.generate_main_context();
27
- // var res = RubyGenerator.generate_main_context(nodes, {});
28
- var res = nodes.generateTop();
29
- // print("GOT RESULT");
30
- // print(res[0]);
31
- // print('WOWOWOWOWOWOWOW');
32
- return res;
33
- };
34
-
35
- var EXPR_BEG = 0, EXPR_END = 1, EXPR_ENDARG = 2, EXPR_ARG = 3,
36
- EXPR_CMDARG = 4, EXPR_MID = 5, EXPR_FNAME = 6, EXPR_DOT = 7,
37
- EXPR_CLASS = 8, EXPR_VALUE = 9;
38
-
39
- RubyParser.prototype.parse = function(source) {
40
- // print('1. Lexing...');
41
- var token;
42
-
43
- this._string = source;
44
- this._scanner = new StringScanner(source);
45
- this.lex_state = EXPR_BEG;
46
- this._tokens = [];
47
- this._string_parse_stack = [];
48
- this._line_number = 1;
49
-
50
- // cond stack
51
- this._cond = 0;
52
- // cmd arg stack
53
- this._cmdarg = 0;
54
-
55
- // while ((token = this.next_token()) && token[0] !== false) {
56
- // token[2] = this._line_number;
57
- // this._tokens.push(token);
58
- // }
59
-
60
- // console.log("## Pre Optimize:\n");
61
- // for (var i = 0; i < this._tokens.length; i++) {
62
- // console.log(this._tokens[i]);
63
- // }
64
- //
65
- // this._tokens = new Optimizer(this._tokens).optimize();
66
- // console.log("\n## Post Optimize:\n")
67
- // for (var i = 0; i < this._tokens.length; i++) {
68
- // console.log(this._tokens[i]);
69
- // }
70
- // console.log("\n");
71
- // return this._tokens;
72
- // print('parsing some codeeeeez');
73
-
74
- // print('1. lexing');
75
- // this._lexer = new Lexer();
76
- // this._tokens = this._lexer.tokenize(source + '\n');
77
- // add [false, false] to singnify EOF
78
- // this._tokens.push([false, false]);
79
- // print(this._tokens);
80
-
81
- // console.log('2. parsing');
82
- try {
83
- var result = this.do_parse();
84
- // console.log(result);
85
- return result;
86
- } catch (e) {
87
- e.message += " on line: " + this._line_number;
88
- throw e;
89
- }
90
- };
91
-
92
- // Tokens are fed into the parser as an array. The 0 index is the token type,
93
- // and the index 1 is an object, with the line number the token was found on,
94
- // and the value. e.g.
95
- //
96
- // ['IDENTIFIER', { value: 'wow', line: 1 }]
97
- //
98
- RubyParser.prototype.next_token = function() {
99
- var token = this.get_next_token();
100
- // console.log('[' + token.join(', ') + '] - ' + this._line_number);
101
- token[1] = { value: token[1], line: this._line_number };
102
- return token;
103
- };
104
-
105
- RubyParser.prototype.cond_push = function(n) {
106
- // print('cond_push ' + n);
107
- return this._cond = (this._cond << 1) | ((n) & 1);
108
- };
109
-
110
- RubyParser.prototype.cond_pop = function() {
111
- // print('cond_pop');
112
- return this._cond = this._cond >> 1;
113
- };
114
-
115
- RubyParser.prototype.cond_lexpop = function() {
116
- // print('cond_lexpop');
117
- return this._cond = (this._cond >> 1) | (this._cond & 1);
118
- };
119
-
120
- RubyParser.prototype.cond_p = function() {
121
- // print('cond_p');
122
- return this._cond & 1;
123
- };
124
-
125
- RubyParser.prototype.cmdarg_push = function(n) {
126
- // print('cmdarg_push ' + n);
127
- return this._cmdarg = (this._cmdarg << 1) | ((n) & 1);
128
- };
129
-
130
- RubyParser.prototype.cmdarg_pop = function() {
131
- // print('cmdarg_pop');
132
- return this._cmdarg = this._cmdarg >> 1;
133
- };
134
-
135
- RubyParser.prototype.cmdarg_lexpop = function() {
136
- // print('cmdarg_lexpop');
137
- return this._cmdarg = (this._cmdarg >> 1) | (this._cmdarg & 1);
138
- };
139
-
140
- RubyParser.prototype.cmdarg_p = function() {
141
- // print('cmdarg_p');
142
- return this._cmdarg & 1;
143
- };
144
-
145
- RubyParser.prototype.current_string_parse = function() {
146
- if (this._string_parse_stack.length == 0) return null;
147
- return this._string_parse_stack[this._string_parse_stack.length - 1];
148
- };
149
-
150
- RubyParser.prototype.push_string_parse = function(o) {
151
- this._string_parse_stack.push(o);
152
- };
153
-
154
- RubyParser.prototype.pop_string_parse = function() {
155
- this._string_parse_stack.pop();
156
- };
157
-
158
- RubyParser.prototype.next_string_token = function() {
159
- var str_parse = this.current_string_parse(), scanner = this._scanner;
160
-
161
- // everything bar single quote and lower case barewords can interpolate
162
- var interpolate = (str_parse.beg !== "'" && str_parse.beg !== '%w');
163
-
164
- // see if we can read end of string/xstring/regexp markers
165
- if (scanner.scan( new RegExp('^\\' + str_parse.end))) {
166
- this.pop_string_parse();
167
- if (str_parse.beg == '"' || str_parse.beg == "'") {
168
- this.lex_state = EXPR_END;
169
- return ['STRING_END', scanner.matched];
170
- }
171
- else if (str_parse.beg == '`') {
172
- // assume to be xstring
173
- this.lex_state = EXPR_END;
174
- return ['STRING_END', scanner.matched];
175
- }
176
- else if (str_parse.beg == '/') {
177
- var result = "";
178
- if (scanner.scan(/^\w+/)) {
179
- result = scanner.matched;
180
- }
181
- this.lex_state = EXPR_END;
182
- return ['REGEXP_END', result];
183
- }
184
- else { // words?
185
- this.lex_state = EXPR_END;
186
- return ['STRING_END', scanner.matched];
187
- }
188
- }
189
-
190
- // not end of string, so we must be parsing contents
191
- var str_buffer = [];
192
-
193
- if (scanner.scan(/^#(\$|\@)\w+/)) {
194
- if (interpolate) {
195
- return ['STRING_DVAR', scanner.matched.substr(2)];
196
- }
197
- else {
198
- str_buffer.push(scanner.matched);
199
- }
200
- }
201
- else if (scanner.scan(/^#\{/)) {
202
- if (interpolate) {
203
- // we are into ruby code, so stop parsing content (for the moment)
204
- str_parse.content = false;
205
- return ['STRING_DBEG', scanner.matched];
206
- }
207
- else {
208
- str_buffer.push(scanner.matched);
209
- }
210
- }
211
- // causes error, so we will just collect it later on with other text
212
- else if (scanner.scan(/^#/)) {
213
- str_buffer.push('#');
214
- }
215
-
216
- this.add_string_content(str_buffer, str_parse);
217
- var complete_str = str_buffer.join('');
218
-
219
- return ['STRING_CONTENT', complete_str];
220
- };
221
-
222
- RubyParser.prototype.add_string_content = function(str_buffer, str_parse) {
223
- var scanner = this._scanner;
224
- // regexp for end of string/regexp
225
- var end_str_re = new RegExp('^' + str_parse.end);
226
- // can we interpolate?
227
- var interpolate = ['"', '%W', '/', '`'].indexOf(str_parse.beg) != -1;
228
-
229
- while (!scanner.eos()) {
230
- var c = null, handled = true;
231
- if (scanner.check(end_str_re)) {
232
- //throw new Error("EOS");
233
- break;
234
-
235
- } else if (interpolate && scanner.check(/^#(?=[\@\{])/)) {
236
- break;
237
-
238
- } else if (scanner.scan(/^\\\\/)) {
239
- c = scanner.matched;
240
-
241
- } else if (scanner.scan(/^\\/)) {
242
- c = scanner.matched;
243
- if (scanner.scan(end_str_re)) {
244
- c += scanner.matched;
245
- }
246
-
247
- } else {
248
- handled = false;
249
- }
250
-
251
- if (!handled) {
252
- var reg = new RegExp("^[^\\" + str_parse.end + "\#\0\\\\]+|.");
253
- scanner.scan(reg);
254
- c = scanner.matched;
255
- }
256
-
257
- c = c || scanner.matched;
258
- str_buffer.push(c);
259
- }
260
-
261
- if (scanner.eos()) {
262
- throw new Error("reached end of file when in string")
263
- }
264
- };
265
-
266
-
267
-
268
- RubyParser.prototype.get_next_token = function() {
269
- var string_scanner;
270
- if ((string_scanner = this.current_string_parse()) && string_scanner.content){
271
- return this.next_string_token();
272
- }
273
-
274
- var scanner = this._scanner,
275
- space_seen = false,
276
- c = '',
277
- cmd_start = false;
278
-
279
-
280
- while (true) {
281
- if (scanner.scan(/^(\ |\t|\r)/)) {
282
- space_seen = true;
283
- continue;
284
- }
285
- else if (scanner.scan(/^(\n|#)/)) {
286
- c = scanner.matched;
287
- if (c == '#') {
288
- scanner.scan(/^(.*)/);
289
- }
290
- else {
291
- this._line_number++;
292
- }
293
-
294
- scanner.scan(/^(\n+)/);
295
- this._line_number += scanner.matched.length;
296
-
297
- if ([EXPR_BEG, EXPR_DOT].indexOf(this.lex_state) !== -1) {
298
- continue;
299
- }
300
- cmd_start = true;
301
- this.lex_state = EXPR_BEG;
302
- return ["\\n", "\\n"];
303
- }
304
-
305
- else if (scanner.scan(/^\;/)) {
306
- this.lex_state = EXPR_BEG;
307
- return [";", ";"];
308
- }
309
-
310
- else if (scanner.scan(/^\"/)) {
311
- this.push_string_parse({ beg: '"', content: true, end:'"' });
312
- return ['STRING_BEG', scanner.matched];
313
- }
314
- else if (scanner.scan(/^\'/)) {
315
- this.push_string_parse({ beg: "'", content: true, end:"'" });
316
- return ['STRING_BEG', scanner.matched];
317
- }
318
- else if (scanner.scan(/^\`/)) {
319
- this.push_string_parse({ beg: "`", content: true, end: "`" });
320
- return ["XSTRING_BEG", scanner.matched];
321
- }
322
- else if (scanner.scan(/^\%[Ww]/)) {
323
- var start_word = scanner.scan(/^./),
324
- end_word = { '(': ')', '[': ']', '{': '}'}[start_word],
325
- end_word = end_word || start_word;
326
-
327
- this.push_string_parse({ beg: start_word, content: true, end: end_word });
328
- return ["WORDS_BEG", scanner.matched];
329
- }
330
- else if (scanner.scan(/^\%[Qq]/)) {
331
- var start_word = scanner.scan(/^./),
332
- end_word = { '(': ')', '[': ']', '{': '}'}[start_word],
333
- end_word = end_word || start_word;
334
-
335
- this.push_string_parse({ beg: start_word, content: true, end: end_word });
336
- return ["STRING_BEG", scanner.matched];
337
- }
338
- else if (scanner.scan(/^\%[Rr]/)) {
339
- var start_word = scanner.scan(/^./),
340
- end_word = { '(': ')', '{': '}', '[': ']' }[start_word],
341
- end_word = end_word || start_word;
342
-
343
- this.push_string_parse({ beg: '/', content: true, end: end_word });
344
- return ['REGEXP_BEG', scanner.matched];
345
- }
346
-
347
- else if (scanner.scan(/^\//)) {
348
- if (this.lex_state == EXPR_BEG || this.lex_state == EXPR_MID) {
349
- this.push_string_parse({ beg: "/", content: true, end: "/" });
350
- return ["REGEXP_BEG", scanner.matched];
351
- }
352
- else if (scanner.scan(/^\=/)) {
353
- this.lex_state = EXPR_BEG;
354
- return ["OP_ASGN", "/"];
355
- }
356
- else if (this.lex_state == EXPR_FNAME) {
357
- this.lex_state = EXPR_END;
358
- }
359
- return ["/", '/'];
360
- }
361
-
362
- else if (scanner.scan(/^\%/)) {
363
- // if (scanner.scan(/^\=/)) {
364
- // this.lex_state = EXPR_BEG;
365
- // return ["OP_ASGN", "%"];
366
- // }
367
- if (this.lex_state == EXPR_FNAME) {
368
- this.lex_state = EXPR_END;
369
- }
370
- else {
371
- this.lex_state = EXPR_BEG;
372
- }
373
- return ["%", '%'];
374
- }
375
-
376
- else if (scanner.scan(/^\(/)) {
377
- var result = '(';
378
- if (this.lex_state == EXPR_BEG || this.lex_state == EXPR_MID) {
379
- result = 'PAREN_BEG';
380
- }
381
- else if (space_seen) {
382
- result = '(';
383
- }
384
- this.lex_state = EXPR_BEG;
385
- this.cond_push(0);
386
- this.cmdarg_push(0);
387
- return [result, scanner.matched];
388
- }
389
-
390
- else if (scanner.scan(/^\)/)) {
391
- this.cond_lexpop();
392
- this.cmdarg_lexpop();
393
- this.lex_state = EXPR_END;
394
- return [")", scanner.matched];
395
- }
396
-
397
- else if (scanner.scan(/^\[/)) {
398
- var result = scanner.matched;
399
-
400
- if (this.lex_state == EXPR_FNAME || this.lex_state == EXPR_DOT) {
401
- this.lex_state = EXPR_ARG;
402
- if (scanner.scan(/^\]\=/)) {
403
- return ["[]=", "[]="];
404
- }
405
- else if (scanner.scan(/^\]/)) {
406
- return ["[]", "[]"];
407
- }
408
- else {
409
- throw "error - unexpected '[' token"
410
- }
411
- }
412
- else if (this.lex_state == EXPR_BEG || this.lex_state == EXPR_MID || space_seen) {
413
- this.lex_state = EXPR_BEG;
414
- this.cond_push(0);
415
- this.cmdarg_push(0);
416
- return ["[", scanner.matched];
417
- }
418
- else {
419
- this.lex_state = EXPR_BEG;
420
- this.cond_push(0);
421
- this.cmdarg_push(0);
422
- return ["[@", scanner.matched];
423
- }
424
- }
425
-
426
- else if (scanner.scan(/^\]/)) {
427
- this.cond_lexpop();
428
- this.cmdarg_lexpop();
429
- this.lex_state = EXPR_END;
430
- return ["]", scanner.matched];
431
- }
432
- else if (scanner.scan(/^\}/)) {
433
- this.cond_lexpop();
434
- this.cmdarg_lexpop();
435
- this.lex_state = EXPR_END;
436
-
437
- if (this.current_string_parse()) {
438
- this.current_string_parse().content = true
439
- }
440
- // if (string_parse) string_parse.content = true;
441
- return ["}", scanner.matched];
442
- }
443
-
444
- else if (scanner.scan(/^\.\.\./)) {
445
- this.lex_state = EXPR_BEG;
446
- return ["...", scanner.matched];
447
- }
448
- else if (scanner.scan(/^\.\./)) {
449
- this.lex_state = EXPR_BEG;
450
- return ["..", scanner.matched];
451
- }
452
- else if (scanner.scan(/^\./)) {
453
- if (this.lex_state !== EXPR_FNAME) this.lex_state = EXPR_DOT;
454
- return [".", scanner.matched];
455
- }
456
-
457
- else if (scanner.scan(/^\*\*\=/)) {
458
- this.lex_state = EXPR_BEG;
459
- return ["OP_ASGN", "**"];
460
- }
461
- else if (scanner.scan(/^\*\*/)) {
462
- return ["**", "**"];
463
- }
464
- else if (scanner.scan(/^\*\=/)) {
465
- this.lex_state = EXPR_BEG;
466
- return ["OP_ASGN", "*"];
467
- }
468
- else if (scanner.scan(/^\*/)) {
469
- if (this.lex_state == EXPR_FNAME) {
470
- this.lex_state = EXPR_END;
471
- return ["*", scanner.matched];
472
- }
473
- else if (space_seen && scanner.check(/^\S/)) {
474
- this.lex_state = EXPR_BEG;
475
- return ["SPLAT", scanner.matched];
476
- }
477
- else if (this.lex_state == EXPR_BEG || this.lex_state == EXPR_MID) {
478
- this.lex_state = EXPR_BEG;
479
- return ["SPLAT", scanner.matched];
480
- }
481
- else {
482
- this.lex_state = EXPR_BEG;
483
- return ["*", scanner.matched];
484
- }
485
- }
486
-
487
- else if (scanner.scan(/^\:\:/)) {
488
- if ([EXPR_BEG, EXPR_MID, EXPR_CLASS].indexOf(this.lex_state) !== -1) {
489
- this.lex_state = EXPR_BEG;
490
- return ["::@", scanner.matched];
491
- }
492
- this.lex_state = EXPR_DOT;
493
- return ["::", scanner.matched];
494
- }
495
- else if (scanner.scan(/^\:/)) {
496
- if (this.lex_state == EXPR_END || this.lex_state == EXPR_ENDARG || scanner.check(/^\s/)) {
497
- if (!scanner.check(/^\w/)) {
498
- this.lex_state = EXPR_BEG;
499
- return [":", scanner.matched];
500
- }
501
-
502
- this.lex_state = EXPR_FNAME;
503
- return ["SYMBOL_BEG", scanner.matched];
504
- }
505
-
506
- if (scanner.scan(/^\'/)) {
507
- this.push_string_parse({ beg: "'", content: true, end: "'" });
508
- }
509
- else if (scanner.scan(/^\"/)) {
510
- this.push_string_parse({ beg: '"', content: true, end: '"' });
511
- }
512
-
513
- this.lex_state = EXPR_FNAME;
514
- return ["SYMBOL_BEG", scanner.matched];
515
- }
516
-
517
- else if (scanner.check(/^\|/)) {
518
- if (scanner.scan(/^\|\|\=/)) {
519
- this.lex_state = EXPR_BEG;
520
- return ["OP_ASGN", "||"];
521
- }
522
- else if (scanner.scan(/^\|\|/)) {
523
- this.lex_state = EXPR_BEG;
524
- return ["||", scanner.matched];
525
- }
526
- else if (scanner.scan(/^\|\=/)) {
527
- this.lex_state = EXPR_BEG;
528
- return ["OP_ASGN", "|"];
529
- }
530
- else if (scanner.scan(/^\|/)) {
531
- if (this.lex_state == EXPR_FNAME) {
532
- this.lex_state = EXPR_END;
533
- return ["|", scanner.matched];
534
- }
535
- this.lex_state = EXPR_BEG;
536
- return ["|", scanner.matched];
537
- }
538
- }
539
-
540
- else if (scanner.scan(/^\^/)) {
541
- if (this.lex_state == EXPR_FNAME) {
542
- this.lex_state = EXPR_END;
543
- return ["^", scanner.matched];
544
- }
545
- this.lex_state = EXPR_BEG;
546
- return ["^", scanner.matched];
547
- }
548
-
549
- else if (scanner.scan(/^\&\&\=/)) {
550
- this.lex_state = EXPR_BEG;
551
- return ["OP_ASGN", "&&"];
552
- }
553
- else if (scanner.scan(/^\&\&/)) {
554
- this.lex_state = EXPR_BEG;
555
- return ["&&", scanner.matched];
556
- }
557
- else if (scanner.scan(/^\&\=/)) {
558
- this.lex_state = EXPR_BEG;
559
- return ["OP_ASGN", "&"];
560
- }
561
- else if (scanner.scan(/^\&/)) {
562
- // print(this.lex_state);
563
- if (space_seen && !scanner.check(/^\s/) && this.lex_state == EXPR_CMDARG){
564
- return ["&@", scanner.matched];
565
- }
566
- else if (this.lex_state == EXPR_BEG || this.lex_state == EXPR_MID) {
567
- return ["&@", scanner.matched];
568
- }
569
- else {
570
- return ["&", scanner.matched];
571
- }
572
- }
573
-
574
- else if (scanner.scan(/^\<\<\=/)) {
575
- this.lex_state = EXPR_BEG;
576
- return ["OP_ASGN", "<<"];
577
- }
578
- else if (scanner.scan(/^\<\</)) {
579
- if (this.lex_state == EXPR_FNAME) {
580
- this.lex_state = EXPR_END;
581
- return ["<<", "<<"];
582
- }
583
- if ([EXPR_END, EXPR_DOT, EXPR_ENDARG, EXPR_CLASS].indexOf(this.lex_state) == -1 && space_seen) {
584
- this.lex_state = EXPR_BEG;
585
- return ["<<", "<<"];
586
- }
587
- this.lex_state = EXPR_BEG;
588
- return ["<<", "<<"];
589
- }
590
- else if (scanner.scan(/^\<\=\>/)) {
591
- if (this.lex_state == EXPR_FNAME) this.lex_state = EXPR_END
592
- else this.lex_state = EXPR_BEG;
593
- return ["<=>", "<=>"];
594
- }
595
- else if (scanner.scan(/^\<\=/)) {
596
- if (this.lex_state == EXPR_FNAME) this.lex_state = EXPR_END
597
- else this.lex_state = EXPR_BEG;
598
- return ["<=", "<="];
599
- }
600
- else if (scanner.scan(/^\</)) {
601
- if (this.lex_state == EXPR_FNAME) this.lex_state = EXPR_END
602
- else this.lex_state = EXPR_BEG;
603
- return ["<", "<"];
604
- }
605
-
606
- else if (scanner.scan(/^\>\=/)) {
607
- if (this.lex_state == EXPR_FNAME) this.lex_state = EXPR_END
608
- else this.lex_state = EXPR_BEG;
609
- return [">=", scanner.matched];
610
- }
611
- else if (scanner.scan(/^\>\>\=/)) {
612
- return ["OP_ASGN", ">>"];
613
- }
614
- else if (scanner.scan(/^\>\>/)) {
615
- return [">>", scanner.matched];
616
- }
617
- else if (scanner.scan(/^\>/)) {
618
- if (this.lex_state == EXPR_FNAME) this.lex_state = EXPR_END
619
- else this.lex_state = EXPR_BEG;
620
- return [">", ">"];
621
- }
622
-
623
- else if (scanner.scan(/^[+-]/)) {
624
- var result = scanner.matched;
625
- // var sign = (result == '+') ? 'UPLUS' : 'UMINUS';
626
- var sign = result + '@';
627
-
628
- if (this.lex_state == EXPR_BEG || this.lex_state == EXPR_MID) {
629
- this.lex_state = EXPR_BEG;
630
- return [sign, sign];
631
- }
632
- else if (this.lex_state == EXPR_FNAME) {
633
- this.lex_state = EXPR_END;
634
- if (scanner.scan(/^@/)) {
635
- return ['IDENTIFIER', result + scanner.matched];
636
- }
637
- return [result, result];
638
- }
639
-
640
- if (scanner.scan(/^\=/)) {
641
- this.lex_state = EXPR_BEG;
642
- return ["OP_ASGN", result];
643
- }
644
- this.lex_state = EXPR_BEG;
645
- return [result, result];
646
- }
647
-
648
- else if (scanner.scan(/^\?/)) {
649
- if (this.lex_state = EXPR_END || this.lex_state == EXPR_ENDARG) {
650
- this.lex_state = EXPR_BEG;
651
- }
652
- return ["?", scanner.matched];
653
- }
654
-
655
- else if (scanner.scan(/^\=\=\=/)) {
656
- if (this.lex_state == EXPR_FNAME) {
657
- this.lex_state = EXPR_END;
658
- return ["===", "==="];
659
- }
660
- this.lex_state = EXPR_BEG;
661
- return ["===", "==="];
662
- }
663
- else if (scanner.scan(/^\=\=/)) {
664
- if (this.lex_state == EXPR_FNAME) {
665
- this.lex_state = EXPR_END;
666
- return ["==", "=="];
667
- }
668
- this.lex_state = EXPR_BEG;
669
- return ["==", "=="];
670
- }
671
- else if (scanner.scan(/^\=\~/)) {
672
- if (this.lex_state == EXPR_FNAME) {
673
- this.lex_state = EXPR_END;
674
- return ["=~", "=~"];
675
- }
676
- this.lex_state = EXPR_BEG;
677
- return ["=~", "=~"];
678
- }
679
- else if (scanner.scan(/^\=\>/)) {
680
- this.lex_state = EXPR_BEG;
681
- return ["=>", scanner.matched];
682
- }
683
- else if (scanner.scan(/^\=/)) {
684
- this.lex_state = EXPR_BEG;
685
- return ["=", "="];
686
- }
687
-
688
- else if (scanner.scan(/^\!\=/)) {
689
- if (this.lex_state == EXPR_FNAME) {
690
- this.lex_state = EXPR_END;
691
- return ["!=", "!="];
692
- }
693
- this.lex_state = EXPR_BEG;
694
- return ["!=", scanner.matched];
695
- }
696
- else if (scanner.scan(/^\!\~/)) {
697
- if (this.lex_state == EXPR_FNAME) {
698
- this.lex_state = EXPR_END;
699
- return ["!~", "!~"];
700
- }
701
- this.lex_state = EXPR_BEG;
702
- return ["!~", "!~"];
703
- }
704
- else if (scanner.scan(/^\!/)) {
705
- if (this.lex_state == EXPR_FNAME) {
706
- this.lex_state = EXPR_END;
707
- return ["!", "!"];
708
- }
709
- this.lex_state = EXPR_BEG;
710
- return ["!", "!"];
711
- }
712
-
713
- else if (scanner.scan(/^\~/)) {
714
- if (this.lex_state == EXPR_FNAME) {
715
- this.lex_state = EXPR_END;
716
- return ["~", "~"];
717
- }
718
- this.lex_state = EXPR_BEG;
719
- return ["~", "~"];
720
- }
721
-
722
- // FIXME: do we really need to differentiate between these. generates the
723
- // same code. our checks will be in the gvar getters (for the relative
724
- // parts..)
725
- //
726
- // else if (scanner.scan(/^\$([1-9]\d*)/)) {
727
- // this.lex_state = EXPR_END;
728
- // return ["NTH_REF", scanner.matched];
729
- // }
730
- // else if (scanner.scan(/^\$([\+\'\&\`])/)) {
731
- // this.lex_state = EXPR_END;
732
- // return ["BACK_REF", scanner.matched];
733
- // }
734
- // else if (scanner.scan(/^\$[!@\"~*$?\/\\:;=.,<>_]/)) {
735
- // this.lex_state = EXPR_END;
736
- // return ["GVAR", scanner.matched];
737
- // }
738
- else if (scanner.scan(/^\$[\+\'\`\&!@\"~*$?\/\\:;=.,<>_]/)) {
739
- this.lex_state = EXPR_END;
740
- return ["GVAR", scanner.matched];
741
- }
742
- else if (scanner.scan(/^\$\w+/)) {
743
- this.lex_state = EXPR_END;
744
- return ["GVAR", scanner.matched];
745
- }
746
- else if (scanner.scan(/^\@\@\w*/)) {
747
- this.lex_state = EXPR_END;
748
- return ["CVAR", scanner.matched];
749
- }
750
- else if (scanner.scan(/^\@\w*/)) {
751
- this.lex_state = EXPR_END;
752
- return ["IVAR", scanner.matched];
753
- }
754
-
755
- else if (scanner.scan(/^\,/)) {
756
- this.lex_state = EXPR_BEG;
757
- return [",", scanner.matched];
758
- }
759
-
760
- else if (scanner.scan(/^\{/)) {
761
- var result;
762
- // print(this.lex_state);
763
- if (this.lex_state == EXPR_END || this.lex_state == EXPR_CMDARG) {
764
- result = '{@';
765
- }
766
- else if (this.lex_state == EXPR_ENDARG) {
767
- result = 'LBRACE_ARG';
768
- }
769
- else {
770
- result = '{';
771
- }
772
-
773
- this.lex_state = EXPR_BEG;
774
- this.cond_push(0);
775
- this.cmdarg_push(0);
776
-
777
- return [result, scanner.matched];
778
- }
779
-
780
- else if (scanner.check(/^[0-9]/)) {
781
- this.lex_state = EXPR_END;
782
- if (scanner.scan(/^[\d_]+\.[\d_]+\b/)) {
783
- return ['FLOAT', scanner.matched.replace(/_/g, '')];
784
- }
785
- else if (scanner.scan(/^[\d_]+\b/)) {
786
- return ['INTEGER', scanner.matched.replace(/_/g, '')];
787
- }
788
- else if (scanner.scan(/^0(x|X)(\d|[a-f]|[A-F])+/)) {
789
- return ['INTEGER', scanner.matched.replace(/_/g, '')];
790
- }
791
- else {
792
- // console.log('unexpected number type');
793
- return [false, false];
794
- }
795
- }
796
-
797
- else if (scanner.scan(/^(\w)+[\?\!]?/)) {
798
- switch (scanner.matched) {
799
- case 'class':
800
- if (this.lex_state == EXPR_DOT) {
801
- this.lex_state = EXPR_END;
802
- return ["IDENTIFIER", scanner.matched];
803
- }
804
- this.lex_state = EXPR_CLASS;
805
- return ["CLASS", scanner.matched];
806
- case 'module':
807
- if (this.lex_state == EXPR_DOT) return ["IDENITFIER", scanner.matched];
808
- this.lex_state = EXPR_CLASS;
809
- return ["MODULE", scanner.matched];
810
- case 'def':
811
- this.lex_state = EXPR_FNAME;
812
- return ["DEF", scanner.matched];
813
- case 'end':
814
- this.lex_state = EXPR_END;
815
- return ["END", scanner.matched];
816
-
817
- case 'do':
818
- if (this.cond_p()) {
819
- this.lex_state = EXPR_BEG;
820
- return ["DO_COND", scanner.matched];
821
- }
822
- else if (this.cmdarg_p() && this.lex_state != EXPR_CMDARG) {
823
- this.lex_state = EXPR_BEG;
824
- return ["DO_BLOCK", scanner.matched];
825
- }
826
-
827
- else if (this.lex_state == EXPR_ENDARG) {
828
- return ["DO_BLOCK", scanner.matched];
829
- }
830
- else {
831
- this.lex_state = EXPR_BEG;
832
- return ["DO", scanner.matched];
833
- }
834
-
835
- // this.lex_state = EXPR_BEG;
836
- // return ["DO", scanner.matched];
837
- // }
838
- // this.lex_state = EXPR_BEG;
839
- // return ["DO_BLOCK", scanner.matched];
840
- case 'if':
841
- if (this.lex_state == EXPR_BEG) return ["IF", scanner.matched];
842
- this.lex_state = EXPR_BEG;
843
- return ["IF_MOD", scanner.matched];
844
- case 'unless':
845
- if (this.lex_state == EXPR_BEG) return ["UNLESS", scanner.matched];
846
- this.lex_state = EXPR_BEG;
847
- return ["UNLESS_MOD", scanner.matched];
848
- case 'else':
849
- return ["ELSE", scanner.matched];
850
- case 'elsif':
851
- return ["ELSIF", scanner.matched];
852
- case 'self':
853
- if (this.lex_state !== EXPR_FNAME) this.lex_state = EXPR_END;
854
- return ["SELF", scanner.matched];
855
- case 'true':
856
- this.lex_state = EXPR_END;
857
- return ["TRUE", scanner.matched];
858
- case 'false':
859
- this.lex_state = EXPR_END;
860
- return ["FALSE", scanner.matched];
861
- case 'nil':
862
- this.lex_state = EXPR_END;
863
- return ["NIL", scanner.matched];
864
- case '__LINE__':
865
- this.lex_state = EXPR_END;
866
- return ["LINE", this._line_number.toString()];
867
- case '__FILE__':
868
- this.lex_state = EXPR_END;
869
- return ["FILE", scanner.matched];
870
- case 'begin':
871
- this.lex_state = EXPR_BEG;
872
- return ["BEGIN", scanner.matched];
873
- case 'rescue':
874
- if (this.lex_state == EXPR_DOT || this.lex_state == EXPR_FNAME) return ["IDENTIFIER", scanner.matched];
875
- if (this.lex_state == EXPR_BEG) return ["RESCUE", scanner.matched];
876
- this.lex_state = EXPR_BEG;
877
- return ["RESCUE_MOD", scanner.matched];
878
- case 'ensure':
879
- this.lex_state = EXPR_BEG;
880
- return ["ENSURE", scanner.matched];
881
- case 'case':
882
- this.lex_state = EXPR_BEG;
883
- return ["CASE", scanner.matched];
884
- case 'when':
885
- this.lex_state = EXPR_BEG;
886
- return ["WHEN", scanner.matched];
887
- case 'or':
888
- this.lex_state = EXPR_BEG;
889
- return ["OR", scanner.matched];
890
- case 'and':
891
- this.lex_state = EXPR_BEG;
892
- return ["AND", scanner.matched];
893
- case 'not':
894
- this.lex_state = EXPR_BEG;
895
- return ["NOT", scanner.matched];
896
- case 'return':
897
- this.lex_state = EXPR_MID;
898
- return ["RETURN", scanner.matched];
899
- case 'next':
900
- if (this.lex_state == EXPR_DOT) return ["IDENTIFIER", scanner.matched];
901
- this.lex_state = EXPR_MID;
902
- return ["NEXT", scanner.matched];
903
- case 'break':
904
- this.lex_state = EXPR_MID;
905
- return ["BREAK", scanner.matched];
906
- case 'super':
907
- this.lex_state = EXPR_ARG;
908
- return ["SUPER", scanner.matched];
909
- case 'then':
910
- return ["THEN", scanner.matched];
911
- case 'while':
912
- if (this.lex_state == EXPR_BEG) return ["WHILE", scanner.matched];
913
- this.lex_state = EXPR_BEG;
914
- return ["WHILE_MOD", scanner.matched];
915
- case 'until':
916
- // generator determines between while and until (mod)
917
- if (this.lex_state == EXPR_BEG) return ["WHILE", scanner.matched];
918
- this.lex_state = EXPR_BEG;
919
- return ["WHILE_MOD", scanner.matched];
920
- case 'block_given?':
921
- this.lex_state = EXPR_END;
922
- return ["BLOCK_GIVEN", scanner.matched];
923
- case 'yield':
924
- this.lex_state = EXPR_ARG;
925
- return ["YIELD", scanner.matched];
926
- // case 'require':
927
- // if (this.lex_state == EXPR_DOT || this.lex_state == EXPR_FNAME) {
928
- // return ["IDENTIFIER", scanner.matched];
929
- // }
930
- // this.lex_state = EXPR_MID;
931
- // return ['REQUIRE', scanner.matched];
932
- }
933
-
934
- var matched = scanner.matched;
935
-
936
- if (scanner.peek(2) !== '::' && scanner.scan(/^\:/)) {
937
- return["LABEL", matched];
938
- }
939
-
940
- if (this.lex_state == EXPR_FNAME) {
941
- if (scanner.scan(/^=/)) {
942
- this.lex_state = EXPR_END;
943
- return ["IDENTIFIER", matched + scanner.matched];
944
- }
945
-
946
- // this.lex_state = EXPR_END;
947
- // return ["IDENTIFIER", matched];
948
- }
949
-
950
- // IDENTIFIER2, when we have identifer() .. when we dont preceed identifier
951
- // with :: or .
952
- // this makes our parser easier and removes conflicts
953
- // if (this.lex_state !== EXPR_DOT && scanner.peek(1) == '(') {
954
- // this.lex_state = EXPR_CMDARG;
955
- // return ["IDENTIFIER2", matched];
956
- // }
957
-
958
- if ([EXPR_BEG, EXPR_DOT, EXPR_MID, EXPR_ARG, EXPR_CMDARG].indexOf(this.lex_state) !== -1) {
959
- this.lex_state = EXPR_CMDARG;
960
- }
961
- else {
962
- this.lex_state = EXPR_END;
963
- }
964
-
965
- return [/^[A-Z]/.exec(matched) ? "CONSTANT" : "IDENTIFIER", matched];
966
- }
967
-
968
- else {
969
-
970
- return [false, false];
971
- }
972
-
973
- return [false, false];
974
- }
975
- };
976
-
977
-
978
-
979
- exports.RubyParser = new RubyParser();