sexpr 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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