kpeg 0.7

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