yaparc 0.2.2 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
File without changes
@@ -36,8 +36,8 @@ class YaparcTest < Test::Unit::TestCase
36
36
  assert_equal 1, result.value
37
37
  assert_equal "abs", result.input
38
38
  # assert_equal 1, parser.tree
39
- result = parser.parse("abs") do |result|
40
- result
39
+ result = parser.parse("abs") do |answer|
40
+ answer
41
41
  end
42
42
  assert_equal 1, result.value
43
43
  end
@@ -389,26 +389,6 @@ class YaparcTest < Test::Unit::TestCase
389
389
  assert_equal "\n abc", result.input
390
390
  end
391
391
 
392
- def test_identifier
393
- parser = Identifier.new
394
- result = parser.parse(" abc ")
395
- assert_equal "abc", result.value
396
- assert_equal "", result.input
397
- result = parser.parse(" _abc ")
398
- assert_instance_of Result::OK, result
399
- result = parser.parse(" 0_abc ")
400
- assert_instance_of Result::Fail, result
401
- result = parser.parse(" _00abc ")
402
- assert_instance_of Result::OK, result
403
-
404
- parser_with_keyword = Identifier.new("abc","efg")
405
- result = parser_with_keyword.parse("abc")
406
- assert_instance_of Result::Fail, result
407
- result = parser_with_keyword.parse(" xyz")
408
- assert_equal "xyz", result.value
409
- assert_equal "", result.input
410
-
411
- end
412
392
 
413
393
  def test_natural
414
394
  parser = Natural.new
@@ -438,3 +418,43 @@ class YaparcTest < Test::Unit::TestCase
438
418
  end
439
419
  end
440
420
 
421
+
422
+ class IdentifierParserTest < Test::Unit::TestCase
423
+ include ::Yaparc
424
+
425
+ def setup
426
+ @parser = ::Yaparc::Identifier.new
427
+ # @untokenized_parser = ::Yaparc::Identifier.new do |tokenize|
428
+ # tokenize.prefix = Space.new
429
+ # tokenize.postfix = Space.new
430
+ # end
431
+ end
432
+
433
+ def test_parse
434
+ result = @parser.parse("abc")
435
+ assert_equal "abc", result.value
436
+ assert_equal "", result.input
437
+ result = @parser.parse(" abc ")
438
+ assert_equal "abc", result.value
439
+ assert_equal "", result.input
440
+ result = @parser.parse(" _abc ")
441
+ assert_instance_of Result::OK, result
442
+ result = @parser.parse(" 0_abc ")
443
+ assert_instance_of Result::Fail, result
444
+ result = @parser.parse(" _00abc ")
445
+ assert_instance_of Result::OK, result
446
+ # result = @untokenized_parser.parse(" \n abc ")
447
+ # assert_instance_of Result::OK, result
448
+ # assert_equal "abc", result.value
449
+ # assert_equal "", result.input
450
+ end
451
+
452
+ def test_parse_with_keyword
453
+ parser_with_keyword = Identifier.new(:exclude => ["abc","efg"])
454
+ result = parser_with_keyword.parse("abc")
455
+ assert_instance_of Result::Fail, result
456
+ result = parser_with_keyword.parse(" xyz")
457
+ assert_equal "xyz", result.value
458
+ assert_equal "", result.input
459
+ end
460
+ end
@@ -0,0 +1,287 @@
1
+ require 'lib/yaparc.rb'
2
+ require 'test/unit'
3
+
4
+ =begin
5
+
6
+ <prog> ::= <clause> [ <clause> ]*
7
+ <clause> ::= <fact> | <rule> | <query>
8
+
9
+ <fact> ::= <compoundterm> .
10
+ <compoundterm> ::= <atom> [ ( <arglist> ) ]*
11
+
12
+ <rule> ::= <head> :- <body> .
13
+ <query> ::= ?- <body> .
14
+ <head> ::= <compoundterm>
15
+ <body> ::= <goal> [, <goal>]*
16
+ <goal> ::= <compoundterm> | !
17
+
18
+ <arglist> := <arg>[, <arg>]*
19
+ <arg> ::= <atom> | <var> | <list>
20
+
21
+ <atom> ::= /[a-zA-Z][a-zA-Z0-9]*/
22
+ | '/[a-zA-Z0-9]+/'
23
+
24
+ <var> ::= ?/[a-zA-Z0-9]+/
25
+
26
+ <list> ::= <leftbracket> <rightbracket>
27
+ <list> ::= <leftbracket> <listelems> <rightbracket>
28
+ <listelems> ::= <arglist>
29
+ <listelems> ::= <arglist> <barsymbol> <list>
30
+ <listelems> ::= <arglist> <barsymbol> <var>
31
+
32
+ =end
33
+
34
+ module PrologParser
35
+ # KEYWORDS = %w{}
36
+ # <prog> ::= <clause> [ <clause> ]*
37
+ class Program
38
+ include Yaparc::Parsable
39
+
40
+ def initialize
41
+ @parser = lambda do |input|
42
+ Yaparc::Seq.new(Yaparc::ManyOne.new(Clause.new,[])) do |clauses|
43
+ #LogRuby::Program.new(*clauses)
44
+ end
45
+ end
46
+ end
47
+ end
48
+
49
+ # <clause> ::= <fact> | <rule> | <query>
50
+ class Clause
51
+ include Yaparc::Parsable
52
+ def initialize
53
+
54
+ @parser = lambda do |input|
55
+ Yaparc::Alt.new(
56
+ PrologParser::Fact.new,
57
+ PrologParser::Rule.new,
58
+ PrologParser::Query.new
59
+ )
60
+ end
61
+ end
62
+ end
63
+
64
+ # <fact> ::= <compoundterm> .
65
+ class Fact
66
+ include Yaparc::Parsable
67
+ def initialize
68
+ @parser = lambda do |input|
69
+ Yaparc::Seq.new(
70
+ PrologParser::CompoundTerm.new,
71
+ Yaparc::Literal.new('.')) do |compoundterm,_|
72
+ #LogRuby::Fact.new(compoundterm)
73
+ end
74
+ end
75
+ end
76
+ end
77
+
78
+ # <compoundterm> ::= <atom> [ ( <arglist> ) ]*
79
+ class CompoundTerm
80
+ include Yaparc::Parsable
81
+ def initialize
82
+ @parser = lambda do |input|
83
+ Yaparc::Seq.new(
84
+ PrologParser::Atom.new,
85
+ Yaparc::ManyOne.new(
86
+ Yaparc::Seq.new(
87
+ Yaparc::Literal.new('('),
88
+ PrologParser::ArgList.new,
89
+ Yaparc::Literal.new(')')) do |_,arglist,_|
90
+ arglist
91
+ end) do ||
92
+ end) do |head, tail|
93
+ #LogRuby::CompoundTerm.new(head,*tail)
94
+ end
95
+ end
96
+ end
97
+ end
98
+
99
+
100
+ # <rule> ::= <head> :- <body> .
101
+ class Rule
102
+ include Yaparc::Parsable
103
+ def initialize
104
+ @parser = lambda do |input|
105
+ Yaparc::Seq.new(
106
+ PrologParser::Head.new,
107
+ Yaparc::Literal.new(':-'),
108
+ PrologParser::Body.new,
109
+ Yaparc::Literal.new('.')) do |head,_,body,_|
110
+ #LogRuby::Rule.new(head,*body)
111
+ end
112
+ end
113
+ end
114
+ end
115
+
116
+ # <query> ::= ?- <body> .
117
+ class Query
118
+ include Yaparc::Parsable
119
+ def initialize
120
+ @parser = lambda do |input|
121
+ Yaparc::Seq.new(
122
+ Yaparc::Literal.new('?-'),
123
+ PrologParser::Body.new,
124
+ Yaparc::Literal.new('.')) do |_,body,_|
125
+ # LogRuby::Query.new(*body)
126
+ end
127
+ end
128
+ end
129
+ end
130
+
131
+ # <head> ::= <compoundterm>
132
+ class Head
133
+ include Yaparc::Parsable
134
+ def initialize
135
+ @parser = lambda do |input|
136
+ PrologParser::CompoundTerm.new
137
+ end
138
+ end
139
+ end
140
+
141
+ # <body> ::= <goal> [, <goal>]*
142
+ class Body
143
+ include Yaparc::Parsable
144
+ def initialize
145
+ @parser = lambda do |input|
146
+ Yaparc::ManyOne.new(PrologParser::Goal.new,[])
147
+ end
148
+ end
149
+ end
150
+
151
+ # <goal> ::= <compoundterm> | !
152
+ class Goal
153
+ include Yaparc::Parsable
154
+ def initialize
155
+ @parser = lambda do |input|
156
+ Yaparc::Alt.new(
157
+ PrologParser::CompoundTerm.new,
158
+ Yaparc::Literal.new('!'))
159
+ end
160
+ end
161
+ end
162
+
163
+ # <arglist> := <arg>[, <arg>]*
164
+ class ArgList
165
+ include Yaparc::Parsable
166
+ def initialize
167
+ @parser = lambda do |input|
168
+ Yaparc::Seq.new(
169
+ PrologParser::Arg.new,
170
+ Yaparc::Many.new(
171
+ Yaparc::Seq.new(Yaparc::Literal.new(','), PrologParser::Arg.new),[])) do |head,tail|
172
+ [head] + tail
173
+ end
174
+ end
175
+ end
176
+ end
177
+
178
+ # <arg> ::= <atom> | <var> | <list>
179
+ class Arg
180
+ include Yaparc::Parsable
181
+ def initialize
182
+ @parser = lambda do |input|
183
+ Yaparc::Alt.new(
184
+ PrologParser::Variable.new,
185
+ PrologParser::Atom.new,
186
+ PrologParser::List.new)
187
+ end
188
+ end
189
+ end
190
+
191
+ # <atom> ::= /[a-zA-Z][a-zA-Z0-9]*/
192
+ # | '/[a-zA-Z0-9]+/'
193
+ class Atom
194
+ include Yaparc::Parsable
195
+ def initialize
196
+ @parser = lambda do |input|
197
+ Yaparc::Seq.new(Yaparc::Regex.new(/[a-zA-Z][a-zA-Z0-9]*/)) do |ide|
198
+ #LogRuby::Atom.new(ide)
199
+ end
200
+ end
201
+ end
202
+ end
203
+
204
+ # <var> ::= ?/[a-zA-Z0-9]+/
205
+ class Variable
206
+ include Yaparc::Parsable
207
+ def initialize
208
+ @parser = lambda do |input|
209
+ Yaparc::Seq.new(
210
+ Yaparc::Literal.new("?"),
211
+ Yaparc::Regex.new(/[a-zA-Z0-9]+/)) do |_,var|
212
+ # LogRuby::Variable.new(var)
213
+ end
214
+ end
215
+ end
216
+ end
217
+
218
+ # <list> ::= <leftbracket> <rightbracket>
219
+ class List
220
+ include Yaparc::Parsable
221
+ def initialize
222
+ @parser = lambda do |input|
223
+ Yaparc::Seq.new(
224
+ Yaparc::Literal.new("["),
225
+ Yaparc::Literal.new("]"))
226
+ end
227
+ end
228
+ end
229
+ end # of PrologParser
230
+
231
+
232
+ class PrologTest < Test::Unit::TestCase
233
+ include ::Yaparc
234
+
235
+
236
+ def test_variable
237
+ var = PrologParser::Variable.new
238
+ result = var.parse("?Var")
239
+ assert_instance_of Result::OK, result
240
+ # assert_equal LogRuby::Variable.new("Var"), result.value
241
+ end
242
+
243
+ def test_atom
244
+ atom = PrologParser::Atom.new
245
+ result = atom.parse("atom")
246
+ assert_instance_of Result::OK, result
247
+ # assert_equal LogRuby::Atom.new("atom"), result.value
248
+ end
249
+
250
+ def test_arglist
251
+ arglist = PrologParser::ArgList.new
252
+ result = arglist.parse("term1,term2,term3")
253
+ assert_instance_of Result::OK, result
254
+ # assert_equal LogRuby::Atom.new("atom"), result.value
255
+ end
256
+
257
+ def test_compoundterm
258
+ compoundterm = PrologParser::CompoundTerm.new
259
+ result = compoundterm.parse("functor(term1,term2,term3)")
260
+ assert_instance_of Result::OK, result
261
+ # assert_equal LogRuby::CompoundTerm.new(LogRuby::Atom.new("functor"),
262
+ # LogRuby::Atom.new("term1"),LogRuby::Atom.new("term2"),LogRuby::Atom.new("term3")), result.value
263
+ end
264
+
265
+ def test_query
266
+ query = PrologParser::Query.new
267
+ result = query.parse("?- functor(?var,term).")
268
+ assert_instance_of Result::OK, result
269
+ # assert_equal LogRuby::Query.new(LogRuby::CompoundTerm.new(LogRuby::Atom.new('functor'),LogRuby::Variable.new('var'), LogRuby::Atom.new('term'))), result.value
270
+ end
271
+
272
+ def test_fact
273
+ fact = PrologParser::Fact.new
274
+ result = fact.parse("functor(term).")
275
+ assert_instance_of Result::OK, result
276
+ # assert_equal LogRuby::Fact.new(LogRuby::CompoundTerm.new(LogRuby::Atom.new('functor'),LogRuby::Atom.new('term'))), result.value
277
+ end
278
+
279
+ def test_rule
280
+ # likes(X, P) :- based(P,Y), likes(X,Y).
281
+ rule_parser = PrologParser::Rule.new
282
+ result = rule_parser.parse("likes(?X, ?P) :- based(?P,?Y), likes(?X,?Y).")
283
+ assert_instance_of Result::OK, result
284
+ # assert_equal rule, result.value
285
+ end
286
+
287
+ end
@@ -30,7 +30,7 @@ module SQL
30
30
  include Yaparc::Parsable
31
31
 
32
32
  def initialize
33
- @parser = lambda do
33
+ @parser = lambda do |input|
34
34
  Yaparc::Seq.new(SelectExpression.new,
35
35
  FromExpression.new,
36
36
  WhereExpression.new) do |select, from, where|
@@ -45,7 +45,7 @@ module SQL
45
45
  include Yaparc::Parsable
46
46
 
47
47
  def initialize
48
- @parser = lambda do
48
+ @parser = lambda do |input|
49
49
  Yaparc::Seq.new(
50
50
  Yaparc::Symbol.new('select'),
51
51
  TermSequence.new) do |_,terms|
@@ -60,7 +60,7 @@ module SQL
60
60
  include Yaparc::Parsable
61
61
 
62
62
  def initialize
63
- @parser = lambda do
63
+ @parser = lambda do |input|
64
64
  Yaparc::Seq.new(
65
65
  Term.new,
66
66
  Yaparc::Many.new(
@@ -81,7 +81,7 @@ module SQL
81
81
  include Yaparc::Parsable
82
82
 
83
83
  def initialize
84
- @parser = lambda do
84
+ @parser = lambda do |input|
85
85
  Yaparc::Seq.new(
86
86
  Yaparc::Symbol.new('from'),
87
87
  PathExpression.new,
@@ -104,7 +104,7 @@ module SQL
104
104
  include Yaparc::Parsable
105
105
 
106
106
  def initialize
107
- @parser = lambda do
107
+ @parser = lambda do |input|
108
108
  Yaparc::Seq.new(
109
109
  Yaparc::Symbol.new('/'),
110
110
  Term.new,
@@ -125,7 +125,7 @@ module SQL
125
125
  include Yaparc::Parsable
126
126
 
127
127
  def initialize
128
- @parser = lambda do
128
+ @parser = lambda do |input|
129
129
  Yaparc::Many.new(SearchCond.new)
130
130
  end
131
131
  end
@@ -136,8 +136,9 @@ module SQL
136
136
  include Yaparc::Parsable
137
137
 
138
138
  def initialize#(*keywords)
139
- @parser = lambda do
140
- Yaparc::Identifier.new(*KEYWORDS)
139
+ @parser = lambda do |input|
140
+ # Yaparc::Identifier.new(*KEYWORDS)
141
+ Yaparc::Identifier.new(:exclude => KEYWORDS)
141
142
  end
142
143
  end
143
144
  end
@@ -155,7 +156,7 @@ module SQL
155
156
  include Yaparc::Parsable
156
157
 
157
158
  def initialize
158
- @parser = lambda do
159
+ @parser = lambda do |input|
159
160
  Yaparc::Alt.new(
160
161
  Yaparc::Seq.new(Term.new,
161
162
  Op.new,
@@ -233,7 +234,7 @@ module SQL
233
234
  include Yaparc::Parsable
234
235
 
235
236
  def initialize
236
- @parser = lambda do
237
+ @parser = lambda do |input|
237
238
  Yaparc::Alt.new(
238
239
  Yaparc::Apply.new(Yaparc::Symbol.new('<>')) {|_| :not},
239
240
  Yaparc::Apply.new(Yaparc::Symbol.new('<=')) {|_| :lesser_eq },