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 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