cirru-parser 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: b6ac2eeb4bb72612594291c6c3c61d8342b0742c
4
+ data.tar.gz: 21b6c31e839a4d76a12184e33699abf9d5fa60a8
5
+ SHA512:
6
+ metadata.gz: bb83cffa5b4118d5e580a2a39e12a2a6489a277d48e1291b9591d57bb1b91c5761d960cf717235329e45247d429e52c3e5669e8cdbabf95e0ffa776b00d7ed3a
7
+ data.tar.gz: 8823508745902d2691012641b8d31ef5866430dd33ca0a421a808a187824d872120fa45d76471a24e8fbeb23ca749b3b686eff7f2e3f9077cbadb65639fc097d
data/.gitignore ADDED
@@ -0,0 +1,16 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
15
+
16
+ *.gem
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in cirru-parser.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2015 jiyinyiyong
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,31 @@
1
+ # Cirru::Parser
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'cirru-parser'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install cirru-parser
20
+
21
+ ## Usage
22
+
23
+ TODO: Write usage instructions here
24
+
25
+ ## Contributing
26
+
27
+ 1. Fork it ( https://github.com/[my-github-username]/cirru-parser/fork )
28
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
29
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
30
+ 4. Push to the branch (`git push origin my-new-feature`)
31
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,4 @@
1
+
2
+ require "bundler/gem_tasks"
3
+
4
+ # see test.rb insread
data/ast/comma.json ADDED
@@ -0,0 +1,12 @@
1
+ [
2
+ [
3
+ "print",
4
+ "a",
5
+ [
6
+ "a",
7
+ "b",
8
+ "c",
9
+ "d"
10
+ ]
11
+ ]
12
+ ]
data/ast/demo.json ADDED
@@ -0,0 +1,50 @@
1
+ [
2
+ [
3
+ "define",
4
+ "a",
5
+ [
6
+ "read",
7
+ "cd"
8
+ ],
9
+ [
10
+ "if",
11
+ [
12
+ ">",
13
+ "a",
14
+ "cd"
15
+ ],
16
+ [
17
+ "print",
18
+ "demo"
19
+ ],
20
+ [
21
+ "print",
22
+ "not demo"
23
+ ]
24
+ ]
25
+ ],
26
+ [
27
+ "say",
28
+ [
29
+ "print",
30
+ "a",
31
+ [
32
+ "save",
33
+ [
34
+ "b",
35
+ [
36
+ "x",
37
+ [
38
+ "c",
39
+ "8"
40
+ ]
41
+ ]
42
+ ]
43
+ ]
44
+ ]
45
+ ],
46
+ [
47
+ "print",
48
+ "fun"
49
+ ]
50
+ ]
data/ast/folding.json ADDED
@@ -0,0 +1,35 @@
1
+ [
2
+ [
3
+ "a",
4
+ []
5
+ ],
6
+ [
7
+ "b",
8
+ [
9
+ "c"
10
+ ]
11
+ ],
12
+ [
13
+ "d",
14
+ [
15
+ "e",
16
+ [
17
+ "f"
18
+ ]
19
+ ]
20
+ ],
21
+ [
22
+ "g",
23
+ [
24
+ "h",
25
+ [
26
+ "i",
27
+ "j",
28
+ [
29
+ "k",
30
+ []
31
+ ]
32
+ ]
33
+ ]
34
+ ]
35
+ ]
data/ast/html.json ADDED
@@ -0,0 +1,145 @@
1
+ [
2
+ [
3
+ "doctype"
4
+ ],
5
+ [
6
+ "html",
7
+ [
8
+ "head",
9
+ [
10
+ "title",
11
+ [
12
+ "=",
13
+ "a"
14
+ ]
15
+ ],
16
+ [
17
+ "link",
18
+ [
19
+ ":rel",
20
+ "a"
21
+ ],
22
+ [
23
+ ":href",
24
+ "b"
25
+ ]
26
+ ],
27
+ [
28
+ "link",
29
+ [
30
+ ":rel",
31
+ "icon"
32
+ ],
33
+ [
34
+ ":href",
35
+ "a"
36
+ ]
37
+ ],
38
+ [
39
+ "meta",
40
+ [
41
+ ":charset",
42
+ "utf-8"
43
+ ]
44
+ ]
45
+ ],
46
+ [
47
+ "body",
48
+ [
49
+ "#about",
50
+ [
51
+ ".line",
52
+ [
53
+ "a",
54
+ [
55
+ ":href",
56
+ "a"
57
+ ],
58
+ [
59
+ "=",
60
+ "b"
61
+ ]
62
+ ],
63
+ [
64
+ "span",
65
+ [
66
+ "=",
67
+ " "
68
+ ]
69
+ ],
70
+ [
71
+ "a",
72
+ [
73
+ ":href",
74
+ "a"
75
+ ],
76
+ [
77
+ "=",
78
+ "b"
79
+ ]
80
+ ]
81
+ ],
82
+ [
83
+ ".line",
84
+ [
85
+ "span",
86
+ [
87
+ "=",
88
+ "a"
89
+ ]
90
+ ]
91
+ ]
92
+ ],
93
+ [
94
+ "#list",
95
+ [
96
+ ".year",
97
+ [
98
+ "=",
99
+ "2014"
100
+ ]
101
+ ],
102
+ [
103
+ ".month",
104
+ [
105
+ "=",
106
+ "May"
107
+ ]
108
+ ],
109
+ [
110
+ ".post",
111
+ [
112
+ "a.link",
113
+ [
114
+ ":href"
115
+ ],
116
+ [
117
+ "="
118
+ ]
119
+ ]
120
+ ],
121
+ [
122
+ ".month",
123
+ [
124
+ "=",
125
+ "Apr"
126
+ ]
127
+ ],
128
+ [
129
+ ".post",
130
+ [
131
+ "a.link",
132
+ [
133
+ ":href",
134
+ "a"
135
+ ],
136
+ [
137
+ "=",
138
+ "b"
139
+ ]
140
+ ]
141
+ ]
142
+ ]
143
+ ]
144
+ ]
145
+ ]
data/ast/indent.json ADDED
@@ -0,0 +1,23 @@
1
+ [
2
+ [
3
+ "a",
4
+ [
5
+ "b",
6
+ [
7
+ "c"
8
+ ]
9
+ ]
10
+ ],
11
+ [
12
+ "e",
13
+ "f",
14
+ [
15
+ [
16
+ "g"
17
+ ]
18
+ ],
19
+ [
20
+ "h"
21
+ ]
22
+ ]
23
+ ]
data/ast/line.json ADDED
@@ -0,0 +1,17 @@
1
+ [
2
+ [
3
+ "line",
4
+ "1"
5
+ ],
6
+ [
7
+ "line",
8
+ "2"
9
+ ],
10
+ [
11
+ "line-3"
12
+ ],
13
+ [
14
+ "line",
15
+ "4"
16
+ ]
17
+ ]
@@ -0,0 +1,24 @@
1
+ [
2
+ [
3
+ "3",
4
+ "4",
5
+ [
6
+ "1"
7
+ ],
8
+ "4"
9
+ ],
10
+ [
11
+ [
12
+ [
13
+ [
14
+ [
15
+ "1"
16
+ ]
17
+ ]
18
+ ]
19
+ ]
20
+ ],
21
+ [
22
+ "x"
23
+ ]
24
+ ]
data/ast/quote.json ADDED
@@ -0,0 +1,14 @@
1
+ [
2
+ [
3
+ "a",
4
+ "b",
5
+ "c",
6
+ "d"
7
+ ],
8
+ [
9
+ "a b c d"
10
+ ],
11
+ [
12
+ "a b \" c d"
13
+ ]
14
+ ]
data/ast/spaces.json ADDED
@@ -0,0 +1,6 @@
1
+ [
2
+ [
3
+ "a b",
4
+ "c d"
5
+ ]
6
+ ]
@@ -0,0 +1,21 @@
1
+ [
2
+ [
3
+ "set",
4
+ [
5
+ "add",
6
+ "1",
7
+ []
8
+ ],
9
+ "x",
10
+ "y",
11
+ [
12
+ "add",
13
+ "5",
14
+ []
15
+ ],
16
+ [
17
+ "add",
18
+ "2"
19
+ ]
20
+ ]
21
+ ]
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'cirru/parser'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "cirru-parser"
8
+ spec.version = Cirru::Parser::VERSION
9
+ spec.authors = ["jiyinyiyong"]
10
+ spec.email = ["jiyinyiyong@gmail.com"]
11
+ spec.summary = %q{Cirru Parser in Ruby}
12
+ spec.description = %q{Manually convert cirru-parser into Ruby}
13
+ spec.homepage = "http://cirru.org"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.7"
22
+ spec.add_development_dependency "rake", "~> 10.0"
23
+ spec.add_development_dependency 'json', '~> 0.3.16'
24
+ end
@@ -0,0 +1,5 @@
1
+
2
+ print (, a)
3
+ a
4
+ , b
5
+ , c (, d)
@@ -0,0 +1,8 @@
1
+
2
+ define a (read cd) $ if (> a cd)
3
+ print demo
4
+ print "not demo"
5
+
6
+ say $ print a $ save $ b $ x $ c 8
7
+
8
+ print fun
@@ -0,0 +1,8 @@
1
+
2
+ a $
3
+
4
+ b $ c
5
+
6
+ d $ e $ f
7
+
8
+ g $ h $ i j $ k $
@@ -0,0 +1,22 @@
1
+
2
+ doctype
3
+
4
+ html
5
+ head
6
+ title $ = a
7
+ link (:rel a) $ :href b
8
+ link (:rel icon) $ :href a
9
+ meta $ :charset utf-8
10
+ body
11
+ #about
12
+ .line
13
+ a (:href a) $ = b
14
+ span $ = " "
15
+ a (:href a) $ = b
16
+ .line $ span $ = a
17
+ #list
18
+ .year $ = 2014
19
+ .month $ = May
20
+ .post $ a.link (:href) $ =
21
+ .month $ = Apr
22
+ .post $ a.link (:href a) $ = b
@@ -0,0 +1,6 @@
1
+
2
+ a $ b $ c
3
+
4
+ e f
5
+ (g)
6
+ h
@@ -0,0 +1,8 @@
1
+
2
+ line 1
3
+
4
+ line 2
5
+
6
+ line-3
7
+
8
+ line 4
@@ -0,0 +1,6 @@
1
+
2
+ 3 4 (1) 4
3
+
4
+ ((((1))))
5
+
6
+ x
@@ -0,0 +1,6 @@
1
+
2
+ a b c d
3
+
4
+ "a b c d"
5
+
6
+ "a b \" c d"
@@ -0,0 +1,2 @@
1
+
2
+ "a b" "c d"
@@ -0,0 +1,6 @@
1
+
2
+ set
3
+ add 1 $
4
+ , x y
5
+ add 5 $
6
+ add 2
@@ -0,0 +1,5 @@
1
+ module Cirru
2
+ module Parser
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
@@ -0,0 +1,352 @@
1
+
2
+ require "cirru/parser/version"
3
+ require 'cirru/tree'
4
+
5
+ module Cirru
6
+ module Parser
7
+ def self.parse(code, filename)
8
+ buffer = nil
9
+
10
+ state = { name: :indent,
11
+ x: 1,
12
+ y: 1,
13
+ level: 1,
14
+ indent: 0,
15
+ indented: 0,
16
+ nest: 0,
17
+ path: filename
18
+ }
19
+
20
+ xs = []
21
+ while code.length > 0
22
+ res = parsing xs, buffer, state, code
23
+ xs, buffer, state, code = *res
24
+ end
25
+ res = parsing xs, buffer, state, code
26
+ res = res.map do |item|
27
+ Tree.resolveDollar item
28
+ end
29
+ res = res.map do |item|
30
+ Tree.resolveComma item
31
+ end
32
+ res
33
+ end
34
+
35
+ def self.pare(code, filename)
36
+ res = self.parse code, filename
37
+ # p 'before shorten', res
38
+ shorten res
39
+ end
40
+ end
41
+ end
42
+
43
+
44
+ def shorten(xs)
45
+ if xs.is_a? Array
46
+ xs.map do |item|
47
+ shorten(item)
48
+ end
49
+ else
50
+ xs[:text]
51
+ end
52
+ end
53
+
54
+ # eof
55
+
56
+ def escape_eof(xs, buffer, state, code)
57
+ raise 'EOF in escape state'
58
+ end
59
+
60
+ def string_eof(xs, buffer, state, code)
61
+ raise 'EOF in string state'
62
+ end
63
+
64
+ def space_eof(xs, buffer, state, code)
65
+ xs
66
+ end
67
+
68
+ def token_eof(xs, buffer, state, code)
69
+ buffer[:ex] = state[:x]
70
+ buffer[:ey] = state[:y]
71
+ # p 'appendBuffer', xs, state[:level], buffer
72
+ xs = Tree.appendBuffer xs, state[:level], buffer
73
+ buffer = nil
74
+ xs
75
+ end
76
+
77
+ def indent_eof(xs, buffer, state, code)
78
+ xs
79
+ end
80
+
81
+ # escape
82
+
83
+ def escape_newline(xs, buffer, state, code)
84
+ raise 'newline while escape'
85
+ end
86
+
87
+ def escape_n(xs, buffer, state, code)
88
+ state[:x] += 1
89
+ buffer[:text] += '\n'
90
+ state[:name] = :string
91
+ [xs, buffer, state, code[1..-1]]
92
+ end
93
+
94
+ def escape_t(xs, buffer, state, code)
95
+ state[:x] += 1
96
+ buffer[:text] += '\t'
97
+ state[:name] = :string
98
+ [xs, buffer, state, code[1..-1]]
99
+ end
100
+
101
+ def escape_else(xs, buffer, state, code)
102
+ state[:x] += 1
103
+ buffer[:text] += code[0]
104
+ state[:name] = :string
105
+ [xs, buffer, state, code[1..-1]]
106
+ end
107
+
108
+ #string
109
+
110
+ def string_backslash(xs, buffer, state, code)
111
+ state[:name] = :escape
112
+ state[:x] += 1
113
+ [xs, buffer, state, code[1..-1]]
114
+ end
115
+
116
+ def string_newline(xs, buffer, state, code)
117
+ raise 'newline in a string'
118
+ end
119
+
120
+ def string_quote(xs, buffer, state, code)
121
+ state[:name] = :token
122
+ state[:x] += 1
123
+ [xs, buffer, state, code[1..-1]]
124
+ end
125
+
126
+ def string_else(xs, buffer, state, code)
127
+ state[:x] += 1
128
+ buffer[:text] += code[0]
129
+ [xs, buffer, state, code[1..-1]]
130
+ end
131
+
132
+ # space
133
+
134
+ def space_space(xs, buffer, state, code)
135
+ state[:x] += 1
136
+ [xs, buffer, state, code[1..-1]]
137
+ end
138
+
139
+ def space_newline(xs, buffer, state, code)
140
+ if state[:nest] != 0
141
+ raise 'incorrect nesting'
142
+ end
143
+ state[:name] = :indent
144
+ state[:x] = 1
145
+ state[:y] += 1
146
+ state[:indented] = 0
147
+ [xs, buffer, state, code[1..-1]]
148
+ end
149
+
150
+ def space_open(xs, buffer, state, code)
151
+ nesting = Tree.createNesting(1)
152
+ xs = Tree.appendList xs, state[:level], nesting
153
+ state[:nest] += 1
154
+ state[:level] += 1
155
+ state[:x] += 1
156
+ [xs, buffer, state, code[1..-1]]
157
+ end
158
+
159
+ def space_close(xs, buffer, state, code)
160
+ state[:nest] -= 1
161
+ state[:level] -= 1
162
+ if state[:nest] < 0
163
+ raise 'close at space'
164
+ end
165
+ state[:x] += 1
166
+ [xs, buffer, state, code[1..-1]]
167
+ end
168
+
169
+ def space_quote(xs, buffer, state, code)
170
+ state[:name] = :string
171
+ buffer = {text: '',
172
+ x: state[:x],
173
+ y: state[:y],
174
+ path: state[:path]
175
+ }
176
+ state[:x] += 1
177
+ [xs, buffer, state, code[1..-1]]
178
+ end
179
+
180
+ def space_else(xs, buffer, state, code)
181
+ state[:name] = :token
182
+ buffer = { text: code[0],
183
+ x: state[:x],
184
+ y: state[:y],
185
+ path: state[:path]
186
+ }
187
+ state[:x] += 1
188
+ [xs, buffer, state, code[1..-1]]
189
+ end
190
+
191
+ # token
192
+
193
+ def token_space(xs, buffer, state, code)
194
+ state[:name] = :space
195
+ buffer[:ex] = state[:x]
196
+ buffer[:ey] = state[:y]
197
+ xs = Tree.appendBuffer xs, state[:level], buffer
198
+ state[:x] += 1
199
+ buffer = nil
200
+ [xs, buffer, state, code[1..-1]]
201
+ end
202
+
203
+ def token_newline(xs, buffer, state, code)
204
+ state[:name] = :indent
205
+ buffer[:ex] = state[:x]
206
+ buffer[:ey] = state[:y]
207
+ xs = Tree.appendBuffer xs, state[:level], buffer
208
+ state[:indented] = 0
209
+ state[:x] = 1
210
+ state[:y] += 1
211
+ buffer = nil
212
+ [xs, buffer, state, code[1..-1]]
213
+ end
214
+
215
+ def token_open(xs, buffer, state, code)
216
+ raise 'open parenthesis in token'
217
+ end
218
+
219
+ def token_close(xs, buffer, state, code)
220
+ state[:name] = :space
221
+ buffer[:ex] = state[:x]
222
+ buffer[:ey] = state[:y]
223
+ xs = Tree.appendBuffer xs, state[:level], buffer
224
+ buffer = nil
225
+ [xs, buffer, state, code]
226
+ end
227
+
228
+ def token_quote(xs, buffer, state, code)
229
+ state[:name] = :string
230
+ state[:x] += 1
231
+ [xs, buffer, state, code[1..-1]]
232
+ end
233
+
234
+ def token_else(xs, buffer, state, code)
235
+ buffer[:text] += code[0]
236
+ state[:x] += 1
237
+ [xs, buffer, state, code[1..-1]]
238
+ end
239
+
240
+ # indent
241
+
242
+ def indent_space(xs, buffer, state, code)
243
+ state[:indented] += 1
244
+ state[:x] += 1
245
+ [xs, buffer, state, code[1..-1]]
246
+ end
247
+
248
+ def indent_newilne(xs, buffer, state, code)
249
+ state[:x] = 1
250
+ state[:y] += 1
251
+ state[:indented] = 0
252
+ [xs, buffer, state, code[1..-1]]
253
+ end
254
+
255
+ def indent_close(xs, buffer, state, code)
256
+ raise 'close parenthesis at indent'
257
+ end
258
+
259
+ def indent_else(xs, buffer, state, code)
260
+ state[:name] = :space
261
+ if (state[:indented] % 2) == 1
262
+ raise 'odd indentation'
263
+ end
264
+ indented = state[:indented] / 2
265
+ diff = indented - state[:indent]
266
+
267
+ if diff <= 0
268
+ nesting = Tree.createNesting 1
269
+ xs = Tree.appendList xs, (state[:level] + diff - 1), nesting
270
+ elsif diff > 0
271
+ nesting = Tree.createNesting diff
272
+ xs = Tree.appendList xs, state[:level], nesting
273
+ end
274
+
275
+ state[:level] += diff
276
+ state[:indent] = indented
277
+ [xs, buffer, state, code]
278
+ end
279
+
280
+ # parse
281
+
282
+ def parsing(xs, buffer, state, code)
283
+ args = [xs, buffer, state, code]
284
+ # puts "\n"
285
+ # puts "xs: \t#{xs}"
286
+ # puts "buf: \t#{buffer}"
287
+ # puts "state: \t#{state[:name]}"
288
+ # print "code: \t"; p "#{code}"
289
+ # scope = {code, xs, buffer, state}
290
+ # window.debugData.push (lodash.cloneDeep scope)
291
+ eof = code.length == 0
292
+ char = code[0]
293
+ case state[:name]
294
+ when :escape
295
+ if eof then return escape_eof(*args)
296
+ else
297
+ case char
298
+ when "\n" then return escape_newline(*args)
299
+ when 'n' then return escape_n(*args)
300
+ when 't' then return escape_t(*args)
301
+ else return escape_else(*args)
302
+ end
303
+ end
304
+ when :string
305
+ if eof then return string_eof(*args)
306
+ else
307
+ case char
308
+ when "\\" then return string_backslash(*args)
309
+ when "\n" then return string_newline(*args)
310
+ when '"' then return string_quote(*args)
311
+ else return string_else(*args)
312
+ end
313
+ end
314
+ when :space
315
+ if eof then return space_eof(*args)
316
+ else
317
+ case char
318
+ when ' ' then return space_space(*args)
319
+ when "\n" then return space_newline(*args)
320
+ when '(' then return space_open(*args)
321
+ when ')' then return space_close(*args)
322
+ when '"' then return space_quote(*args)
323
+ else return space_else(*args)
324
+ end
325
+ end
326
+ when :token
327
+ if eof then return token_eof(*args)
328
+ else
329
+ case char
330
+ when ' ' then return token_space(*args)
331
+ when "\n" then return token_newline(*args)
332
+ when '(' then return token_open(*args)
333
+ when ')' then return token_close(*args)
334
+ when '"' then return token_quote(*args)
335
+ else return token_else(*args)
336
+ end
337
+ end
338
+ when :indent
339
+ if eof then return indent_eof(*args)
340
+ else
341
+ case char
342
+ when ' ' then return indent_space(*args)
343
+ when "\n" then return indent_newilne(*args)
344
+ when ')' then return indent_close(*args)
345
+ else return indent_else(*args)
346
+ end
347
+ end
348
+ else
349
+ p state[:name]
350
+ raise "not matching any state"
351
+ end
352
+ end
data/lib/cirru/tree.rb ADDED
@@ -0,0 +1,103 @@
1
+
2
+ module Tree
3
+ def self.appendBuffer(*args)
4
+ appendBufferHelper(*args)
5
+ end
6
+
7
+ def self.appendList(*args)
8
+ appendListHelper(*args)
9
+ end
10
+
11
+ def self.createNesting(n)
12
+ createHelper [], n
13
+ end
14
+
15
+ def self.resolveDollar(*args)
16
+ # p 'resolveDollar args', args
17
+ resolveDollarHelper *args
18
+ end
19
+
20
+ def self.resolveComma(*args)
21
+ resolveCommaHelper(*args)
22
+ end
23
+ end
24
+
25
+ def appendBufferHelper(xs, level, buffer)
26
+ if level == 0
27
+ xs[0..-1] + [buffer]
28
+ else
29
+ res = appendBufferHelper xs[-1], (level - 1), buffer
30
+ xs[0...-1] + [res]
31
+ end
32
+ end
33
+
34
+ def appendListHelper(xs, level, list)
35
+ if level == 0
36
+ xs + [list]
37
+ else
38
+ res = appendListHelper xs[-1], (level - 1), list
39
+ xs[0...-1] + [res]
40
+ end
41
+ end
42
+
43
+ def createHelper(xs, n)
44
+ if n <= 1
45
+ xs
46
+ else
47
+ list = createHelper xs, (n - 1)
48
+ [list]
49
+ end
50
+ end
51
+
52
+
53
+ def dollarHelper(before, after)
54
+ if after.length == 0
55
+ return before
56
+ end
57
+ cursor = after[0]
58
+ if cursor.is_a? Array
59
+ chunk = resolveDollarHelper cursor
60
+ dollarHelper (before + [chunk]), after[1..-1]
61
+ elsif cursor[:text] == '$'
62
+ chunk = resolveDollarHelper after[1..-1]
63
+ before + [chunk]
64
+ else
65
+ dollarHelper (before + [cursor]), after[1..-1]
66
+ end
67
+ end
68
+
69
+ def resolveDollarHelper(xs)
70
+ # p 'calling resolveDollarHelper', xs
71
+ if xs.length == 0
72
+ return xs
73
+ end
74
+ dollarHelper [], xs
75
+ end
76
+
77
+ def commaHelper(before, after)
78
+ if after.length == 0
79
+ return before
80
+ end
81
+ cursor = after[0]
82
+ if (cursor.is_a? Array) and (cursor.length > 0)
83
+ head = cursor[0]
84
+ if head.is_a? Array
85
+ chunk = resolveCommaHelper cursor
86
+ commaHelper (before + [chunk]), after[1..-1]
87
+ elsif head[:text] == ','
88
+ commaHelper before, ((resolveCommaHelper cursor[1..-1]) + after[1..-1])
89
+ else
90
+ chunk = resolveCommaHelper cursor
91
+ commaHelper (before + [chunk]), after[1..-1]
92
+ end
93
+ else
94
+ commaHelper (before + [cursor]), after[1..-1]
95
+ end
96
+ end
97
+
98
+ def resolveCommaHelper(xs)
99
+ if xs.length == 0
100
+ return xs
101
+ end
102
+ commaHelper [], xs
103
+ end
data/test.rb ADDED
@@ -0,0 +1,36 @@
1
+
2
+ require "json"
3
+
4
+ $LOAD_PATH.unshift("#{File.dirname(__FILE__)}/lib")
5
+
6
+ require 'cirru/parser'
7
+
8
+ names = [
9
+ 'comma',
10
+ 'demo',
11
+ 'folding',
12
+ 'html',
13
+ 'indent',
14
+ 'line',
15
+ 'parentheses',
16
+ 'quote',
17
+ 'spaces',
18
+ 'unfolding'
19
+ ]
20
+
21
+ def test(name)
22
+ code = IO.read "examples/#{name}.cirru"
23
+ ast = Cirru::Parser.pare(code, 'file')
24
+ genereated = JSON.generate ast
25
+ expected = JSON.generate JSON.parse(IO.read("ast/#{name}.json"))
26
+ if genereated == expected
27
+ print "\nok:\t", name
28
+ else
29
+ print "\nfailed:\t", name
30
+ print genereated
31
+ end
32
+ end
33
+
34
+ names.each do |name|
35
+ test name
36
+ end
metadata ADDED
@@ -0,0 +1,116 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cirru-parser
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - jiyinyiyong
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-04-24 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.7'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: json
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.3.16
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.3.16
55
+ description: Manually convert cirru-parser into Ruby
56
+ email:
57
+ - jiyinyiyong@gmail.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - ".gitignore"
63
+ - Gemfile
64
+ - LICENSE.txt
65
+ - README.md
66
+ - Rakefile
67
+ - ast/comma.json
68
+ - ast/demo.json
69
+ - ast/folding.json
70
+ - ast/html.json
71
+ - ast/indent.json
72
+ - ast/line.json
73
+ - ast/parentheses.json
74
+ - ast/quote.json
75
+ - ast/spaces.json
76
+ - ast/unfolding.json
77
+ - cirru-parser.gemspec
78
+ - examples/comma.cirru
79
+ - examples/demo.cirru
80
+ - examples/folding.cirru
81
+ - examples/html.cirru
82
+ - examples/indent.cirru
83
+ - examples/line.cirru
84
+ - examples/parentheses.cirru
85
+ - examples/quote.cirru
86
+ - examples/spaces.cirru
87
+ - examples/unfolding.cirru
88
+ - lib/cirru/parser.rb
89
+ - lib/cirru/parser/version.rb
90
+ - lib/cirru/tree.rb
91
+ - test.rb
92
+ homepage: http://cirru.org
93
+ licenses:
94
+ - MIT
95
+ metadata: {}
96
+ post_install_message:
97
+ rdoc_options: []
98
+ require_paths:
99
+ - lib
100
+ required_ruby_version: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ required_rubygems_version: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ requirements: []
111
+ rubyforge_project:
112
+ rubygems_version: 2.0.14
113
+ signing_key:
114
+ specification_version: 4
115
+ summary: Cirru Parser in Ruby
116
+ test_files: []