yaparc 0.0.7 → 0.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.
- data/README +172 -8
- data/lib/yaparc.rb +402 -69
- data/tests/test_calc.rb +42 -105
- data/tests/test_parser.rb +304 -67
- metadata +2 -2
data/tests/test_calc.rb
CHANGED
@@ -4,18 +4,6 @@ require 'pp'
|
|
4
4
|
|
5
5
|
|
6
6
|
class Expr < Yaparc::AbstractParser
|
7
|
-
# include Yaparc::Parsable
|
8
|
-
|
9
|
-
# define_parser do
|
10
|
-
# Yaparc::AltParser.new(
|
11
|
-
# Yaparc::SeqParser.new(Term.new,
|
12
|
-
# Yaparc::Symbol.new('+'),
|
13
|
-
# Expr.new) do |term, _, expr|
|
14
|
-
# ['+', term,expr]
|
15
|
-
# end,
|
16
|
-
# Term.new
|
17
|
-
# )
|
18
|
-
# end
|
19
7
|
|
20
8
|
def initialize
|
21
9
|
@parser = lambda do
|
@@ -27,34 +15,27 @@ class Expr < Yaparc::AbstractParser
|
|
27
15
|
end,
|
28
16
|
Term.new
|
29
17
|
)
|
30
|
-
# SeqParser.new(Term.new,
|
31
|
-
# AltParser.new(
|
32
|
-
# SeqParser.new(
|
33
|
-
# Symbol.new('+'),
|
34
|
-
# Expr.new) do |_, expr|
|
35
|
-
# expr
|
36
|
-
# end,
|
37
|
-
# SucceedParser.new([]))
|
38
|
-
# ) do |term, expr|
|
39
|
-
# if expr == []
|
40
|
-
# term
|
41
|
-
# else
|
42
|
-
# ['+', term,expr]
|
43
|
-
# end
|
44
|
-
# end
|
45
18
|
end
|
46
19
|
end
|
47
20
|
|
48
|
-
#
|
49
|
-
#
|
21
|
+
# define_parser do
|
22
|
+
# Yaparc::AltParser.new(
|
23
|
+
# Yaparc::SeqParser.new(Term.new,
|
24
|
+
# Yaparc::Symbol.new('+'),
|
25
|
+
# Expr.new) do |term, _, expr|
|
26
|
+
# ['+', term,expr]
|
27
|
+
# end,
|
28
|
+
# Term.new
|
29
|
+
# )
|
50
30
|
# end
|
51
31
|
|
32
|
+
|
52
33
|
def evaluate(input)
|
53
34
|
result = parse(input)
|
54
|
-
tree = result
|
35
|
+
tree = result.value
|
55
36
|
eval_tree(tree)
|
56
37
|
end
|
57
|
-
|
38
|
+
|
58
39
|
def eval_tree(tree)
|
59
40
|
case tree
|
60
41
|
when Array
|
@@ -75,18 +56,6 @@ class Expr < Yaparc::AbstractParser
|
|
75
56
|
end
|
76
57
|
|
77
58
|
class Term < Yaparc::AbstractParser
|
78
|
-
# include Yaparc::Parsable
|
79
|
-
|
80
|
-
# define_parser do
|
81
|
-
# Yaparc::AltParser.new(
|
82
|
-
# Yaparc::SeqParser.new(Factor.new,
|
83
|
-
# Yaparc::Symbol.new('*'),
|
84
|
-
# Term.new) do |factor, _, term|
|
85
|
-
# ['*', factor,term]
|
86
|
-
# end,
|
87
|
-
# Factor.new
|
88
|
-
# )
|
89
|
-
# end
|
90
59
|
|
91
60
|
def initialize
|
92
61
|
@parser = lambda do
|
@@ -98,43 +67,23 @@ class Term < Yaparc::AbstractParser
|
|
98
67
|
end,
|
99
68
|
Factor.new
|
100
69
|
)
|
101
|
-
# SeqParser.new(Factor.new,
|
102
|
-
# AltParser.new(
|
103
|
-
# SeqParser.new(Symbol.new('*'),
|
104
|
-
# Term.new) do |_, term|
|
105
|
-
# term
|
106
|
-
# end,
|
107
|
-
# SucceedParser.new([]))
|
108
|
-
# ) do |factor, term|
|
109
|
-
# if term == []
|
110
|
-
# factor
|
111
|
-
# else
|
112
|
-
# ['*', factor,term]
|
113
|
-
# end
|
114
|
-
# end
|
115
70
|
end
|
116
71
|
end
|
117
72
|
|
118
|
-
#
|
119
|
-
#
|
73
|
+
# define_parser do
|
74
|
+
# Yaparc::AltParser.new(
|
75
|
+
# Yaparc::SeqParser.new(Factor.new,
|
76
|
+
# Yaparc::Symbol.new('*'),
|
77
|
+
# Term.new) do |factor, _, term|
|
78
|
+
# ['*', factor,term]
|
79
|
+
# end,
|
80
|
+
# Factor.new
|
81
|
+
# )
|
120
82
|
# end
|
121
83
|
end
|
122
84
|
|
123
85
|
class Factor < Yaparc::AbstractParser
|
124
|
-
|
125
|
-
|
126
|
-
define_parser do
|
127
|
-
AltParser.new(
|
128
|
-
Yaparc::SeqParser.new(
|
129
|
-
Yaparc::Symbol.new('('),
|
130
|
-
Expr.new,
|
131
|
-
Yaparc::Symbol.new(')')
|
132
|
-
) do |_,expr, _|
|
133
|
-
expr
|
134
|
-
end,
|
135
|
-
Natural.new
|
136
|
-
)
|
137
|
-
end
|
86
|
+
|
138
87
|
|
139
88
|
def initialize
|
140
89
|
@parser = lambda do
|
@@ -151,30 +100,20 @@ class Factor < Yaparc::AbstractParser
|
|
151
100
|
end
|
152
101
|
end
|
153
102
|
|
154
|
-
#
|
155
|
-
#
|
103
|
+
# define_parser do
|
104
|
+
# AltParser.new(
|
105
|
+
# Yaparc::SeqParser.new(
|
106
|
+
# Yaparc::Symbol.new('('),
|
107
|
+
# Expr.new,
|
108
|
+
# Yaparc::Symbol.new(')')
|
109
|
+
# ) do |_,expr, _|
|
110
|
+
# expr
|
111
|
+
# end,
|
112
|
+
# Natural.new
|
113
|
+
# )
|
156
114
|
# end
|
157
115
|
end
|
158
116
|
|
159
|
-
# class Comb < Yaparc::ParserBase
|
160
|
-
# include Yaparc::Parsable
|
161
|
-
|
162
|
-
# def initialize
|
163
|
-
# @parser = lambda do
|
164
|
-
# AltParser.new(
|
165
|
-
# SeqParser.new(Symbol.new('+'),
|
166
|
-
# Nat.new) do | _, nat|
|
167
|
-
# nat
|
168
|
-
# end,
|
169
|
-
# Nat.new
|
170
|
-
# )
|
171
|
-
# end
|
172
|
-
# end
|
173
|
-
|
174
|
-
# def parse(input)
|
175
|
-
# @parser.call.parse(input)
|
176
|
-
# end
|
177
|
-
# end
|
178
117
|
|
179
118
|
class YaparcCalcTest < Test::Unit::TestCase
|
180
119
|
include ::Yaparc
|
@@ -186,20 +125,25 @@ class YaparcCalcTest < Test::Unit::TestCase
|
|
186
125
|
|
187
126
|
def test_expr
|
188
127
|
result = @expr.parse("1 + 2 ")
|
189
|
-
|
128
|
+
assert_instance_of OK, result
|
129
|
+
assert_equal ["+", 1, 2], result.value
|
130
|
+
assert_equal "", result.input
|
190
131
|
assert_equal 3, @expr.evaluate("1 + 2 ")
|
191
132
|
assert_equal 9, @expr.evaluate("(1 + 2) * 3 ")
|
192
133
|
end
|
193
134
|
|
194
135
|
def test_factor
|
195
136
|
result = @factor.parse("1")
|
196
|
-
assert_equal
|
137
|
+
assert_equal 1, result.value
|
138
|
+
assert_equal "", result.input
|
197
139
|
|
198
140
|
result = @factor.parse("( 1 )")
|
199
|
-
assert_equal
|
141
|
+
assert_equal 1, result.value
|
142
|
+
assert_equal "", result.input
|
200
143
|
|
201
144
|
result = @factor.parse("( 312 )")
|
202
|
-
assert_equal
|
145
|
+
assert_equal 312, result.value
|
146
|
+
assert_equal "", result.input
|
203
147
|
end
|
204
148
|
|
205
149
|
# def test_cexpr
|
@@ -207,13 +151,6 @@ class YaparcCalcTest < Test::Unit::TestCase
|
|
207
151
|
# assert_equal [[["+", 1, 2], ""]], result
|
208
152
|
# end
|
209
153
|
|
210
|
-
# def test_comb
|
211
|
-
# comb = Comb.new
|
212
|
-
# result = comb.parse("+123")
|
213
|
-
# assert_equal [[123, ""]], result
|
214
|
-
# end
|
215
|
-
|
216
|
-
|
217
154
|
# def test_expr_define_parser
|
218
155
|
# parser = Expr.new
|
219
156
|
# result = Expr.parse("1 + 2 ")
|