kpeg 0.7

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,223 @@
1
+ require 'test/unit'
2
+ require 'kpeg'
3
+ require 'kpeg/grammar_renderer'
4
+ require 'stringio'
5
+
6
+ class TestKPegGrammarRenderer < Test::Unit::TestCase
7
+ def test_escape
8
+ str = "hello\nbob"
9
+ assert_equal 'hello\nbob', KPeg::GrammarRenderer.escape(str)
10
+ str = "hello\tbob"
11
+ assert_equal 'hello\tbob', KPeg::GrammarRenderer.escape(str)
12
+ str = "\\"
13
+ assert_equal '\\\\', KPeg::GrammarRenderer.escape(str)
14
+ str = 'hello"bob"'
15
+ assert_equal 'hello\\"bob\\"', KPeg::GrammarRenderer.escape(str)
16
+ end
17
+
18
+ def test_invoke
19
+ gram = KPeg.grammar do |g|
20
+ g.root = g.invoke("greeting")
21
+ end
22
+
23
+ io = StringIO.new
24
+ gr = KPeg::GrammarRenderer.new(gram)
25
+ gr.render(io)
26
+
27
+ assert_equal "root = @greeting\n", io.string
28
+ end
29
+
30
+ def test_invoke_with_args
31
+ gram = KPeg.grammar do |g|
32
+ g.root = g.invoke("greeting", "(1,2)")
33
+ end
34
+
35
+ io = StringIO.new
36
+ gr = KPeg::GrammarRenderer.new(gram)
37
+ gr.render(io)
38
+
39
+ assert_equal "root = greeting(1,2)\n", io.string
40
+ end
41
+
42
+ def test_foreign_invoke
43
+ gram = KPeg.grammar do |g|
44
+ g.root = g.foreign_invoke("blah", "greeting")
45
+ end
46
+
47
+ io = StringIO.new
48
+ gr = KPeg::GrammarRenderer.new(gram)
49
+ gr.render(io)
50
+
51
+ assert_equal "root = %blah.greeting\n", io.string
52
+ end
53
+
54
+ def test_foreign_invoke_with_args
55
+ gram = KPeg.grammar do |g|
56
+ g.root = g.foreign_invoke("blah", "greeting", "(1,2)")
57
+ end
58
+
59
+ io = StringIO.new
60
+ gr = KPeg::GrammarRenderer.new(gram)
61
+ gr.render(io)
62
+
63
+ assert_equal "root = %blah.greeting(1,2)\n", io.string
64
+ end
65
+
66
+ def test_dot_render
67
+ gram = KPeg.grammar do |g|
68
+ g.root = g.dot
69
+ end
70
+
71
+ io = StringIO.new
72
+ gr = KPeg::GrammarRenderer.new(gram)
73
+ gr.render(io)
74
+
75
+ assert_equal "root = .\n", io.string
76
+ end
77
+
78
+ def test_tag_render
79
+ gram = KPeg.grammar do |g|
80
+ g.root = g.seq("+", g.t("hello", "greeting"))
81
+ end
82
+
83
+ io = StringIO.new
84
+ gr = KPeg::GrammarRenderer.new(gram)
85
+ gr.render(io)
86
+
87
+ assert_equal "root = \"+\" \"hello\":greeting\n", io.string
88
+ end
89
+
90
+ def test_tag_render_parens
91
+ gram = KPeg.grammar do |g|
92
+ g.root = g.t(g.seq(:b, :c), "greeting")
93
+ end
94
+
95
+ io = StringIO.new
96
+ gr = KPeg::GrammarRenderer.new(gram)
97
+ gr.render(io)
98
+
99
+ assert_equal "root = (b c):greeting\n", io.string
100
+ end
101
+
102
+ def test_grammar_renderer
103
+ gram = KPeg.grammar do |g|
104
+ g.some = g.range('0', '9')
105
+ g.num = g.reg(/[0-9]/)
106
+ g.term = g.any(
107
+ [:term, "+", :term],
108
+ [:term, "-", :term],
109
+ :fact)
110
+ g.fact = g.any(
111
+ [:fact, "*", :fact],
112
+ [:fact, "/", :fact],
113
+ :num
114
+ )
115
+ g.root = g.term
116
+ end
117
+
118
+ m = KPeg.match "4*3-8/9", gram
119
+
120
+ io = StringIO.new
121
+ gr = KPeg::GrammarRenderer.new(gram)
122
+ gr.render(io)
123
+
124
+ expected = <<-GRAM
125
+ some = [0-9]
126
+ num = /[0-9]/
127
+ term = term "+" term
128
+ | term "-" term
129
+ | fact
130
+ fact = fact "*" fact
131
+ | fact "/" fact
132
+ | num
133
+ root = term
134
+ GRAM
135
+
136
+ assert_equal expected, io.string
137
+ end
138
+
139
+ def test_grammar_renderer2
140
+ gram = KPeg.grammar do |g|
141
+ g.num = g.reg(/[0-9]/)
142
+ g.term = g.any(
143
+ [:term, g.t("+"), :term],
144
+ [:term, g.any("-", "$"), :term],
145
+ :fact)
146
+ g.fact = g.any(
147
+ [:fact, g.t("*", "op"), :fact],
148
+ [:fact, "/", :fact],
149
+ :num
150
+ )
151
+ g.root = g.term
152
+ end
153
+
154
+ m = KPeg.match "4*3-8/9", gram
155
+
156
+ io = StringIO.new
157
+ gr = KPeg::GrammarRenderer.new(gram)
158
+ gr.render(io)
159
+
160
+ expected = <<-GRAM
161
+ num = /[0-9]/
162
+ term = term "+" term
163
+ | term ("-" | "$") term
164
+ | fact
165
+ fact = fact "*":op fact
166
+ | fact "/" fact
167
+ | num
168
+ root = term
169
+ GRAM
170
+
171
+ assert_equal expected, io.string
172
+ end
173
+
174
+ def test_action
175
+ gram = KPeg.grammar do |g|
176
+ g.root = g.seq("hello", g.action("3 + 4"))
177
+ end
178
+
179
+ io = StringIO.new
180
+ gr = KPeg::GrammarRenderer.new(gram)
181
+ gr.render(io)
182
+
183
+ expected = <<-GRAM
184
+ root = "hello" {3 + 4}
185
+ GRAM
186
+
187
+ assert_equal expected, io.string
188
+ end
189
+
190
+ def test_collect
191
+ gram = KPeg.grammar do |g|
192
+ g.root = g.collect(g.many(g.range("a", "z")))
193
+ end
194
+
195
+ io = StringIO.new
196
+ gr = KPeg::GrammarRenderer.new(gram)
197
+ gr.render(io)
198
+
199
+ expected = <<-GRAM
200
+ root = < [a-z]+ >
201
+ GRAM
202
+
203
+ assert_equal expected, io.string
204
+ end
205
+
206
+ def test_setup_actions
207
+ gram = KPeg.grammar do |g|
208
+ g.root = g.dot
209
+ g.add_setup g.action(" attr_reader :foo ")
210
+ end
211
+
212
+ io = StringIO.new
213
+ gr = KPeg::GrammarRenderer.new(gram)
214
+ gr.render(io)
215
+
216
+ expected = <<-TXT
217
+ %% { attr_reader :foo }
218
+
219
+ root = .
220
+ TXT
221
+ assert_equal expected, io.string
222
+ end
223
+ end
metadata ADDED
@@ -0,0 +1,97 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kpeg
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 7
8
+ version: "0.7"
9
+ platform: ruby
10
+ authors:
11
+ - Evan Phoenix
12
+ autorequire:
13
+ bindir: bin
14
+ cert_chain: []
15
+
16
+ date: 2011-03-15 00:00:00 -07:00
17
+ default_executable:
18
+ dependencies:
19
+ - !ruby/object:Gem::Dependency
20
+ name: rake
21
+ prerelease: false
22
+ requirement: &id001 !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ segments:
27
+ - 0
28
+ version: "0"
29
+ type: :development
30
+ version_requirements: *id001
31
+ description: A tool for generating parsers using PEG
32
+ email:
33
+ - evan@fallingsnow.net
34
+ executables:
35
+ - kpeg
36
+ extensions: []
37
+
38
+ extra_rdoc_files: []
39
+
40
+ files:
41
+ - lib/kpeg/code_generator.rb
42
+ - lib/kpeg/compiled_parser.rb
43
+ - lib/kpeg/format_parser.rb
44
+ - lib/kpeg/grammar.rb
45
+ - lib/kpeg/grammar_renderer.rb
46
+ - lib/kpeg/match.rb
47
+ - lib/kpeg/parser.rb
48
+ - lib/kpeg/position.rb
49
+ - lib/kpeg/string_escape.rb
50
+ - lib/kpeg/version.rb
51
+ - lib/kpeg.rb
52
+ - bin/kpeg
53
+ - doc/syntax_kpeg/ftdetect/kpeg.vim
54
+ - doc/syntax_kpeg/syntax/kpeg.vim
55
+ - LICENSE
56
+ - README.md
57
+ - Rakefile
58
+ - kpeg.gemspec
59
+ - Gemfile
60
+ has_rdoc: true
61
+ homepage: https://github.com/evanphx/kpeg
62
+ licenses: []
63
+
64
+ post_install_message:
65
+ rdoc_options: []
66
+
67
+ require_paths:
68
+ - lib
69
+ required_ruby_version: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ segments:
74
+ - 0
75
+ version: "0"
76
+ required_rubygems_version: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ segments:
81
+ - 0
82
+ version: "0"
83
+ requirements: []
84
+
85
+ rubyforge_project:
86
+ rubygems_version: 1.3.6
87
+ signing_key:
88
+ specification_version: 3
89
+ summary: Peg-based Code Generator
90
+ test_files:
91
+ - test/test_file_parser_roundtrip.rb
92
+ - test/test_gen_calc.rb
93
+ - test/test_kpeg.rb
94
+ - test/test_kpeg_code_generator.rb
95
+ - test/test_kpeg_compiled_parser.rb
96
+ - test/test_kpeg_format.rb
97
+ - test/test_kpeg_grammar_renderer.rb