grammar 0.5 → 0.8

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.
@@ -0,0 +1,200 @@
1
+ #!/bin/env ruby
2
+ require 'rubygems'
3
+ gem 'grammar', '0.8'
4
+ require 'test/unit'
5
+ require 'stringio'
6
+ require 'grammar'
7
+ require 'grammar/ruby'
8
+ class GrammarDemo < ::Test::Unit::TestCase
9
+ include Grammar::Molecules
10
+ def engine
11
+ Grammar::Ruby
12
+ end
13
+ def compile(gram)
14
+ #engine.dump(gram).lined
15
+ engine.compile(gram)
16
+ end
17
+ def error
18
+ RuntimeError
19
+ end
20
+ def input(s)
21
+ StringIO.new(s).method(:getc)
22
+ end
23
+
24
+ def test_digit
25
+
26
+ digit = E(?0..?9)
27
+
28
+ parser = compile(digit)
29
+
30
+ o = []
31
+ assert_equal([?1], parser[o, input("1" )] && o)
32
+ assert_equal([?1, ?2], parser[o, input("23")] && o)
33
+ assert_raise(error) { parser[o, input("" )] }
34
+ assert_raise(error) { parser[o, input("a" )] }
35
+ end
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+ def test_digits
48
+
49
+ digits = E(?0..?9).repeat1
50
+
51
+ parser = compile(digits + EOF)
52
+
53
+ assert_equal([?1], parser[o=[], input("1" )] && o)
54
+ assert_equal([?2, ?3], parser[o=[], input("23")] && o)
55
+ assert_raise(error) { parser[o=[], input("4a")] }
56
+ assert_equal([?4], o)
57
+ assert_raise(error) { parser[o=[], input("" )] }
58
+ end
59
+
60
+
61
+
62
+
63
+
64
+
65
+
66
+
67
+
68
+
69
+
70
+ def test_int
71
+
72
+ int = E(?0..?9).repeat1.group("") { |s| s.to_i }
73
+
74
+ parser = compile(int + EOF)
75
+
76
+ assert_equal([1], parser[o=[], input("1" )] && o)
77
+ assert_equal([23], parser[o=[], input("23")] && o)
78
+ end
79
+
80
+
81
+
82
+
83
+
84
+
85
+
86
+
87
+
88
+
89
+
90
+
91
+
92
+
93
+ def test_prim
94
+
95
+ int = E(?0..?9).repeat1.group("") { |s| s.to_i }
96
+ expr = Grammar()
97
+ prim = int | E(?().discard + expr + E(?)).discard
98
+
99
+ parser = compile(Recurse(expr) { prim } + EOF)
100
+
101
+ assert_equal([123], parser[o=[], input("123" )] && o)
102
+ assert_equal([123], parser[o=[], input("(123)" )] && o)
103
+ assert_equal([123], parser[o=[], input("((123))" )] && o)
104
+ assert_raise(error) { parser[o=[], input("((123)" )] }
105
+ end
106
+
107
+
108
+
109
+
110
+
111
+
112
+
113
+
114
+
115
+
116
+ def test_unary
117
+
118
+ int = E(?0..?9).repeat1.group("") { |s| s.to_i }
119
+ expr = Grammar()
120
+ prim = int | E(?().discard + expr + E(?)).discard
121
+ unary = E(?-).discard + prim + Always { |e|
122
+ e.output << -e.output.pop
123
+ } | prim
124
+
125
+ parser = compile(Recurse(expr) { unary } + EOF)
126
+
127
+ assert_equal([123], parser[o=[], input("123" )] && o)
128
+ assert_equal([123], parser[o=[], input("(123)" )] && o)
129
+ assert_equal([-123], parser[o=[], input("-123" )] && o)
130
+ assert_equal([-123], parser[o=[], input("-(123)")] && o)
131
+ end
132
+
133
+
134
+
135
+
136
+
137
+
138
+
139
+ def test_prod
140
+
141
+ int = E(?0..?9).repeat1.group("") { |s| s.to_i }
142
+ expr = Grammar()
143
+ prim = int | E(?().discard + expr + E(?)).discard
144
+ unary = E(?-).discard + prim + Always { |e|
145
+ e.output << -e.output.pop
146
+ } | prim
147
+ prod = Recurse { |prod|
148
+ prod + E(?*).discard + unary + Always { |e|
149
+ e.output << (e.output.pop * e.output.pop)
150
+ } | unary
151
+ }
152
+
153
+ parser = compile(Recurse(expr) { prod } + EOF)
154
+
155
+ assert_equal([123], parser[o=[], input("123" )] && o)
156
+ assert_equal([123], parser[o=[], input("(123)")] && o)
157
+ assert_equal([-123], parser[o=[], input("-123" )] && o)
158
+ assert_equal([6], parser[o=[], input("2*3" )] && o)
159
+ assert_equal([-6], parser[o=[], input("2*-3" )] && o)
160
+ end
161
+
162
+ def test_sum
163
+
164
+ int = E(?0..?9).repeat1.group("") { |s| s.to_i }
165
+ expr = Grammar()
166
+ prim = int | E(?().discard + expr + E(?)).discard
167
+ unary = E(?-).discard + prim + Always { |e|
168
+ e.output << -e.output.pop
169
+ } | prim
170
+ prod = Recurse { |prod|
171
+ prod + E(?*).discard + unary + Always { |e|
172
+ e.output << (e.output.pop * e.output.pop)
173
+ } | unary
174
+ }
175
+ sum = Recurse { |sum|
176
+ sum + (
177
+ E(?+).discard + prod + Always { |e|
178
+ e.output << (e.output.pop + e.output.pop)
179
+ } |
180
+ E(?-).discard + prod + Always { |e|
181
+ e.output << (-e.output.pop + e.output.pop)
182
+ }
183
+ ) | prod
184
+ }
185
+
186
+ parser = compile(Recurse(expr) { sum } + EOF)
187
+
188
+ assert_equal([123], parser[o=[], input("123" )] && o)
189
+ assert_equal([123], parser[o=[], input("(123)" )] && o)
190
+ assert_equal([-123], parser[o=[], input("-123" )] && o)
191
+ assert_equal([5], parser[o=[], input("2+3" )] && o)
192
+ assert_equal([-1], parser[o=[], input("2-3" )] && o)
193
+ assert_equal([-10], parser[o=[], input("2-3*4" )] && o)
194
+ assert_equal([14], parser[o=[], input("2*(3+4)")] && o)
195
+ assert_equal([20], parser[o=[], input("(2+3)*4")] && o)
196
+ end
197
+
198
+ end
199
+
200
+
@@ -0,0 +1,30 @@
1
+ #!/bin/env ruby
2
+
3
+ require 'test/unit'
4
+ require 'stringio'
5
+
6
+ require 'grammar'
7
+ require 'grammar/ruby'
8
+
9
+ $: << File.dirname(__FILE__)
10
+ require 'atoms'
11
+ require 'molecules'
12
+ require 'basic'
13
+ require 'advanced'
14
+ require 'composite'
15
+
16
+ class Grammar
17
+ module Test
18
+ class Ruby < ::Test::Unit::TestCase
19
+ include Atoms
20
+ include Basic
21
+ include Molecules
22
+ include Advanced
23
+ include Composite
24
+ def engine; Grammar::Ruby; end
25
+ def error; RuntimeError; end
26
+ end
27
+ end
28
+ end
29
+
30
+
@@ -0,0 +1,30 @@
1
+ #!/bin/env ruby
2
+
3
+ require 'test/unit'
4
+ require 'stringio'
5
+
6
+ require 'grammar'
7
+ require 'grammar/ruby0'
8
+
9
+ $: << File.dirname(__FILE__)
10
+ require 'atoms'
11
+ require 'molecules'
12
+ require 'basic'
13
+ require 'advanced'
14
+ require 'composite'
15
+
16
+ class Grammar
17
+ module Test
18
+ class Ruby0 < ::Test::Unit::TestCase
19
+ include Atoms
20
+ include Molecules
21
+ include Basic
22
+ include Advanced
23
+ include Composite
24
+ def engine; Grammar::Ruby0; end
25
+ def error; Grammar::Ruby0::Error; end
26
+ end
27
+ end
28
+ end
29
+
30
+
@@ -0,0 +1,30 @@
1
+ #!/bin/env ruby
2
+
3
+ require 'test/unit'
4
+ require 'stringio'
5
+
6
+ require 'grammar'
7
+ require 'grammar/ruby2cext'
8
+
9
+ $: << File.dirname(__FILE__)
10
+ require 'atoms'
11
+ require 'molecules'
12
+ require 'basic'
13
+ require 'advanced'
14
+ require 'composite'
15
+
16
+ class Grammar
17
+ module Test
18
+ class Ruby2CExt < ::Test::Unit::TestCase
19
+ include Atoms
20
+ include Basic
21
+ include Molecules
22
+ include Advanced
23
+ include Composite
24
+ def engine; Grammar::Ruby2CExt; end
25
+ def error; RuntimeError; end
26
+ end
27
+ end
28
+ end
29
+
30
+
@@ -0,0 +1,30 @@
1
+ #!/bin/env ruby
2
+
3
+ require 'test/unit'
4
+ require 'stringio'
5
+
6
+ require 'grammar'
7
+ require 'grammar/rubycall'
8
+
9
+ $: << File.dirname(__FILE__)
10
+ require 'atoms'
11
+ require 'molecules'
12
+ require 'basic'
13
+ require 'advanced'
14
+ require 'composite'
15
+
16
+ class Grammar
17
+ module Test
18
+ class RubyCall < ::Test::Unit::TestCase
19
+ include Atoms
20
+ include Basic
21
+ include Molecules
22
+ include Advanced
23
+ include Composite
24
+ def engine; Grammar::RubyCall; end
25
+ def error; RuntimeError; end
26
+ end
27
+ end
28
+ end
29
+
30
+
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.8.10
2
+ rubygems_version: 0.9.4
3
3
  specification_version: 1
4
4
  name: grammar
5
5
  version: !ruby/object:Gem::Version
6
- version: "0.5"
7
- date: 2005-10-13
6
+ version: "0.8"
7
+ date: 2008-09-05 00:00:00 -05:00
8
8
  summary: BNF-like grammar specified directly in ruby
9
9
  require_paths:
10
- - lib
10
+ - lib
11
11
  email: Eric under Mahurin at yahoo dot com
12
12
  homepage: http://rubyforge.org/projects/grammar/
13
13
  rubyforge_project: grammar
@@ -18,37 +18,54 @@ bindir:
18
18
  has_rdoc: true
19
19
  required_ruby_version: !ruby/object:Gem::Version::Requirement
20
20
  requirements:
21
- -
22
- - ">"
23
- - !ruby/object:Gem::Version
24
- version: 0.0.0
21
+ - - ">"
22
+ - !ruby/object:Gem::Version
23
+ version: 0.0.0
25
24
  version:
26
25
  platform: ruby
26
+ signing_key:
27
+ cert_chain:
28
+ post_install_message:
27
29
  authors:
28
- - Eric Mahurin
30
+ - Eric Mahurin
29
31
  files:
30
- - lib/grammar.rb
31
- - test/test_grammar.rb
32
- - samples/fact.tcl
33
- - samples/infix2postfix.rb
34
- - samples/tcl.rb
35
- - samples/test.infix
36
- - samples/CVS
32
+ - lib/grammar.rb
33
+ - lib/grammar/ruby2cext.rb
34
+ - lib/grammar/ruby0.rb
35
+ - lib/grammar/ruby.rb
36
+ - lib/grammar/rubycall.rb
37
+ - lib/grammar/ruby/code.rb
38
+ - test/molecules.rb
39
+ - test/atoms.rb
40
+ - test/test_ruby.rb
41
+ - test/advanced.rb
42
+ - test/test_ruby0.rb
43
+ - test/test_rubycall.rb
44
+ - test/composite.rb
45
+ - test/test_ruby2cext.rb
46
+ - test/test_demo.rb
47
+ - test/basic.rb
48
+ - benchmark/json.benchmark.rb
49
+ - benchmark/json.grammar.rb
50
+ - benchmark/json.grammar0_5.rb
51
+ - benchmark/json.ll1.rb
52
+ - benchmark/json.re.rb
53
+ - benchmark/json.peggy.rb
37
54
  test_files:
38
- - test/test_grammar.rb
55
+ - test/test_ruby.rb
56
+ - test/test_ruby0.rb
57
+ - test/test_rubycall.rb
58
+ - test/test_ruby2cext.rb
59
+ - test/test_demo.rb
39
60
  rdoc_options: []
61
+
40
62
  extra_rdoc_files: []
63
+
41
64
  executables: []
65
+
42
66
  extensions: []
67
+
43
68
  requirements: []
44
- dependencies:
45
- - !ruby/object:Gem::Dependency
46
- name: cursor
47
- version_requirement:
48
- version_requirements: !ruby/object:Gem::Version::Requirement
49
- requirements:
50
- -
51
- - ">="
52
- - !ruby/object:Gem::Version
53
- version: "0.9"
54
- version:
69
+
70
+ dependencies: []
71
+
@@ -1,12 +0,0 @@
1
- proc factorial a {
2
- set ret 1
3
- # factorial(0) == 1
4
- if $a {
5
- set ret [product $a [factorial \
6
- [subtract $a 1]]]
7
- }
8
- sum $ret
9
- }
10
- set x::y(1) 6
11
- concat "factorial(\"$x::y(1)\") = " [factorial $x::y(1)] "\n"
12
-
@@ -1,114 +0,0 @@
1
- #!/bin/env ruby
2
-
3
- require 'rubygems'
4
- require 'cursor/io'
5
- require 'cursor/indexed'
6
- require 'grammar'
7
- require 'duck'
8
- require 'set'
9
-
10
- class Expression
11
-
12
- def self.lexer
13
- space = Grammar::Element[Set[?\ ,?\t,?\n].
14
- duck!(:==,:include?,:to_s,:inspect)]
15
- spacing = space.discard.list1
16
-
17
- alpha = Grammar::Element[(Set[?_]+(?a..?z)+(?A..?Z)).
18
- duck!(:==,:include?,:to_s,:inspect)]
19
- alphanum = Grammar::Element[(Set[?_]+(?0..?9)+(?a..?z)+(?A..?Z)).
20
- duck!(:==,:include?,:to_s,:inspect)]
21
- identifier = (alpha+alphanum.list0).
22
- filter(String) { |iden,buf| buf << iden.to_sym }
23
-
24
- int = Grammar::Element[(?0..?9).duck!(:==,:===)].list1
25
- number =
26
- (int.group(String) +
27
- ((Grammar::Element[?.]+int).optional +
28
- ((Grammar::Element[?e]|Grammar::Element[?E])+
29
- (Grammar::Element[?+]|Grammar::Element[?-]).optional+int).optional).
30
- group(String)).
31
- filter(Array) { |num,buf|
32
- buf << (num[1].empty? ? num.to_s.to_i : num.to_s.to_f)
33
- }
34
-
35
- hex = Grammar::Element[(
36
- Set[]+(?0..?9)+(?a..?f)+(?A..?F)
37
- ).duck!(:==,:include?,:to_s,:inspect)]
38
- octal = Grammar::Element[(?0..?7).duck!(:==,:===)]
39
- backslashed = Grammar::Element[?\\].discard+(
40
- Grammar::Element[?a].filter { "\a" } |
41
- Grammar::Element[?b].filter { "\b" } |
42
- Grammar::Element[?f].filter { "\f" } |
43
- Grammar::Element[?n].filter { "\n" } |
44
- Grammar::Element[?r].filter { "\r" } |
45
- Grammar::Element[?t].filter { "\t" } |
46
- Grammar::Element[?v].filter { "\v" } |
47
- Grammar::Element[?x].discard+hex.list1.filter { |n|
48
- eval(%Q("\\x#{n}"))
49
- } |
50
- octal.list1.filter { |n|
51
- eval(%Q("\\#{n}"))
52
- } |
53
- Grammar::ANY
54
- )
55
- character =
56
- backslashed |
57
- Grammar::ANY
58
- string = Grammar::Element[?\"].discard +
59
- character.list1(Grammar::Element[?\"].discard).group(String)
60
- other = Grammar::ANY.filter(String) { |op,buf| buf << op.to_sym }
61
-
62
- (
63
- spacing |
64
- identifier |
65
- number |
66
- string |
67
- other
68
- ).list0(Grammar::EOF)
69
- end
70
-
71
- def self.parser
72
- integer = Grammar::Element[Integer.duck!(:==,:===)]
73
- float = Grammar::Element[Float.duck!(:==,:===)]
74
- string = Grammar::Element[String.duck!(:==,:===)]
75
- identifier = Grammar::Element[lambda { |v|
76
- Symbol===v && ( /\A[_a-zA-Z]/=~v.to_s )
77
- }.duck!(:==)]
78
- expression = Grammar.new { |expression|
79
- primary =
80
- integer |
81
- float |
82
- string |
83
- identifier |
84
- Grammar::Element[:"("].discard+expression+Grammar::Element[:")"].discard
85
- product_op = Grammar::Element[:"*"]|Grammar::Element[:"/"]
86
- product = primary.filter(Array) { |x,buf|
87
- op = buf.pop
88
- buf.concat(x)
89
- buf << op if op
90
- buf
91
- }.list1(nil,product_op)
92
- sum_op = Grammar::Element[:"+"]|Grammar::Element[:"-"]
93
- sum = product.filter(Array) { |x,buf|
94
- op = buf.pop
95
- buf.concat(x)
96
- buf << op if op
97
- buf
98
- }.list1(nil,sum_op)
99
- }
100
- end
101
-
102
- end
103
-
104
- if __FILE__==$0
105
- lexer = Expression.lexer
106
- token_buffer = Cursor::Producer.new { |buffer|
107
- lexer.scan($stdin.to_cursor,buffer)
108
- }
109
- parser = Expression.parser
110
- result = parser.scan(token_buffer)
111
- p result
112
- result
113
- end
114
-