js2 0.0.8 → 0.0.9
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/Changelog +3 -0
- data/Manifest.txt +13 -28
- data/Rakefile +19 -19
- data/bin/js2 +48 -41
- data/lib/javascript/sel_marker.js2 +3 -3
- data/lib/js2/config.rb +6 -1
- data/lib/js2/{process/file_handler.rb → file_handler.rb} +15 -19
- data/lib/js2/foo.js2.haml +3 -0
- data/lib/js2/{process/haml_engine.rb → haml_engine.rb} +1 -1
- data/lib/js2/{parser/haml.rb → haml_parser.rb} +20 -7
- data/lib/js2/js2.js +108 -0
- data/lib/js2/js2bootstrap.js2 +455 -0
- data/lib/js2/parser.rb +3542 -0
- data/lib/js2/processor.rb +14 -65
- data/lib/js2/replace.rb +106 -0
- data/lib/js2/{decorator/test.rb → sel_decorator.rb} +11 -14
- data/{meta/c_tokenizer.rl.erb → lib/js2/tokenizer.rl.erb} +155 -123
- data/lib/js2/tree.rb +340 -0
- data/lib/js2/universe.rb +101 -0
- data/lib/js2.rb +31 -77
- data/lib/tasks/js2.rake +1 -1
- metadata +15 -29
- data/lib/js2/ast/class_node.rb +0 -105
- data/lib/js2/ast/comment_node.rb +0 -2
- data/lib/js2/ast/haml_node.rb +0 -22
- data/lib/js2/ast/include_node.rb +0 -11
- data/lib/js2/ast/inherited_node.rb +0 -7
- data/lib/js2/ast/member_node.rb +0 -18
- data/lib/js2/ast/method_node.rb +0 -29
- data/lib/js2/ast/module_node.rb +0 -6
- data/lib/js2/ast/node.rb +0 -14
- data/lib/js2/ast/nodes.rb +0 -123
- data/lib/js2/ast/stuff_node.rb +0 -6
- data/lib/js2/decorator/app.rb +0 -7
- data/lib/js2/decorator/cleanser.rb +0 -54
- data/lib/js2/decorator/standard.rb +0 -103
- data/lib/js2/parser/fast.rb +0 -3959
- data/lib/js2/process/universe.rb +0 -89
- data/lib/js2/test/selenium.rb +0 -109
- data/lib/js2/test/selenium_element.rb +0 -234
- data/lib/js2/test/selenium_helper.rb +0 -27
- data/lib/js2bootstrap.js2 +0 -274
- data/meta/replace.rb +0 -126
data/lib/js2/processor.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'yaml'
|
2
2
|
|
3
3
|
class JS2::Processor
|
4
|
-
attr_accessor :fh, :haml_engine
|
4
|
+
attr_accessor :fh, :haml_engine
|
5
5
|
|
6
6
|
# ----------------------------------------------------------------------------
|
7
7
|
# Rails support
|
@@ -20,13 +20,16 @@ class JS2::Processor
|
|
20
20
|
# ----------------------------------------------------------------------------
|
21
21
|
# yaml support
|
22
22
|
# ----------------------------------------------------------------------------
|
23
|
-
def self.from_yaml(file)
|
24
|
-
|
23
|
+
def self.from_yaml(file, env = nil)
|
24
|
+
hash = YAML.load_file(file)
|
25
|
+
hash = hash[env] if env
|
26
|
+
|
27
|
+
config = JS2::Config.new(hash)
|
25
28
|
return self.get(config)
|
26
29
|
end
|
27
30
|
|
28
|
-
def self.daemon_from_yaml(file)
|
29
|
-
p = self.from_yaml(file)
|
31
|
+
def self.daemon_from_yaml(file, env = nil)
|
32
|
+
p = self.from_yaml(file, env)
|
30
33
|
return JS2::Daemon.new(p)
|
31
34
|
end
|
32
35
|
|
@@ -67,7 +70,7 @@ class JS2::Processor
|
|
67
70
|
# haml engine
|
68
71
|
haml_engine_class = config.haml_engine_class ?
|
69
72
|
config.haml_engine_class.constantize :
|
70
|
-
JS2::
|
73
|
+
JS2::HamlEngine
|
71
74
|
|
72
75
|
haml_engine = haml_engine_class.new
|
73
76
|
|
@@ -77,87 +80,33 @@ class JS2::Processor
|
|
77
80
|
js2_haml_dir = config.js2_haml_dir
|
78
81
|
haml_dir = config.haml_dir
|
79
82
|
|
80
|
-
file_handler = JS2::
|
83
|
+
file_handler = JS2::FileHandler.new(
|
81
84
|
:read_dir => js2_dir,
|
82
85
|
:write_dir => write_dir,
|
83
86
|
:haml_dir => js2_haml_dir,
|
84
87
|
:view_dir => haml_dir
|
85
88
|
)
|
86
89
|
|
87
|
-
decorator_klass = config.test_mode ?
|
88
|
-
JS2::Decorator::Test :
|
89
|
-
JS2::Decorator::Standard
|
90
|
-
|
91
90
|
return self.new(
|
92
91
|
:test_mode => config.test_mode,
|
93
92
|
:reference_dir => config.reference_dir,
|
94
93
|
:haml_engine => haml_engine,
|
95
94
|
:file_handler => file_handler,
|
96
|
-
:
|
95
|
+
:vars => config.vars
|
97
96
|
)
|
98
97
|
end
|
99
98
|
|
100
99
|
def initialize (params)
|
101
100
|
@haml_engine = params[:haml_engine]
|
102
101
|
@fh = params[:file_handler]
|
103
|
-
@decorator_klass = params[:decorator_klass]
|
104
102
|
@reference_dir = params[:reference_dir]
|
105
103
|
@test_mode = params[:test_mode]
|
104
|
+
@vars = params[:vars]
|
106
105
|
end
|
107
106
|
|
108
107
|
def write_files
|
109
|
-
|
110
|
-
|
111
|
-
universe = JS2::Process::Universe.new
|
112
|
-
|
113
|
-
decorator = @decorator_klass.new
|
114
|
-
|
115
|
-
bootstrap_file = File.dirname(__FILE__) + "/../js2bootstrap.js2"
|
116
|
-
bootstrap_nodes = parser.parse(bootstrap_file)
|
117
|
-
universe.add_nodes(bootstrap_nodes)
|
118
|
-
|
119
|
-
@fh.get_files.each do |filename|
|
120
|
-
nodes = parser.parse(filename)
|
121
|
-
universe.add_nodes(nodes)
|
122
|
-
end
|
123
|
-
|
124
|
-
@fh.get_yml_files.each do |filename|
|
125
|
-
begin
|
126
|
-
yml = YAML.load_file(filename)
|
127
|
-
universe.add_yml(yml, filename)
|
128
|
-
rescue Exception => e
|
129
|
-
puts "YAML Error in #{filename}:"
|
130
|
-
puts e.to_s
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
|
-
@fh.get_haml_files.each do |filename|
|
135
|
-
hash = haml_parser.parse(filename)
|
136
|
-
universe.add_haml_hash(hash)
|
137
|
-
end
|
138
|
-
|
139
|
-
universe.finalize!
|
140
|
-
|
141
|
-
universe.node_containers.each do |nc|
|
142
|
-
str = decorator.draw_nodes(nc)
|
143
|
-
@fh.write_file(nc.filename, str)
|
144
|
-
end
|
145
|
-
|
146
|
-
if @test_mode
|
147
|
-
decorator.write_references(@reference_dir)
|
148
|
-
end
|
149
|
-
|
150
|
-
@fh.get_view_files.each do |filename|
|
151
|
-
js = haml_parser.parse_out_js(filename)
|
152
|
-
nodes = parser.parse_string(js)
|
153
|
-
decorator = @decorator_klass.new
|
154
|
-
decorator.draw_nodes(nodes)
|
155
|
-
decorator.write_references(@reference_dir)
|
156
|
-
end
|
157
|
-
|
158
|
-
universe.compilations.each_pair do |filename, hash|
|
159
|
-
@fh.write_compilation(filename, hash)
|
160
|
-
end
|
108
|
+
universe = JS2::Universe.new(@fh, @haml_engine)
|
109
|
+
universe.write
|
161
110
|
end
|
162
111
|
|
163
112
|
end
|
data/lib/js2/replace.rb
ADDED
@@ -0,0 +1,106 @@
|
|
1
|
+
require 'erb'
|
2
|
+
|
3
|
+
LITERALS = [ '!=', '!==', '#', '%', '%=', '&&', '&&=', '&=', '*', '*=', '+', '+=', ',', '-', '-=', '->', '.', '/', '/=', ':', '::', '<', '<<', '<<=', '<=', '=', '==', '===', '>', '>=', '>>', '>>=', '>>>', '>>>=', '?', '@', '[', '^', '^=', '^^', '^^=', '|', '|=', '||', '||=', 'abstract', 'break', 'case', 'catch', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'else', 'enum', 'export', 'extends', 'field', 'final', 'finally', 'for', 'function', 'goto', 'if', 'implements', 'import', 'in', 'instanceof', 'native', 'new', 'package', 'private', 'protected', 'public', 'return', 'static', 'switch', 'synchronized', 'throw', 'throws', 'transient', 'try', 'typeof', 'var', 'volatile', 'while', 'with', 'foreach', 'module', 'include' ]
|
4
|
+
|
5
|
+
class Replacer
|
6
|
+
def initialize
|
7
|
+
@types = []
|
8
|
+
end
|
9
|
+
|
10
|
+
def def_literals
|
11
|
+
ret = []
|
12
|
+
LITERALS.each do |literal|
|
13
|
+
ret << "'#{literal}' ws* regexpliteral => { };"
|
14
|
+
end
|
15
|
+
ret.join("\n") + "\n"
|
16
|
+
end
|
17
|
+
|
18
|
+
def warn_int (int)
|
19
|
+
return <<-END
|
20
|
+
rb_funcall2(self, warn_sym, 1, warn_intv);
|
21
|
+
END
|
22
|
+
end
|
23
|
+
|
24
|
+
def mark_node ()
|
25
|
+
return <<-END
|
26
|
+
mark_argv[0] = INT2FIX(ts-data+1);
|
27
|
+
rb_funcall2(self, mark_sym, 1, mark_argv);
|
28
|
+
END
|
29
|
+
end
|
30
|
+
|
31
|
+
def start_node (type, idx = nil, ignore_curly = false)
|
32
|
+
return <<-END
|
33
|
+
#{ignore_curly ? '' : 'curlies[++curly_idx] = cb_count;'};
|
34
|
+
|
35
|
+
start_argv[0] = sym_#{type};
|
36
|
+
start_argv[1] = INT2FIX(#{idx || 'ts-data'});
|
37
|
+
start_argv[2] = INT2FIX(is_static);
|
38
|
+
rb_funcall2(self, start_sym, 3, start_argv);
|
39
|
+
is_static = 0;
|
40
|
+
END
|
41
|
+
end
|
42
|
+
|
43
|
+
def start_member (type, idx = nil)
|
44
|
+
return <<-END
|
45
|
+
close_on_semi = 1;
|
46
|
+
start_argv[0] = sym_#{type};
|
47
|
+
start_argv[1] = INT2FIX(#{idx || 'ts-data'});
|
48
|
+
start_argv[2] = INT2FIX(is_static);
|
49
|
+
rb_funcall2(self, start_sym, 3, start_argv);
|
50
|
+
is_static = 0;
|
51
|
+
END
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
def stop_node (idx = nil)
|
56
|
+
return <<-END
|
57
|
+
if (curly_idx) curly_idx--;
|
58
|
+
stop_argv[0] = INT2FIX(#{idx || 'te-data'});
|
59
|
+
rb_funcall2(self, stop_sym, 1, stop_argv);
|
60
|
+
END
|
61
|
+
end
|
62
|
+
|
63
|
+
def stop_member (idx = nil)
|
64
|
+
return <<-END
|
65
|
+
close_on_semi = 0;
|
66
|
+
stop_argv[0] = INT2FIX(#{idx || 'te-data'});
|
67
|
+
rb_funcall2(self, stop_sym, 1, stop_argv);
|
68
|
+
END
|
69
|
+
end
|
70
|
+
|
71
|
+
|
72
|
+
def in_class
|
73
|
+
return "in_class == (cb_count + 1)"
|
74
|
+
end
|
75
|
+
|
76
|
+
def in_module
|
77
|
+
return "in_class == curly_idx || in_module == curly_idx"
|
78
|
+
end
|
79
|
+
|
80
|
+
def declare_vars (types)
|
81
|
+
ret = ''
|
82
|
+
types.each do |type|
|
83
|
+
ret += self.declare(type)
|
84
|
+
end
|
85
|
+
|
86
|
+
return ret
|
87
|
+
end
|
88
|
+
|
89
|
+
def declare (type)
|
90
|
+
return <<-END
|
91
|
+
// #{type}
|
92
|
+
ID sym_#{type} = ID2SYM(rb_intern("#{type}"));
|
93
|
+
END
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
97
|
+
|
98
|
+
module JS2
|
99
|
+
end
|
100
|
+
|
101
|
+
replacer = Replacer.new
|
102
|
+
template = ERB.new(File.read('tokenizer.rl.erb'), 0, "%<>")
|
103
|
+
|
104
|
+
File.open('tokenizer.rl', 'w') do |f|
|
105
|
+
f << template.result(binding)
|
106
|
+
end
|
@@ -1,27 +1,24 @@
|
|
1
1
|
require 'json'
|
2
2
|
|
3
|
-
class JS2::
|
3
|
+
class JS2::SelDecorator
|
4
4
|
|
5
5
|
def initialize ()
|
6
|
-
super()
|
7
6
|
@references = Hash.new
|
8
7
|
@in_class = false
|
9
8
|
end
|
10
9
|
|
11
|
-
|
12
|
-
|
13
|
-
str = super(node)
|
14
|
-
@scope = node.name
|
15
|
-
@in_class = true
|
16
|
-
str = process_str(str)
|
10
|
+
def reset!
|
11
|
+
@references = Hash.new
|
17
12
|
@in_class = false
|
18
|
-
return str
|
19
13
|
end
|
20
14
|
|
21
|
-
def
|
22
|
-
|
23
|
-
@
|
24
|
-
|
15
|
+
def translate (str, scope = nil, in_class = false)
|
16
|
+
@scope = scope
|
17
|
+
@in_class = in_class
|
18
|
+
ret = process_str(str)
|
19
|
+
@in_class = false
|
20
|
+
@scope = nil
|
21
|
+
return ret
|
25
22
|
end
|
26
23
|
|
27
24
|
def write_references (dir)
|
@@ -120,7 +117,7 @@ class JS2::Decorator::Test < JS2::Decorator::Standard
|
|
120
117
|
@scope.to_json
|
121
118
|
end
|
122
119
|
|
123
|
-
return padding + %{TMP_SEL_MARKER = this.SEL_MARKER || JS2.SEL_MARKER; TMP_SEL_MARKER.#{insert}(#{scope}, #{key.to_json}, #{lval}, #{finder});}
|
120
|
+
return padding + %{var TMP_SEL_MARKER = this.SEL_MARKER || JS2.SEL_MARKER; TMP_SEL_MARKER.#{insert}(#{scope}, #{key.to_json}, #{lval}, #{finder});}
|
124
121
|
else
|
125
122
|
return false
|
126
123
|
end
|
@@ -24,6 +24,7 @@
|
|
24
24
|
whitespacecharacter = [\t\v\f ];
|
25
25
|
lineterminator = ('\r' | '\n');
|
26
26
|
asciidigit = digit;
|
27
|
+
ws = (whitespacecharacter | lineterminator);
|
27
28
|
|
28
29
|
literals = (
|
29
30
|
'==' | '!=' | '===' | '!==' | '<=' | '>=' | '||' | '&&' | '++' | '--' | '<<' | '<<=' | '>>' | '>>=' | '>>>' | '>>>='| '&=' | '%=' | '^=' | '|=' | '+=' | '-=' | '*=' | '/='
|
@@ -101,83 +102,102 @@
|
|
101
102
|
);
|
102
103
|
single_char = any;
|
103
104
|
|
104
|
-
|
105
|
-
|
106
|
-
|
105
|
+
var_list = (identifier . ws* . ',' . ws*)* . identifier?;
|
106
|
+
arg_list = '(' . ws* . var_list . ws* .')';
|
107
|
+
|
108
|
+
curry_with = 'with' . ws* . arg_list;
|
109
|
+
curry = 'curry' . ws* . arg_list? . ws* . curry_with? . ws*;
|
110
|
+
|
111
|
+
foreach = 'foreach' . ws* . '(' . ws* . 'var' . ws* . identifier . (ws* . ':' . ws* . identifier)? . ws*;
|
112
|
+
|
113
|
+
js2_include = 'include' . ws+ . identifier;
|
114
|
+
js2_class = 'class' . ws+ . identifier;
|
115
|
+
js2_module = 'module' . ws+ . identifier;
|
116
|
+
|
117
|
+
property = ws . 'property' . ws . var_list;
|
118
|
+
member = ws . ('static' . ws+)? . 'var' . ws+ . identifier;
|
119
|
+
method = ws . ('static' . ws+)? . 'function' . ws* . identifier;
|
120
|
+
private = ws . 'private' . ws;
|
121
|
+
accessor = ws . 'accessor' . ws;
|
122
|
+
|
123
|
+
|
124
|
+
|
107
125
|
|
108
126
|
main := |*
|
109
127
|
|
110
128
|
lineterminator => {
|
111
|
-
line_number++;
|
129
|
+
//line_number++;
|
112
130
|
};
|
113
131
|
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
132
|
+
js2_class => {
|
133
|
+
if (in_class == 0) {
|
134
|
+
<%= replacer.start_node :CLASS %>
|
135
|
+
in_class = curly_idx;
|
136
|
+
}
|
118
137
|
};
|
119
138
|
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
<%= replacer.
|
139
|
+
private => {
|
140
|
+
if (in_class && in_class == curly_idx) {
|
141
|
+
<%= replacer.start_node :PRIVATE %>
|
142
|
+
<%= replacer.stop_node %>
|
124
143
|
}
|
125
144
|
};
|
126
145
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
if (<%= replacer.is? :CLASS %> || <%= replacer.is? :MODULE %>) {
|
135
|
-
if (<%= replacer.is? :CLASS %>) {
|
136
|
-
<%= replacer.start :CLASS %>
|
137
|
-
} else {
|
138
|
-
<%= replacer.start :MODULE %>
|
139
|
-
}
|
146
|
+
js2_module => {
|
147
|
+
if (in_class == 0) {
|
148
|
+
<%= replacer.start_node :MODULE %>
|
149
|
+
in_class = curly_idx;
|
150
|
+
}
|
151
|
+
};
|
140
152
|
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
153
|
+
property => {
|
154
|
+
if (in_class && in_class == curly_idx) {
|
155
|
+
<%= replacer.start_member :PROPERTY %>
|
156
|
+
}
|
157
|
+
};
|
146
158
|
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
159
|
+
accessor => {
|
160
|
+
if (in_class && in_class == curly_idx) {
|
161
|
+
<%= replacer.start_member :ACCESSOR %>
|
162
|
+
}
|
163
|
+
};
|
151
164
|
|
152
|
-
if (<%= replacer.is? :FUNCTION %>) {
|
153
|
-
<%= replacer.start :METHOD %>
|
154
|
-
}
|
155
165
|
|
156
|
-
|
157
|
-
|
158
|
-
|
166
|
+
member => {
|
167
|
+
if (in_class && in_class == curly_idx) {
|
168
|
+
<%= replacer.start_member :MEMBER %>
|
169
|
+
}
|
170
|
+
};
|
159
171
|
|
172
|
+
method => {
|
173
|
+
if (in_class && in_class == curly_idx) {
|
174
|
+
<%= replacer.start_node :METHOD %>
|
175
|
+
}
|
176
|
+
};
|
160
177
|
|
161
|
-
if (<%= replacer.is? :ACCESSOR %>) {
|
162
|
-
<%= replacer.start :MEMBER %>
|
163
|
-
}
|
164
178
|
|
165
|
-
|
166
|
-
|
167
|
-
|
179
|
+
js2_include => {
|
180
|
+
if (in_class && in_class == curly_idx) {
|
181
|
+
<%= replacer.start_member :INCLUDE %>
|
182
|
+
}
|
183
|
+
};
|
168
184
|
|
185
|
+
foreach => {
|
186
|
+
<%= replacer.start_node :FOREACH %>
|
187
|
+
mark_on_br = br_count;
|
188
|
+
br_count++;
|
189
|
+
};
|
169
190
|
|
170
|
-
|
171
|
-
|
172
|
-
|
191
|
+
curry => {
|
192
|
+
<%= replacer.start_node :CURRY %>
|
193
|
+
};
|
173
194
|
|
174
|
-
|
175
|
-
|
176
|
-
if (<%= replacer.is? :FOREACH %>) {
|
177
|
-
<%= replacer.start :FOREACH %>
|
178
|
-
}
|
195
|
+
whitespacecharacter => {};
|
196
|
+
comment => { };
|
179
197
|
|
180
|
-
};
|
198
|
+
all_string => {};
|
199
|
+
number => {};
|
200
|
+
keywords => { };
|
181
201
|
|
182
202
|
literals => { };
|
183
203
|
reserved => { };
|
@@ -185,38 +205,39 @@
|
|
185
205
|
|
186
206
|
<%= replacer.def_literals %>
|
187
207
|
|
188
|
-
single_char | (('(' | '{' | ';')
|
189
|
-
|
190
|
-
single = data[ts-data];
|
191
|
-
|
192
|
-
if (single == '(') {
|
193
|
-
br_count++;
|
194
|
-
} else if (single == ')') {
|
195
|
-
br_count--;
|
196
|
-
|
197
|
-
if (in_FOREACH && br_count == br_lvl_FOREACH) {
|
198
|
-
<%= replacer.stop :FOREACH %>
|
199
|
-
}
|
200
|
-
}
|
208
|
+
single_char | (('(' | '{' | ';' | '}') ws* regexpliteral) => {
|
209
|
+
char single = data[ts-data];
|
201
210
|
|
202
211
|
if (single == '{') {
|
212
|
+
in_foreach = 0;
|
203
213
|
cb_count++;
|
204
214
|
} else if (single == '}') {
|
205
|
-
if (<%= replacer.directly_in? :CLASS %> || <%= replacer.directly_in? :MODULE %>) {
|
206
|
-
<%= replacer.start :STUFF, 'curr+1' %>
|
207
|
-
}
|
208
|
-
|
209
215
|
cb_count--;
|
210
|
-
|
211
|
-
|
212
|
-
|
216
|
+
if (curly_idx && curlies[curly_idx] == cb_count) {
|
217
|
+
in_foreach = 0;
|
218
|
+
<%= replacer.stop_node %>
|
219
|
+
if (curlies[in_class] == cb_count) {
|
220
|
+
in_class = 0;
|
221
|
+
}
|
222
|
+
}
|
223
|
+
} else if (single == ';' && close_on_semi == 1) {
|
224
|
+
<%= replacer.stop_member %>
|
213
225
|
}
|
214
226
|
|
215
|
-
if (single == ';') {
|
216
|
-
|
227
|
+
if (single == ';' || single == '}') {
|
228
|
+
classable = 1;
|
217
229
|
}
|
218
230
|
|
219
|
-
|
231
|
+
if (single == '(') {
|
232
|
+
br_count++;
|
233
|
+
} else if (single == ')') {
|
234
|
+
br_count--;
|
235
|
+
if (mark_on_br == br_count) {
|
236
|
+
<%= replacer.stop_node %>
|
237
|
+
mark_on_br = -1;
|
238
|
+
}
|
239
|
+
}
|
240
|
+
};
|
220
241
|
|
221
242
|
*|;
|
222
243
|
}%%
|
@@ -224,7 +245,7 @@
|
|
224
245
|
require 'rubygems'
|
225
246
|
require 'inline'
|
226
247
|
|
227
|
-
class JS2::Parser
|
248
|
+
class JS2::Parser
|
228
249
|
attr_accessor :data
|
229
250
|
|
230
251
|
inline do |builder|
|
@@ -236,33 +257,48 @@ class JS2::Parser::Fast
|
|
236
257
|
int data_length = RSTRING(r_str)->len;
|
237
258
|
char* data = STR2CSTR(r_str);
|
238
259
|
|
239
|
-
|
240
|
-
int
|
241
|
-
int
|
242
|
-
|
260
|
+
int in_class = 0;
|
261
|
+
int in_module = 0;
|
262
|
+
int close_on_semi = 0;
|
263
|
+
int classable = 1;
|
264
|
+
int in_foreach = 0;
|
265
|
+
|
266
|
+
// start vars
|
267
|
+
VALUE start_argv[3];
|
268
|
+
ID start_sym = rb_intern("start_node");
|
269
|
+
|
270
|
+
// stop vars
|
271
|
+
VALUE stop_argv[1];
|
272
|
+
ID stop_sym = rb_intern("stop_node");
|
243
273
|
|
244
|
-
//
|
245
|
-
VALUE
|
246
|
-
|
247
|
-
|
274
|
+
// mark vars
|
275
|
+
VALUE mark_argv[1];
|
276
|
+
ID mark_sym = rb_intern("mark_node");
|
277
|
+
int mark_on_br = -1;
|
278
|
+
|
279
|
+
|
280
|
+
VALUE warn_intv[1];
|
281
|
+
ID warn_sym = rb_intern("warn_int");
|
248
282
|
|
249
|
-
VALUE set_static_argv[0];
|
250
|
-
int set_static_argc = 0;
|
251
|
-
ID set_static_sym = rb_intern("set_static");
|
252
283
|
|
253
284
|
// state vars
|
254
285
|
int i = 0; // iterator
|
255
286
|
int j = 0; // iterator
|
256
|
-
char word[100]; // keyword
|
257
|
-
char single;
|
258
|
-
|
259
|
-
int curr = 0;
|
260
|
-
int prev = -1;
|
261
|
-
int cb_count = 0;
|
262
|
-
int br_count = 0;
|
263
287
|
|
264
|
-
|
265
|
-
|
288
|
+
char keyword[100]; // keyword
|
289
|
+
char single;
|
290
|
+
int is_static = 0;
|
291
|
+
int is_private = 0;
|
292
|
+
|
293
|
+
// curly handling
|
294
|
+
int curlies[1000];
|
295
|
+
curlies[0] = 0;
|
296
|
+
int curly_idx = 0; // on purpose!
|
297
|
+
int cb_count = 0;
|
298
|
+
int br_count = 0;
|
299
|
+
int close_on_br = 0;
|
300
|
+
|
301
|
+
<%= replacer.declare_vars [ :CLASS, :METHOD, :MEMBER, :STUFF, :ACCESSOR, :COMMENT, :FOREACH, :MODULE, :INCLUDE, :CURRY, :PROPERTY, :PRIVATE, :STATIC ] %>
|
266
302
|
// ragel variables
|
267
303
|
int cs, act;
|
268
304
|
char *ts = NULL;
|
@@ -272,51 +308,47 @@ class JS2::Parser::Fast
|
|
272
308
|
char *eof = pe;
|
273
309
|
char* regexp_start = NULL;
|
274
310
|
|
275
|
-
<%= replacer.
|
311
|
+
<%= replacer.start_node :STUFF, 0, true %>
|
276
312
|
|
277
313
|
%% write data;
|
278
314
|
%% write init;
|
279
315
|
%% write exec;
|
280
316
|
|
281
|
-
|
282
|
-
<%= replacer.stop :STUFF %>
|
283
|
-
}
|
317
|
+
<%= replacer.stop_node('data_length-1') %>
|
284
318
|
}
|
285
319
|
|
286
320
|
END
|
287
321
|
end
|
288
322
|
|
289
|
-
def
|
290
|
-
|
323
|
+
def warn_int (int)
|
324
|
+
puts int.to_s
|
291
325
|
end
|
292
326
|
|
293
|
-
def
|
294
|
-
@
|
327
|
+
def start_node (type, idx, is_static)
|
328
|
+
@ph.start_node(type, idx, is_static == 1)
|
295
329
|
end
|
296
330
|
|
297
|
-
def
|
298
|
-
|
299
|
-
@nodes.do_next(symbol, start_idx, end_idx, line)
|
331
|
+
def stop_node (idx)
|
332
|
+
@ph.stop_node(idx)
|
300
333
|
end
|
301
334
|
|
302
|
-
def
|
303
|
-
|
304
|
-
@nodes = JS2::AST::Nodes.new("string", str)
|
305
|
-
self.do_parse(str)
|
306
|
-
return @nodes
|
335
|
+
def mark_node (idx)
|
336
|
+
@ph.mark_node(idx)
|
307
337
|
end
|
308
338
|
|
309
|
-
def parse(filename)
|
310
|
-
self.data = File.read(filename)
|
311
|
-
@nodes = JS2::AST::Nodes.new(filename, data)
|
312
339
|
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
eof = data.size
|
340
|
+
def parse (data)
|
341
|
+
@data = data
|
342
|
+
@ph = JS2::ParserHelper.new(data)
|
317
343
|
self.do_parse(data)
|
344
|
+
return @ph
|
345
|
+
end
|
318
346
|
|
319
|
-
|
347
|
+
def parse_file (filename)
|
348
|
+
data = File.read(filename)
|
349
|
+
ph = self.parse(data)
|
350
|
+
ph.filename = filename
|
351
|
+
return ph
|
320
352
|
end
|
321
353
|
|
322
354
|
end
|