yaparc 0.2.2 → 0.2.3

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.
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 },