elparser 0.0.1 → 0.0.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c146b65d433ec89e7357565a95dcca4381c2f6e6
4
- data.tar.gz: 7dadc1c9fa424b5ca8586cc523477924c93fb4bc
3
+ metadata.gz: 2c391d3c3b15b4a4fdceb3e25866aadce77cde8c
4
+ data.tar.gz: ec18d9c6a518d140df97f54b4c7a352483ba303e
5
5
  SHA512:
6
- metadata.gz: 30307d68b5b13a897f237588d75a1330db7d25b008ad633bdcd1efdb327f6f545ce38fb5f2e35699759b1f4a75d12765cb6f3a3fec331a6d3ed7ccfcb41e5cce
7
- data.tar.gz: 1d6d2343058ee730d581b940ee7bb371e3f0d9ce8da85a1b0f577f77ccd7fb33560249fbd0b498884863f531a94d64f01b146191132ccb5794c95003792ff46f
6
+ metadata.gz: 7765f3e41cf5d867464a93328e5d9c3e4de947d17c3e4411f40447eceae16793dbd99edc0e56b738928f5c18f3dcde4c261e2dad6eb2a9f3f73e4684e534191f
7
+ data.tar.gz: 556107b0ce54435da3b0c7bc1dee040cb9eec94fa2d8b35241802e9a4384341a787fed346bae29b8d4e52c64c93f836ce20aa635d621b79de7632e8040ab6e96
data/README.md CHANGED
@@ -94,8 +94,8 @@ A quoted expression is translated to an array.
94
94
  Both `nil` and `()` are translated to `nil`.
95
95
  Cons cells and lists are translated to arrays.
96
96
 
97
- | type | S-exp (input) | Ruby (output) |
98
- |------------------+---------------------+---------------------|
97
+ | type | S-exp (input) | Ruby (output) |
98
+ |------------------|---------------------|---------------------|
99
99
  | integer | `1` | `1` |
100
100
  | float | `1.2` | `1.2` |
101
101
  | float | `1e4` | `1e4` |
@@ -122,7 +122,7 @@ such S-expressions with creating instances of `SExpCons` and
122
122
  `SExpQuoted` directly and calling the `to_s` method.
123
123
 
124
124
  | type | Ruby (input) | S-exp (output) |
125
- |------------+------------------------------------------+------------------------------|
125
+ |------------|------------------------------------------|------------------------------|
126
126
  | primitive | `[1,1.2,-4,"xxx",:www,true,nil]` | `(1 1.2 -4 "xxx" www t nil)` |
127
127
  | empty list | `[]` | `nil` |
128
128
  | nest list | `[1,[2,[3,4]]]` | `(1 (2 (3 4)))` |
data/elparser.gemspec CHANGED
@@ -19,8 +19,8 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
  spec.extra_rdoc_files = ['readme.html']
21
21
 
22
+ spec.add_runtime_dependency "racc", "~> 1.4"
22
23
  spec.add_development_dependency "bundler", "~> 1.7"
23
24
  spec.add_development_dependency "rake", "~> 10.0"
24
- spec.add_development_dependency "racc", "~> 1.4"
25
25
  spec.add_development_dependency "test-unit", "~> 3.0"
26
26
  end
@@ -0,0 +1,244 @@
1
+ #
2
+ # DO NOT MODIFY!!!!
3
+ # This file is automatically generated by Racc 1.4.12
4
+ # from Racc grammer file "".
5
+ #
6
+
7
+ require 'racc/parser.rb'
8
+ module Elparser
9
+ class Parser < Racc::Parser
10
+ ##### State transition tables begin ###
11
+
12
+ racc_action_table = [
13
+ 10, 21, 11, 12, 16, 13, 14, 15, 10, 26,
14
+ 11, 12, nil, 13, 14, 15, 10, 19, 11, 12,
15
+ nil, 13, 14, 15, 10, nil, 11, 12, nil, 13,
16
+ 14, 15, 10, 24, 11, 12, 23, 13, 14, 15 ]
17
+
18
+ racc_action_check = [
19
+ 0, 16, 0, 0, 1, 0, 0, 0, 23, 25,
20
+ 23, 23, nil, 23, 23, 23, 10, 10, 10, 10,
21
+ nil, 10, 10, 10, 13, nil, 13, 13, nil, 13,
22
+ 13, 13, 18, 18, 18, 18, 18, 18, 18, 18 ]
23
+
24
+ racc_action_pointer = [
25
+ -2, 4, nil, nil, nil, nil, nil, nil, nil, nil,
26
+ 14, nil, nil, 22, nil, nil, 1, nil, 30, nil,
27
+ nil, nil, nil, 6, nil, 6, nil ]
28
+
29
+ racc_action_default = [
30
+ -19, -19, -1, -2, -3, -4, -5, -6, -7, -8,
31
+ -19, -12, -13, -19, -17, -18, -19, -9, -19, -11,
32
+ -16, 27, -10, -19, -15, -19, -14 ]
33
+
34
+ racc_goto_table = [
35
+ 2, 1, 18, nil, nil, nil, nil, nil, nil, nil,
36
+ 17, nil, nil, 20, nil, nil, nil, nil, 22, nil,
37
+ nil, nil, nil, 25 ]
38
+
39
+ racc_goto_check = [
40
+ 2, 1, 10, nil, nil, nil, nil, nil, nil, nil,
41
+ 2, nil, nil, 2, nil, nil, nil, nil, 2, nil,
42
+ nil, nil, nil, 2 ]
43
+
44
+ racc_goto_pointer = [
45
+ nil, 1, 0, nil, nil, nil, nil, nil, nil, nil,
46
+ -8 ]
47
+
48
+ racc_goto_default = [
49
+ nil, nil, nil, 3, 4, 5, 6, 7, 8, 9,
50
+ nil ]
51
+
52
+ racc_reduce_table = [
53
+ 0, 0, :racc_error,
54
+ 1, 11, :_reduce_1,
55
+ 1, 12, :_reduce_none,
56
+ 1, 12, :_reduce_none,
57
+ 1, 12, :_reduce_none,
58
+ 1, 12, :_reduce_none,
59
+ 1, 12, :_reduce_none,
60
+ 1, 12, :_reduce_none,
61
+ 1, 12, :_reduce_none,
62
+ 1, 20, :_reduce_9,
63
+ 2, 20, :_reduce_10,
64
+ 2, 13, :_reduce_11,
65
+ 1, 14, :_reduce_12,
66
+ 1, 14, :_reduce_13,
67
+ 5, 15, :_reduce_14,
68
+ 3, 18, :_reduce_15,
69
+ 2, 19, :_reduce_16,
70
+ 1, 16, :_reduce_17,
71
+ 1, 17, :_reduce_18 ]
72
+
73
+ racc_reduce_n = 19
74
+
75
+ racc_shift_n = 27
76
+
77
+ racc_token_table = {
78
+ false => 0,
79
+ :error => 1,
80
+ "(" => 2,
81
+ ")" => 3,
82
+ :INTEGER => 4,
83
+ :FLOAT => 5,
84
+ "." => 6,
85
+ "'" => 7,
86
+ :SYMBOL => 8,
87
+ :STRING => 9 }
88
+
89
+ racc_nt_base = 10
90
+
91
+ racc_use_result_var = true
92
+
93
+ Racc_arg = [
94
+ racc_action_table,
95
+ racc_action_check,
96
+ racc_action_default,
97
+ racc_action_pointer,
98
+ racc_goto_table,
99
+ racc_goto_check,
100
+ racc_goto_default,
101
+ racc_goto_pointer,
102
+ racc_nt_base,
103
+ racc_reduce_table,
104
+ racc_token_table,
105
+ racc_shift_n,
106
+ racc_reduce_n,
107
+ racc_use_result_var ]
108
+
109
+ Racc_token_to_s_table = [
110
+ "$end",
111
+ "error",
112
+ "\"(\"",
113
+ "\")\"",
114
+ "INTEGER",
115
+ "FLOAT",
116
+ "\".\"",
117
+ "\"'\"",
118
+ "SYMBOL",
119
+ "STRING",
120
+ "$start",
121
+ "target",
122
+ "sexp",
123
+ "nil",
124
+ "val",
125
+ "cons",
126
+ "symbol",
127
+ "string",
128
+ "list",
129
+ "quoted",
130
+ "sexp_seq" ]
131
+
132
+ Racc_debug_parser = false
133
+
134
+ ##### State transition tables end #####
135
+
136
+ # reduce 0 omitted
137
+
138
+ module_eval(<<'.,.,', 'parser.y', 3)
139
+ def _reduce_1(val, _values, result)
140
+
141
+ result
142
+ end
143
+ .,.,
144
+
145
+ # reduce 2 omitted
146
+
147
+ # reduce 3 omitted
148
+
149
+ # reduce 4 omitted
150
+
151
+ # reduce 5 omitted
152
+
153
+ # reduce 6 omitted
154
+
155
+ # reduce 7 omitted
156
+
157
+ # reduce 8 omitted
158
+
159
+ module_eval(<<'.,.,', 'parser.y', 7)
160
+ def _reduce_9(val, _values, result)
161
+ result = [val[0]]
162
+ result
163
+ end
164
+ .,.,
165
+
166
+ module_eval(<<'.,.,', 'parser.y', 8)
167
+ def _reduce_10(val, _values, result)
168
+ result << val[1]
169
+ result
170
+ end
171
+ .,.,
172
+
173
+ module_eval(<<'.,.,', 'parser.y', 11)
174
+ def _reduce_11(val, _values, result)
175
+ result = SExpNil.new
176
+
177
+ result
178
+ end
179
+ .,.,
180
+
181
+ module_eval(<<'.,.,', 'parser.y', 14)
182
+ def _reduce_12(val, _values, result)
183
+ result = SExpNumber.int(val[0])
184
+ result
185
+ end
186
+ .,.,
187
+
188
+ module_eval(<<'.,.,', 'parser.y', 15)
189
+ def _reduce_13(val, _values, result)
190
+ result = SExpNumber.float(val[0])
191
+ result
192
+ end
193
+ .,.,
194
+
195
+ module_eval(<<'.,.,', 'parser.y', 18)
196
+ def _reduce_14(val, _values, result)
197
+ if val[1].size == 1 then
198
+ result = SExpCons.new(val[1][0], val[3])
199
+ else
200
+ result = SExpListDot.new(val[1], val[3])
201
+ end
202
+
203
+ result
204
+ end
205
+ .,.,
206
+
207
+ module_eval(<<'.,.,', 'parser.y', 26)
208
+ def _reduce_15(val, _values, result)
209
+ result = SExpList.new(val[1])
210
+
211
+ result
212
+ end
213
+ .,.,
214
+
215
+ module_eval(<<'.,.,', 'parser.y', 30)
216
+ def _reduce_16(val, _values, result)
217
+ result = SExpQuoted.new(val[1])
218
+
219
+ result
220
+ end
221
+ .,.,
222
+
223
+ module_eval(<<'.,.,', 'parser.y', 34)
224
+ def _reduce_17(val, _values, result)
225
+ result = SExpSymbol.new(val[0])
226
+
227
+ result
228
+ end
229
+ .,.,
230
+
231
+ module_eval(<<'.,.,', 'parser.y', 38)
232
+ def _reduce_18(val, _values, result)
233
+ result = SExpString.new(val[0])
234
+
235
+ result
236
+ end
237
+ .,.,
238
+
239
+ def _reduce_none(val, _values, result)
240
+ val[0]
241
+ end
242
+
243
+ end # class Parser
244
+ end # module Elparser
@@ -0,0 +1,42 @@
1
+ class Elparser::Parser
2
+
3
+ rule
4
+ target: sexp {}
5
+
6
+ sexp: nil | val | cons | symbol | string | list | quoted;
7
+
8
+ sexp_seq: sexp { result = [val[0]] }
9
+ | sexp_seq sexp { result << val[1] }
10
+
11
+ nil: "(" ")" {
12
+ result = SExpNil.new
13
+ }
14
+
15
+ val: INTEGER { result = SExpNumber.int(val[0])}
16
+ | FLOAT { result = SExpNumber.float(val[0])}
17
+
18
+ cons: "(" sexp_seq "." sexp ")" {
19
+ if val[1].size == 1 then
20
+ result = SExpCons.new(val[1][0], val[3])
21
+ else
22
+ result = SExpListDot.new(val[1], val[3])
23
+ end
24
+ }
25
+
26
+ list: "(" sexp_seq ")" {
27
+ result = SExpList.new(val[1])
28
+ }
29
+
30
+ quoted: "'" sexp {
31
+ result = SExpQuoted.new(val[1])
32
+ }
33
+
34
+ symbol: SYMBOL {
35
+ result = SExpSymbol.new(val[0])
36
+ }
37
+
38
+ string: STRING {
39
+ result = SExpString.new(val[0])
40
+ }
41
+
42
+ end
@@ -1,3 +1,3 @@
1
1
  module Elparser
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -0,0 +1,174 @@
1
+ #!/usr/bin/ruby
2
+
3
+ require 'test/unit'
4
+ require 'elparser'
5
+
6
+ STDOUT.sync = true
7
+
8
+ include Elparser
9
+
10
+ # short cut functions
11
+
12
+ def _int(v)
13
+ SExpNumber.int(v.to_s)
14
+ end
15
+ def _float(v)
16
+ SExpNumber.float(v.to_s)
17
+ end
18
+ def _symbol(v)
19
+ SExpSymbol.new(v)
20
+ end
21
+ def _string(v)
22
+ SExpString.new(v)
23
+ end
24
+ def _nil
25
+ SExpNil.new
26
+ end
27
+ def _cons(a,b)
28
+ SExpCons.new(a,b)
29
+ end
30
+ def _list(*args)
31
+ SExpList.new(args)
32
+ end
33
+ def _dotlist(a,b)
34
+ SExpListDot.new(a,b)
35
+ end
36
+ def _q(a)
37
+ SExpQuoted.new(a)
38
+ end
39
+
40
+
41
+
42
+ class TestElparser < Test::Unit::TestCase
43
+
44
+ setup do
45
+ @parser = Elparser::Parser.new
46
+ end
47
+
48
+
49
+
50
+ sub_test_case "Decoder" do
51
+
52
+ sub_test_case "Primitive Decoder" do
53
+
54
+ data({
55
+ 'integer' => ['123', _int("123")],
56
+ 'unary-' => ['-22', _int("-22")],
57
+ 'unary+' => ['+33', _int("+33")],
58
+ 'float' => ['1.23', _float("1.23")],
59
+ 'float period' => ['.45', _float(".45")],
60
+ 'float exp+' => ['1.4e5', _float("1.4e5")],
61
+ 'float exp-' => ['1.4e-5', _float("1.4e-5")],
62
+ 'symbol' => ['abc', _symbol('abc')],
63
+ 'symbol2' => ['$sf-/p.post', _symbol('$sf-/p.post')],
64
+ 'string' => ['"qwert"', _string("qwert")],
65
+ 'string2' => ['"abc\"dds\"dfff\'123\' \\n\nok?"', _string('abc\"dds\"dfff\'123\' \\n\nok?')],
66
+ 'quote' => ['\'symbol', _q(_symbol('symbol'))],
67
+ 'nil' => ['nil', _nil],
68
+ })
69
+ def test_primitive(data)
70
+ src, expected = data
71
+ assert_equal expected, @parser.parse(src)
72
+ end
73
+
74
+ end
75
+
76
+ sub_test_case "List Structure" do
77
+
78
+ data({
79
+ "nil list" => ["()", _nil],
80
+ "list1" => ["(1)", _list(_int(1))],
81
+ "list2" => ["(1 2)",_list(_int(1),_int(2))],
82
+ "nest list1" => ["(1 (2 3) 4)",_list(_int(1),_list(_int(2),_int(3)),_int(4))],
83
+ "nest list2" => ["(((1)))",_list(_list(_list(_int(1))))],
84
+ "type values" => ["(1 'a \"b\" ())",_list(_int(1),_q(_symbol("a")),_string("b"),_nil)],
85
+ "calc terms" => ["(+ 1 2 (- 2 (* 3 4)))",_list(_symbol("+"),_int(1),_int(2),_list(_symbol("-"),_int(2),_list(_symbol("*"),_int(3),_int(4))))],
86
+ "reverse cons list" => ["(((1.0) 0.2) 3.4e+4)",_list(_list(_list(_float(1.0)),_float(0.2)),_float("3.4e+4"))],
87
+ "cons cell" => ["(1 . 2)",_cons(_int(1),_int(2))],
88
+ "dot list" => ["(1 2 . 3)",_dotlist([_int(1),_int(2)],_int(3))],
89
+ })
90
+ def test_list(data)
91
+ src, expected = data
92
+ assert_equal expected, @parser.parse(src)
93
+ end
94
+
95
+ end
96
+
97
+ sub_test_case "Cons and List operation" do
98
+
99
+ def test_cons1
100
+ v = @parser.parse("(1 . 2)")
101
+ assert_equal _int(1), v.car
102
+ assert_equal _int(2), v.cdr
103
+ end
104
+
105
+ def test_list1
106
+ v = @parser.parse("(1 2 3)")
107
+ assert_equal _int(1), v.car
108
+ assert_equal _int(2), v.cdr.car
109
+ assert_equal _int(3), v.cdr.cdr.car
110
+ assert_equal _nil, v.cdr.cdr.cdr
111
+ end
112
+
113
+ def test_dotlist
114
+ v = @parser.parse("(1 2 . 3)")
115
+ assert_equal _int(1), v.car
116
+ assert_equal _int(2), v.cdr.car
117
+ assert_equal _int(3), v.cdr.cdr
118
+ end
119
+
120
+ def test_ruby_object
121
+ v = @parser.parse("(1 2.1 \"xxx\" www)")
122
+ ro = v.to_ruby
123
+ assert_equal ro.size, 4
124
+ assert_equal ro[0], 1
125
+ assert_equal ro[1], 2.1
126
+ assert_equal ro[2], "xxx"
127
+ assert_equal ro[3], :www
128
+
129
+ v = @parser.parse("(1 (2 3 (4)))")
130
+ ro = v.to_ruby
131
+ assert_equal ro.size, 2
132
+ assert_equal ro[0], 1
133
+ assert_equal ro[1][0], 2
134
+ assert_equal ro[1][1], 3
135
+ assert_equal ro[1][2][0], 4
136
+ end
137
+
138
+ def test_alist
139
+ v = @parser.parse("( (a . 1) (b . \"xxx\") (c 3 4) (\"d\" . \"e\"))")
140
+ assert_true v.alist?
141
+ hash = v.to_h
142
+ assert_equal hash[:a], 1
143
+ assert_equal hash[:b], "xxx"
144
+ assert_equal hash[:c], [3,4]
145
+ assert_equal hash["d"], "e"
146
+
147
+ v = @parser.parse("((a . 1) (b))")
148
+ assert_true v.alist?
149
+ v = @parser.parse("((a . 1) b)")
150
+ assert_false v.alist?
151
+ end
152
+
153
+ end
154
+
155
+ end
156
+
157
+
158
+
159
+ sub_test_case "Encoder" do
160
+
161
+ data({
162
+ "primitive and list" => [[1,1.2,-4,"xxx",:www,true,nil], "(1 1.2 -4 \"xxx\" www t nil)"],
163
+ "nested list" => [[1,[2,[3,4]]], "(1 (2 (3 4)))"],
164
+ "hash1" => [{"a" => "b", "c" => "d"}, "((\"a\" . \"b\") (\"c\" . \"d\"))"],
165
+ "hash2" => [{:a => [1,2,3], :b => {:c => [4,5,6]}}, "((a 1 2 3) (b (c 4 5 6)))"],
166
+ })
167
+ def test_encode(data)
168
+ src, expected = data
169
+ assert_equal(expected, Elparser.encode(src))
170
+ end
171
+
172
+ end
173
+
174
+ end
metadata CHANGED
@@ -1,57 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: elparser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - SAKURAI Masashi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-11 00:00:00.000000000 Z
11
+ date: 2015-02-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: bundler
14
+ name: racc
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.7'
20
- type: :development
19
+ version: '1.4'
20
+ type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.7'
26
+ version: '1.4'
27
27
  - !ruby/object:Gem::Dependency
28
- name: rake
28
+ name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: '1.7'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '10.0'
40
+ version: '1.7'
41
41
  - !ruby/object:Gem::Dependency
42
- name: racc
42
+ name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '1.4'
47
+ version: '10.0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '1.4'
54
+ version: '10.0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: test-unit
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -81,8 +81,11 @@ files:
81
81
  - Rakefile
82
82
  - elparser.gemspec
83
83
  - lib/elparser.rb
84
+ - lib/elparser/parser.tab.rb
85
+ - lib/elparser/parser.y
84
86
  - lib/elparser/version.rb
85
87
  - readme.html
88
+ - test/test-elparser.rb
86
89
  homepage: https://github.com/kiwanami/ruby-elparser
87
90
  licenses:
88
91
  - MIT
@@ -107,4 +110,5 @@ rubygems_version: 2.4.3
107
110
  signing_key:
108
111
  specification_version: 4
109
112
  summary: A parser for S-expression of emacs lisp
110
- test_files: []
113
+ test_files:
114
+ - test/test-elparser.rb