kaiseki 1.2.5 → 1.3.1
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/grammar.rb +5 -5
- data/lib/grammar_stub.rb +0 -1
- data/lib/kaiseki.rb +1 -1
- data/lib/mod_object.rb +0 -5
- data/lib/parse_error.rb +12 -5
- data/lib/parse_result.rb +4 -0
- data/lib/parseable.rb +2 -0
- data/lib/parser_choice.rb +4 -4
- data/lib/parser_eof.rb +1 -1
- data/lib/parser_regexp.rb +1 -1
- data/lib/parser_repeat.rb +4 -3
- data/lib/parser_string.rb +2 -2
- data/lib/predicate_and.rb +1 -1
- data/lib/predicate_not.rb +1 -1
- data/lib/predicate_skip.rb +1 -1
- data/lib/result_validate.rb +1 -1
- data/lib/var_get.rb +1 -1
- metadata +2 -2
data/lib/grammar.rb
CHANGED
@@ -19,21 +19,21 @@ module Kaiseki
|
|
19
19
|
|
20
20
|
def parse stream, options = {}
|
21
21
|
raise 'starting rule undefined' unless @starting_rule
|
22
|
+
result = ParseResult.new
|
22
23
|
default_options = {
|
23
24
|
:grammar => self,
|
24
|
-
:result =>
|
25
|
-
:global => {},
|
25
|
+
:result => result,
|
26
26
|
:rule => '(main)',
|
27
27
|
:skipping => @skipping_rule,
|
28
28
|
:simplify => @simplify
|
29
29
|
}
|
30
30
|
options = default_options.merge options
|
31
31
|
begin
|
32
|
-
|
32
|
+
result.results[:main] = @starting_rule.parse stream.to_stream, options
|
33
33
|
rescue ParseError => e
|
34
|
-
|
34
|
+
result.errors[:main] = e
|
35
35
|
end
|
36
|
-
|
36
|
+
result
|
37
37
|
end
|
38
38
|
|
39
39
|
def starting parseable
|
data/lib/grammar_stub.rb
CHANGED
data/lib/kaiseki.rb
CHANGED
data/lib/mod_object.rb
CHANGED
@@ -3,9 +3,4 @@ class Object
|
|
3
3
|
raise TypeError, "can't convert #{self.class} into #{item}" unless self.is_a? item
|
4
4
|
true
|
5
5
|
end
|
6
|
-
|
7
|
-
def must_have property, value
|
8
|
-
raise StandardError, "##{property} must be #{value} (#{self.send(property)})" unless self.send(property) == value
|
9
|
-
true
|
10
|
-
end
|
11
6
|
end
|
data/lib/parse_error.rb
CHANGED
@@ -1,16 +1,23 @@
|
|
1
1
|
module Kaiseki
|
2
2
|
class ParseError < StandardError
|
3
|
-
attr_accessor :rule, :line, :column
|
3
|
+
attr_accessor :rule, :child, :line, :column
|
4
4
|
|
5
|
-
def initialize string,
|
5
|
+
def initialize string, rule, child = nil
|
6
6
|
super string
|
7
|
-
@rule =
|
8
|
-
@
|
9
|
-
@column = nil
|
7
|
+
@rule = rule
|
8
|
+
@child = child
|
10
9
|
end
|
11
10
|
|
12
11
|
def verbose
|
13
12
|
"[#{@line ? @line + 1 : 0}:#{@column ? @column + 1 : 0}] #{to_s} [in #{@rule}]"
|
14
13
|
end
|
14
|
+
|
15
|
+
def parsetrace
|
16
|
+
array = [self]
|
17
|
+
while array.last.child
|
18
|
+
array << array.last.child
|
19
|
+
end
|
20
|
+
array.reverse
|
21
|
+
end
|
15
22
|
end
|
16
23
|
end
|
data/lib/parse_result.rb
CHANGED
data/lib/parseable.rb
CHANGED
@@ -5,6 +5,7 @@ module Kaiseki
|
|
5
5
|
end
|
6
6
|
|
7
7
|
def parse stream, options = {}
|
8
|
+
options[:global] ||= {}
|
8
9
|
stream = stream.to_stream
|
9
10
|
stream.lock do
|
10
11
|
parse! stream, options
|
@@ -99,6 +100,7 @@ module Kaiseki
|
|
99
100
|
|
100
101
|
private
|
101
102
|
def parse! stream, options = {}
|
103
|
+
raise NotImplementedError, "#{self.class} does not have an implemented #parse!" if self.to_parseable == self
|
102
104
|
self.to_parseable.parse stream, options
|
103
105
|
end
|
104
106
|
end
|
data/lib/parser_choice.rb
CHANGED
@@ -12,19 +12,19 @@ module Kaiseki
|
|
12
12
|
|
13
13
|
private
|
14
14
|
def parse! stream, options = {}
|
15
|
-
error =
|
15
|
+
error = nil
|
16
16
|
@expected.each do |n|
|
17
17
|
begin
|
18
18
|
catch :SkipSuccess do
|
19
19
|
return n.parse stream, options
|
20
20
|
end
|
21
|
-
rescue ParseError
|
21
|
+
rescue ParseError => error
|
22
22
|
next
|
23
|
-
rescue NotImplementedError
|
23
|
+
rescue NotImplementedError => error
|
24
24
|
next
|
25
25
|
end
|
26
26
|
end
|
27
|
-
raise ParseError.new "no valid alternatives when parsing #{self}", options
|
27
|
+
raise ParseError.new "no valid alternatives when parsing #{self}", options[:rule], error
|
28
28
|
end
|
29
29
|
end
|
30
30
|
end
|
data/lib/parser_eof.rb
CHANGED
@@ -16,7 +16,7 @@ module Kaiseki
|
|
16
16
|
def parse! stream, options = {}
|
17
17
|
actual = stream.getc
|
18
18
|
if actual
|
19
|
-
raise ParseError.new "unexpected character \"#{actual}\" (expected end-of-string) when parsing #{self}", options
|
19
|
+
raise ParseError.new "unexpected character \"#{actual}\" (expected end-of-string) when parsing #{self}", options[:rule]
|
20
20
|
else
|
21
21
|
true
|
22
22
|
end
|
data/lib/parser_regexp.rb
CHANGED
data/lib/parser_repeat.rb
CHANGED
@@ -27,12 +27,13 @@ module Kaiseki
|
|
27
27
|
private
|
28
28
|
def parse! stream, options = {}
|
29
29
|
result = []
|
30
|
+
error = nil
|
30
31
|
while @max.nil? or result.length < @max
|
31
32
|
begin
|
32
33
|
protect do
|
33
34
|
result << @expected.parse(stream, options)
|
34
35
|
end
|
35
|
-
rescue ParseError
|
36
|
+
rescue ParseError => error
|
36
37
|
if options[:skipping]
|
37
38
|
begin
|
38
39
|
protect do
|
@@ -45,12 +46,12 @@ module Kaiseki
|
|
45
46
|
else
|
46
47
|
break
|
47
48
|
end
|
48
|
-
rescue NotImplementedError
|
49
|
+
rescue NotImplementedError => error
|
49
50
|
break
|
50
51
|
end
|
51
52
|
end
|
52
53
|
if result.length < @min
|
53
|
-
raise ParseError.new "expected #{@min} match#{'es' unless @min == 1} but obtained #{result.length} when parsing #{self}", options
|
54
|
+
raise ParseError.new "expected #{@min} match#{'es' unless @min == 1} but obtained #{result.length} when parsing #{self}", options[:rule], error
|
54
55
|
else
|
55
56
|
if options[:simplify]
|
56
57
|
if @min == 0 and @max == 1
|
data/lib/parser_string.rb
CHANGED
@@ -6,9 +6,9 @@ module Kaiseki
|
|
6
6
|
@expected.each_char do |char|
|
7
7
|
actual = stream.getc
|
8
8
|
if actual.nil?
|
9
|
-
raise ParseError.new "unexpected end-of-string (expected \"#{char}\") when parsing #{self}", options
|
9
|
+
raise ParseError.new "unexpected end-of-string (expected \"#{char}\") when parsing #{self}", options[:rule]
|
10
10
|
elsif actual != char
|
11
|
-
raise ParseError.new "unexpected character \"#{actual}\" (expected \"#{char}\") when parsing #{self}", options
|
11
|
+
raise ParseError.new "unexpected character \"#{actual}\" (expected \"#{char}\") when parsing #{self}", options[:rule]
|
12
12
|
end
|
13
13
|
end
|
14
14
|
@expected.dup
|
data/lib/predicate_and.rb
CHANGED
@@ -13,7 +13,7 @@ module Kaiseki
|
|
13
13
|
begin
|
14
14
|
@expected.parse stream, options
|
15
15
|
rescue ParseError => e
|
16
|
-
raise ParseError.new "predicate not satisfied when parsing #{self}: #{e.to_s}", options
|
16
|
+
raise ParseError.new "predicate not satisfied when parsing #{self}: #{e.to_s}", options[:rule], e
|
17
17
|
end
|
18
18
|
throw :PredicateSuccess
|
19
19
|
end
|
data/lib/predicate_not.rb
CHANGED
@@ -15,7 +15,7 @@ module Kaiseki
|
|
15
15
|
rescue ParseError
|
16
16
|
throw :PredicateSuccess
|
17
17
|
end
|
18
|
-
raise ParseError.new "predicate not satisfied when parsing #{self}: matched #{result}", options
|
18
|
+
raise ParseError.new "predicate not satisfied when parsing #{self}: matched #{result}", options[:rule]
|
19
19
|
end
|
20
20
|
end
|
21
21
|
end
|
data/lib/predicate_skip.rb
CHANGED
@@ -13,7 +13,7 @@ module Kaiseki
|
|
13
13
|
begin
|
14
14
|
@expected.parse stream, options
|
15
15
|
rescue ParseError => e
|
16
|
-
raise ParseError.new "predicate not satisfied when parsing #{self}: #{e.to_s}", options
|
16
|
+
raise ParseError.new "predicate not satisfied when parsing #{self}: #{e.to_s}", options[:rule], e
|
17
17
|
end
|
18
18
|
throw :SkipSuccess
|
19
19
|
end
|
data/lib/result_validate.rb
CHANGED
data/lib/var_get.rb
CHANGED
@@ -34,7 +34,7 @@ module Kaiseki
|
|
34
34
|
elsif source == result
|
35
35
|
result
|
36
36
|
else
|
37
|
-
raise ParseError.new "unexpected result #{result.inspect} (expected #{source.inspect}) when parsing #{@parser}", options
|
37
|
+
raise ParseError.new "unexpected result #{result.inspect} (expected #{source.inspect}) when parsing #{@parser}", options[:rule]
|
38
38
|
end
|
39
39
|
end
|
40
40
|
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: kaiseki
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 1.
|
5
|
+
version: 1.3.1
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- William Hamilton-Levi
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-
|
13
|
+
date: 2011-03-01 00:00:00 -05:00
|
14
14
|
default_executable:
|
15
15
|
dependencies: []
|
16
16
|
|