sexpr 0.2.0 → 0.3.0

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.
Files changed (83) hide show
  1. data/CHANGELOG.md +24 -1
  2. data/Gemfile +1 -0
  3. data/Gemfile.lock +2 -0
  4. data/LICENCE.md +1 -1
  5. data/Manifest.txt +1 -0
  6. data/README.md +46 -31
  7. data/examples/bool_expr/bool_expr.citrus +72 -0
  8. data/examples/bool_expr/bool_expr.rb +86 -0
  9. data/examples/bool_expr/bool_expr.sexp.yml +23 -0
  10. data/lib/sexpr.rb +27 -20
  11. data/lib/sexpr/errors.rb +15 -0
  12. data/lib/sexpr/grammar.rb +21 -77
  13. data/lib/sexpr/grammar/matching.rb +56 -0
  14. data/lib/sexpr/grammar/options.rb +53 -0
  15. data/lib/sexpr/grammar/parsing.rb +20 -0
  16. data/lib/sexpr/grammar/tagging.rb +49 -0
  17. data/lib/sexpr/loader.rb +0 -1
  18. data/lib/sexpr/matcher.rb +15 -0
  19. data/lib/sexpr/matcher/alternative.rb +30 -0
  20. data/lib/sexpr/matcher/many.rb +54 -0
  21. data/lib/sexpr/matcher/reference.rb +32 -0
  22. data/lib/sexpr/matcher/rule.rb +31 -0
  23. data/lib/sexpr/matcher/sequence.rb +30 -0
  24. data/lib/sexpr/matcher/terminal.rb +37 -0
  25. data/lib/sexpr/node.rb +16 -0
  26. data/lib/sexpr/parser.rb +48 -0
  27. data/lib/sexpr/parser/citrus.rb +67 -0
  28. data/lib/sexpr/version.rb +2 -2
  29. data/sexpr.gemspec +1 -0
  30. data/sexpr.noespec +2 -1
  31. data/spec/grammar/matching/test_compile_rule.rb +23 -0
  32. data/spec/grammar/matching/test_compile_rule_defn.rb +103 -0
  33. data/spec/grammar/options/test_install_parser.rb +36 -0
  34. data/spec/grammar/options/test_install_path.rb +19 -0
  35. data/spec/grammar/options/test_install_root.rb +27 -0
  36. data/spec/grammar/tagging/test_looks_a_sexpr.rb +20 -0
  37. data/spec/grammar/tagging/test_mod2rulename.rb +19 -0
  38. data/spec/grammar/tagging/test_rule2modname.rb +19 -0
  39. data/spec/grammar/tagging/test_tag_sexpr.rb +28 -0
  40. data/spec/grammar/test_new.rb +15 -0
  41. data/spec/grammar/test_parse.rb +27 -18
  42. data/spec/grammar/test_sexpr.rb +53 -0
  43. data/spec/{alternative → matcher/alternative}/test_eat.rb +1 -1
  44. data/spec/{alternative → matcher/alternative}/test_match_q.rb +1 -1
  45. data/spec/{many → matcher/many}/test_eat.rb +1 -1
  46. data/spec/{many → matcher/many}/test_initialize.rb +1 -1
  47. data/spec/{many → matcher/many}/test_match_q.rb +1 -1
  48. data/spec/{reference → matcher/reference}/test_eat.rb +1 -1
  49. data/spec/{reference → matcher/reference}/test_match_q.rb +1 -1
  50. data/spec/{rule → matcher/rule}/test_eat.rb +1 -1
  51. data/spec/{rule → matcher/rule}/test_match_q.rb +1 -1
  52. data/spec/{sequence → matcher/sequence}/test_eat.rb +1 -1
  53. data/spec/{sequence → matcher/sequence}/test_match_q.rb +1 -1
  54. data/spec/{terminal → matcher/terminal}/test_eat.rb +1 -1
  55. data/spec/{terminal → matcher/terminal}/test_match_q.rb +1 -1
  56. data/spec/{terminal → matcher/terminal}/test_terminal_match.rb +1 -1
  57. data/spec/node/test_sexpr_body.rb +18 -0
  58. data/spec/node/test_sexpr_type.rb +14 -0
  59. data/spec/parser/citrus/test_new.rb +28 -0
  60. data/spec/parser/citrus/test_parse.rb +40 -0
  61. data/spec/parser/citrus/test_recognize.rb +18 -0
  62. data/spec/parser/citrus/test_registration.rb +20 -0
  63. data/spec/parser/citrus/test_to_sexpr.rb +16 -0
  64. data/spec/parser/test_factor.rb +17 -0
  65. data/spec/parser/test_input_text.rb +27 -0
  66. data/spec/spec_helper.rb +18 -1
  67. data/spec/test_load.rb +40 -13
  68. data/spec/test_readme_examples.rb +40 -30
  69. data/spec/test_sexpr.rb +1 -1
  70. metadata +118 -68
  71. data/lib/sexpr/alternative.rb +0 -28
  72. data/lib/sexpr/element.rb +0 -9
  73. data/lib/sexpr/many.rb +0 -52
  74. data/lib/sexpr/reference.rb +0 -30
  75. data/lib/sexpr/rule.rb +0 -29
  76. data/lib/sexpr/sequence.rb +0 -28
  77. data/lib/sexpr/terminal.rb +0 -35
  78. data/spec/bool_expr.yml +0 -19
  79. data/spec/grammar/test_compile_rule.rb +0 -25
  80. data/spec/grammar/test_compile_rule_defn.rb +0 -98
  81. data/spec/grammar/test_fetch.rb +0 -18
  82. data/spec/grammar/test_root.rb +0 -20
  83. data/spec/test_bool_expr.rb +0 -27
@@ -4,41 +4,51 @@ describe "the README examples" do
4
4
  it 'works as announced' do
5
5
 
6
6
  grammar = Sexpr.load(<<-YAML)
7
-
8
- # alternative rule
9
- bool_expr:
10
- - bool_and
11
- - bool_or
12
- - bool_not
13
- - var_ref
14
- - literal
15
-
16
- # non-terminal
17
- bool_and:
18
- - [ bool_expr, bool_expr ]
19
- bool_or:
20
- - [ bool_expr, bool_expr ]
21
- bool_not:
22
- - [ bool_expr ]
23
- literal:
24
- - [ truth_value ]
25
- var_ref:
26
- - [ var_name ]
27
-
28
- # terminals
29
- var_name:
30
- !ruby/regexp /^[a-z]+$/
31
- truth_value:
32
- - true
33
- - false
34
-
7
+ rules:
8
+ # alternative rule
9
+ bool_expr:
10
+ - bool_and
11
+ - bool_or
12
+ - bool_not
13
+ - var_ref
14
+ - bool_lit
15
+
16
+ # non-terminal
17
+ bool_and:
18
+ - [ bool_expr, bool_expr ]
19
+ bool_or:
20
+ - [ bool_expr, bool_expr ]
21
+ bool_not:
22
+ - [ bool_expr ]
23
+ bool_lit:
24
+ - [ truth_value ]
25
+ var_ref:
26
+ - [ var_name ]
27
+
28
+ # terminals
29
+ var_name:
30
+ !ruby/regexp /^[a-z]+$/
31
+ truth_value:
32
+ - true
33
+ - false
35
34
  YAML
36
35
 
37
- f = (grammar === [:bool_and, [:bool_not, [:var_ref, "x"]], [:literal, true]])
36
+ # the grammar can be used to verify the structure of s-expressions
37
+ f = (grammar === [:bool_and, [:bool_not, [:var_ref, "x"]], [:bool_lit, true]])
38
38
  f.should be_true
39
39
 
40
- f = (grammar === [:bool_and, [:literal, "true"]])
40
+ f = (grammar === [:bool_and, [:bool_lit, "true"]])
41
41
  f.should be_false
42
+
43
+ # the grammar can also be used to automatically have support on top of
44
+ # such s-expressions
45
+ expr = grammar.sexpr([:bool_lit, true])
46
+
47
+ (expr.sexpr_type).should eq(:bool_lit)
48
+ # => :bool_lit
49
+
50
+ (expr.sexpr_body).should eq([true])
51
+ # => [true]
42
52
  end
43
53
 
44
54
  end
@@ -5,4 +5,4 @@ describe Sexpr do
5
5
  Sexpr.const_defined?(:VERSION).should be_true
6
6
  end
7
7
 
8
- end
8
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sexpr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-02-21 00:00:00.000000000Z
12
+ date: 2012-02-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: epath
16
- requirement: &74756970 !ruby/object:Gem::Requirement
16
+ requirement: &70125157365880 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,21 @@ dependencies:
21
21
  version: 0.0.1
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *74756970
24
+ version_requirements: *70125157365880
25
+ - !ruby/object:Gem::Dependency
26
+ name: citrus
27
+ requirement: &70125157365260 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: '2.4'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *70125157365260
25
36
  - !ruby/object:Gem::Dependency
26
37
  name: rake
27
- requirement: &74756420 !ruby/object:Gem::Requirement
38
+ requirement: &70125157364640 !ruby/object:Gem::Requirement
28
39
  none: false
29
40
  requirements:
30
41
  - - ~>
@@ -32,10 +43,10 @@ dependencies:
32
43
  version: 0.9.2
33
44
  type: :development
34
45
  prerelease: false
35
- version_requirements: *74756420
46
+ version_requirements: *70125157364640
36
47
  - !ruby/object:Gem::Dependency
37
48
  name: rspec
38
- requirement: &74755120 !ruby/object:Gem::Requirement
49
+ requirement: &70125157383820 !ruby/object:Gem::Requirement
39
50
  none: false
40
51
  requirements:
41
52
  - - ~>
@@ -43,10 +54,10 @@ dependencies:
43
54
  version: 2.8.0
44
55
  type: :development
45
56
  prerelease: false
46
- version_requirements: *74755120
57
+ version_requirements: *70125157383820
47
58
  - !ruby/object:Gem::Dependency
48
59
  name: wlang
49
- requirement: &74648330 !ruby/object:Gem::Requirement
60
+ requirement: &70125157383220 !ruby/object:Gem::Requirement
50
61
  none: false
51
62
  requirements:
52
63
  - - ~>
@@ -54,7 +65,7 @@ dependencies:
54
65
  version: 0.10.2
55
66
  type: :development
56
67
  prerelease: false
57
- version_requirements: *74648330
68
+ version_requirements: *70125157383220
58
69
  description: Sexpr helps manipulating s-expressions in ruby.
59
70
  email:
60
71
  - blambeau@gmail.com
@@ -70,53 +81,78 @@ files:
70
81
  - CHANGELOG.md
71
82
  - Gemfile
72
83
  - Gemfile.lock
73
- - lib/sexpr.rb
74
- - lib/sexpr/element.rb
75
- - lib/sexpr/terminal.rb
76
- - lib/sexpr/rule.rb
84
+ - examples/bool_expr/bool_expr.citrus
85
+ - examples/bool_expr/bool_expr.rb
86
+ - examples/bool_expr/bool_expr.sexp.yml
87
+ - lib/sexpr/errors.rb
88
+ - lib/sexpr/grammar/matching.rb
89
+ - lib/sexpr/grammar/options.rb
90
+ - lib/sexpr/grammar/parsing.rb
91
+ - lib/sexpr/grammar/tagging.rb
77
92
  - lib/sexpr/grammar.rb
78
- - lib/sexpr/alternative.rb
79
- - lib/sexpr/sequence.rb
80
93
  - lib/sexpr/loader.rb
81
- - lib/sexpr/reference.rb
82
- - lib/sexpr/many.rb
94
+ - lib/sexpr/matcher/alternative.rb
95
+ - lib/sexpr/matcher/many.rb
96
+ - lib/sexpr/matcher/reference.rb
97
+ - lib/sexpr/matcher/rule.rb
98
+ - lib/sexpr/matcher/sequence.rb
99
+ - lib/sexpr/matcher/terminal.rb
100
+ - lib/sexpr/matcher.rb
101
+ - lib/sexpr/node.rb
102
+ - lib/sexpr/parser/citrus.rb
103
+ - lib/sexpr/parser.rb
83
104
  - lib/sexpr/version.rb
105
+ - lib/sexpr.rb
84
106
  - LICENCE.md
85
107
  - Manifest.txt
86
108
  - Rakefile
87
109
  - README.md
88
- - spec/spec_helper.rb
89
- - spec/bool_expr.yml
90
- - spec/reference/test_eat.rb
91
- - spec/reference/test_match_q.rb
110
+ - spec/grammar/matching/test_compile_rule.rb
111
+ - spec/grammar/matching/test_compile_rule_defn.rb
112
+ - spec/grammar/options/test_install_parser.rb
113
+ - spec/grammar/options/test_install_path.rb
114
+ - spec/grammar/options/test_install_root.rb
115
+ - spec/grammar/tagging/test_looks_a_sexpr.rb
116
+ - spec/grammar/tagging/test_mod2rulename.rb
117
+ - spec/grammar/tagging/test_rule2modname.rb
118
+ - spec/grammar/tagging/test_tag_sexpr.rb
119
+ - spec/grammar/test_new.rb
120
+ - spec/grammar/test_parse.rb
121
+ - spec/grammar/test_sexpr.rb
92
122
  - spec/grammar.yml
93
- - spec/rule/test_eat.rb
94
- - spec/rule/test_match_q.rb
95
- - spec/many/test_eat.rb
96
- - spec/many/test_initialize.rb
97
- - spec/many/test_match_q.rb
98
- - spec/test_sexpr.rb
123
+ - spec/matcher/alternative/test_eat.rb
124
+ - spec/matcher/alternative/test_match_q.rb
125
+ - spec/matcher/many/test_eat.rb
126
+ - spec/matcher/many/test_initialize.rb
127
+ - spec/matcher/many/test_match_q.rb
128
+ - spec/matcher/reference/test_eat.rb
129
+ - spec/matcher/reference/test_match_q.rb
130
+ - spec/matcher/rule/test_eat.rb
131
+ - spec/matcher/rule/test_match_q.rb
132
+ - spec/matcher/sequence/test_eat.rb
133
+ - spec/matcher/sequence/test_match_q.rb
134
+ - spec/matcher/terminal/test_eat.rb
135
+ - spec/matcher/terminal/test_match_q.rb
136
+ - spec/matcher/terminal/test_terminal_match.rb
137
+ - spec/node/test_sexpr_body.rb
138
+ - spec/node/test_sexpr_type.rb
139
+ - spec/parser/citrus/test_new.rb
140
+ - spec/parser/citrus/test_parse.rb
141
+ - spec/parser/citrus/test_recognize.rb
142
+ - spec/parser/citrus/test_registration.rb
143
+ - spec/parser/citrus/test_to_sexpr.rb
144
+ - spec/parser/test_factor.rb
145
+ - spec/parser/test_input_text.rb
146
+ - spec/spec_helper.rb
99
147
  - spec/test_load.rb
100
- - spec/sequence/test_eat.rb
101
- - spec/sequence/test_match_q.rb
102
- - spec/grammar/test_compile_rule.rb
103
- - spec/grammar/test_root.rb
104
- - spec/grammar/test_fetch.rb
105
- - spec/grammar/test_compile_rule_defn.rb
106
- - spec/grammar/test_parse.rb
107
- - spec/test_bool_expr.rb
108
148
  - spec/test_readme_examples.rb
109
- - spec/terminal/test_eat.rb
110
- - spec/terminal/test_terminal_match.rb
111
- - spec/terminal/test_match_q.rb
112
- - spec/alternative/test_eat.rb
113
- - spec/alternative/test_match_q.rb
149
+ - spec/test_sexpr.rb
114
150
  - tasks/debug_mail.rake
115
- - tasks/yard.rake
151
+ - tasks/debug_mail.txt
116
152
  - tasks/gem.rake
117
153
  - tasks/spec_test.rake
118
154
  - tasks/unit_test.rake
119
- - tasks/debug_mail.txt
155
+ - tasks/yard.rake
120
156
  homepage: https://github.com/blambeau/sexp
121
157
  licenses: []
122
158
  post_install_message:
@@ -131,7 +167,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
131
167
  version: '0'
132
168
  segments:
133
169
  - 0
134
- hash: 972369935
170
+ hash: -235845001447098495
135
171
  required_rubygems_version: !ruby/object:Gem::Requirement
136
172
  none: false
137
173
  requirements:
@@ -140,34 +176,48 @@ required_rubygems_version: !ruby/object:Gem::Requirement
140
176
  version: '0'
141
177
  requirements: []
142
178
  rubyforge_project:
143
- rubygems_version: 1.8.15
179
+ rubygems_version: 1.8.10
144
180
  signing_key:
145
181
  specification_version: 3
146
182
  summary: A compilation framework around s-expressions
147
183
  test_files:
148
- - spec/spec_helper.rb
149
- - spec/bool_expr.yml
150
- - spec/reference/test_eat.rb
151
- - spec/reference/test_match_q.rb
184
+ - spec/grammar/matching/test_compile_rule.rb
185
+ - spec/grammar/matching/test_compile_rule_defn.rb
186
+ - spec/grammar/options/test_install_parser.rb
187
+ - spec/grammar/options/test_install_path.rb
188
+ - spec/grammar/options/test_install_root.rb
189
+ - spec/grammar/tagging/test_looks_a_sexpr.rb
190
+ - spec/grammar/tagging/test_mod2rulename.rb
191
+ - spec/grammar/tagging/test_rule2modname.rb
192
+ - spec/grammar/tagging/test_tag_sexpr.rb
193
+ - spec/grammar/test_new.rb
194
+ - spec/grammar/test_parse.rb
195
+ - spec/grammar/test_sexpr.rb
152
196
  - spec/grammar.yml
153
- - spec/rule/test_eat.rb
154
- - spec/rule/test_match_q.rb
155
- - spec/many/test_eat.rb
156
- - spec/many/test_initialize.rb
157
- - spec/many/test_match_q.rb
158
- - spec/test_sexpr.rb
197
+ - spec/matcher/alternative/test_eat.rb
198
+ - spec/matcher/alternative/test_match_q.rb
199
+ - spec/matcher/many/test_eat.rb
200
+ - spec/matcher/many/test_initialize.rb
201
+ - spec/matcher/many/test_match_q.rb
202
+ - spec/matcher/reference/test_eat.rb
203
+ - spec/matcher/reference/test_match_q.rb
204
+ - spec/matcher/rule/test_eat.rb
205
+ - spec/matcher/rule/test_match_q.rb
206
+ - spec/matcher/sequence/test_eat.rb
207
+ - spec/matcher/sequence/test_match_q.rb
208
+ - spec/matcher/terminal/test_eat.rb
209
+ - spec/matcher/terminal/test_match_q.rb
210
+ - spec/matcher/terminal/test_terminal_match.rb
211
+ - spec/node/test_sexpr_body.rb
212
+ - spec/node/test_sexpr_type.rb
213
+ - spec/parser/citrus/test_new.rb
214
+ - spec/parser/citrus/test_parse.rb
215
+ - spec/parser/citrus/test_recognize.rb
216
+ - spec/parser/citrus/test_registration.rb
217
+ - spec/parser/citrus/test_to_sexpr.rb
218
+ - spec/parser/test_factor.rb
219
+ - spec/parser/test_input_text.rb
220
+ - spec/spec_helper.rb
159
221
  - spec/test_load.rb
160
- - spec/sequence/test_eat.rb
161
- - spec/sequence/test_match_q.rb
162
- - spec/grammar/test_compile_rule.rb
163
- - spec/grammar/test_root.rb
164
- - spec/grammar/test_fetch.rb
165
- - spec/grammar/test_compile_rule_defn.rb
166
- - spec/grammar/test_parse.rb
167
- - spec/test_bool_expr.rb
168
222
  - spec/test_readme_examples.rb
169
- - spec/terminal/test_eat.rb
170
- - spec/terminal/test_terminal_match.rb
171
- - spec/terminal/test_match_q.rb
172
- - spec/alternative/test_eat.rb
173
- - spec/alternative/test_match_q.rb
223
+ - spec/test_sexpr.rb
@@ -1,28 +0,0 @@
1
- module Sexpr
2
- class Alternative
3
- include Element
4
-
5
- attr_reader :terms
6
-
7
- def initialize(terms)
8
- @terms = terms
9
- end
10
-
11
- def match?(sexp)
12
- terms.any?{|t| t.match?(sexp)}
13
- end
14
-
15
- def eat(sexp)
16
- @terms.each do |alt|
17
- res = alt.eat(sexp)
18
- return res if res
19
- end
20
- nil
21
- end
22
-
23
- def inspect
24
- "(alt #{terms.inspect})"
25
- end
26
-
27
- end # class Alternative
28
- end # module Sexpr
@@ -1,9 +0,0 @@
1
- module Sexpr
2
- module Element
3
-
4
- def ===(sexp)
5
- match?(sexp)
6
- end
7
-
8
- end # module Sexpr
9
- end # module Sexpr
@@ -1,52 +0,0 @@
1
- module Sexpr
2
- class Many
3
- include Element
4
-
5
- attr_reader :term, :min, :max
6
-
7
- def initialize(term, min, max = nil)
8
- @term = term
9
- @min, @max = minmax(min, max)
10
- end
11
-
12
- def match?(sexp)
13
- return nil unless sexp.is_a?(Array)
14
- eat = eat(sexp)
15
- eat && eat.empty?
16
- end
17
-
18
- def eat(sexp)
19
- i, last = 0, sexp
20
- while sexp && (@max.nil? || i < @max)
21
- if res = @term.eat(sexp)
22
- last = res
23
- i += 1
24
- end
25
- sexp = res
26
- end
27
- i >= @min ? last : nil
28
- end
29
-
30
- def inspect
31
- "(many #{term.inspect}, #{min}, #{max})"
32
- end
33
-
34
- private
35
-
36
- def minmax(min, max)
37
- case min
38
- when Integer
39
- [min, max]
40
- when '?'
41
- [0, 1]
42
- when '+'
43
- [1, nil]
44
- when '*'
45
- [0, nil]
46
- else
47
- raise ArgumentError, "Invalid multiplicity: #{min}"
48
- end
49
- end
50
-
51
- end # class Sequence
52
- end # module Sexpr