kaiseki 1.2.5 → 1.3.1

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/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 => ParseResult.new,
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
- options[:result].results[:main] = @starting_rule.parse stream.to_stream, options
32
+ result.results[:main] = @starting_rule.parse stream.to_stream, options
33
33
  rescue ParseError => e
34
- options[:result].errors[:main] = e
34
+ result.errors[:main] = e
35
35
  end
36
- options[:result]
36
+ result
37
37
  end
38
38
 
39
39
  def starting parseable
data/lib/grammar_stub.rb CHANGED
@@ -18,7 +18,6 @@ module Kaiseki
18
18
  def parse! stream, options = {}
19
19
  default_options = {
20
20
  :grammar => @grammar,
21
- :global => {},
22
21
  :rule => @rule.to_s,
23
22
  :skipping => @grammar.skipping_rule,
24
23
  :simplify => @grammar.simplify,
data/lib/kaiseki.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Kaiseki
2
- VERSION = '1.2.5'
2
+ VERSION = '1.3.1'
3
3
  file_path = File.dirname __FILE__
4
4
 
5
5
  #load basic kaiseki classes
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, options
5
+ def initialize string, rule, child = nil
6
6
  super string
7
- @rule = options[:rule]
8
- @line = nil
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
@@ -22,5 +22,9 @@ module Kaiseki
22
22
  def error_msg error = :main
23
23
  @errors.key?(error) ? @errors[error].verbose : nil
24
24
  end
25
+
26
+ def backtrace error = :main
27
+ @errors.key?(error) ? @errors[error].parsetrace.collect {|n| n.verbose } : nil
28
+ end
25
29
  end
26
30
  end
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 = true
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
@@ -10,7 +10,7 @@ module Kaiseki
10
10
  match
11
11
  end
12
12
  else
13
- raise ParseError.new "non-matching characters when parsing #{self}", options
13
+ raise ParseError.new "non-matching characters when parsing #{self}", options[:rule]
14
14
  end
15
15
  end
16
16
  end
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
@@ -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
@@ -32,7 +32,7 @@ module Kaiseki
32
32
  if passed
33
33
  result
34
34
  else
35
- raise ParseError.new "`#{result}' does not pass validation", options
35
+ raise ParseError.new "`#{result}' does not pass validation", options[:rule]
36
36
  end
37
37
  end
38
38
  end
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.2.5
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-02-28 00:00:00 -05:00
13
+ date: 2011-03-01 00:00:00 -05:00
14
14
  default_executable:
15
15
  dependencies: []
16
16