kaiseki 1.0.7 → 1.0.8

Sign up to get free protection for your applications and to get access to all the features.
data/lib/grammar.rb CHANGED
@@ -28,7 +28,7 @@ module Kaiseki
28
28
  stream.lock do
29
29
  default_options = {
30
30
  :grammar => self,
31
- :rule => 'main',
31
+ :rule => '(main)',
32
32
  :skipping => @skipping_rule,
33
33
  :simplify => @simplify,
34
34
  :global => {},
@@ -43,12 +43,13 @@ module Kaiseki
43
43
 
44
44
  def starting parseable
45
45
  raise "starting rule already defined" if @starting_rule
46
- @starting_rule = parseable
46
+ @starting_rule = parseable.to_parseable
47
47
  end
48
48
 
49
49
  def skipping parseable
50
50
  raise "skipping rule already defined" if @skipping_rule
51
- @skipping_rule = parseable
51
+ raise "skipping rule must not be a predicate" if parseable.predicate?
52
+ @skipping_rule = parseable.to_parseable
52
53
  end
53
54
 
54
55
  def simplify bool = true
data/lib/grammar_stub.rb CHANGED
@@ -2,7 +2,7 @@ module Kaiseki
2
2
  class GrammarStub < PackageParser
3
3
  attr_reader :grammar, :rule
4
4
 
5
- def initialize expected, grammar, rule = 'main'
5
+ def initialize expected, grammar, rule = '(main)'
6
6
  super expected
7
7
  @grammar = grammar
8
8
  @rule = rule
@@ -11,7 +11,7 @@ module Kaiseki
11
11
  def parse! stream, options = {}
12
12
  default_options = {
13
13
  :grammar => @grammar,
14
- :rule => @rule,
14
+ :rule => @rule.to_s,
15
15
  :skipping => @grammar.skipping_rule,
16
16
  :simplify => @grammar.simplify,
17
17
  :global => {}
data/lib/kaiseki.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Kaiseki
2
- VERSION = '1.0.7'
2
+ VERSION = '1.0.8'
3
3
  file_path = File.dirname __FILE__
4
4
 
5
5
  #load basic kaiseki classes
@@ -30,7 +30,6 @@ module Kaiseki
30
30
  require file_path + '/parser_repeat'
31
31
 
32
32
  require file_path + '/parser_package'
33
- require file_path + '/parser_custom'
34
33
 
35
34
  #load predicates
36
35
  require file_path + '/predicate_and'
@@ -54,4 +53,7 @@ module Kaiseki
54
53
  require file_path + '/var_set'
55
54
  require file_path + '/var_get'
56
55
  require file_path + '/var_insert'
56
+
57
+ #load others
58
+ require file_path + '/parser_custom'
57
59
  end
data/lib/parse_error.rb CHANGED
@@ -10,7 +10,7 @@ module Kaiseki
10
10
  end
11
11
 
12
12
  def verbose
13
- "#{@line ? @line + 1 : 0}:#{@column ? @column + 1 : 0}:#{to_s}"
13
+ "[#{@line ? @line + 1 : 0}:#{@column ? @column + 1 : 0}] #{to_s} [in #{@rule}]"
14
14
  end
15
15
  end
16
16
  end
data/lib/parse_result.rb CHANGED
@@ -10,12 +10,12 @@ module Kaiseki
10
10
  end
11
11
  @result = '(skipped)'
12
12
  rescue ParseError => e
13
- @error = e
13
+ @error = e.verbose
14
14
  end
15
15
  end
16
16
 
17
- def has_errors?
18
- !!@error
17
+ def parsed?
18
+ @result ? true : false
19
19
  end
20
20
  end
21
21
  end
data/lib/parseable.rb CHANGED
@@ -12,6 +12,16 @@ module Kaiseki
12
12
  false
13
13
  end
14
14
 
15
+ def protect &block
16
+ catch :ParseSuccess do
17
+ catch :SkipSuccess do
18
+ block.call
19
+ throw :ParseSuccess
20
+ end
21
+ raise RuntimeError, "#{self.to_s} must not catch a SkipSuccess"
22
+ end
23
+ end
24
+
15
25
  def & other
16
26
  SequenceParser.new self, other
17
27
  end
data/lib/parser_choice.rb CHANGED
@@ -21,6 +21,10 @@ module Kaiseki
21
21
 
22
22
  alias :| :append
23
23
 
24
+ def predicate?
25
+ @expected.find {|n| n.predicate? } ? true : false
26
+ end
27
+
24
28
  def delimiter
25
29
  '|'
26
30
  end
data/lib/parser_custom.rb CHANGED
@@ -1,26 +1,21 @@
1
1
  module Kaiseki
2
- attr_reader :name
3
-
4
2
  class CustomParser < BasicParser
5
- def initialize name = nil, is_predicate = false, &block
3
+ NODE = Node.subclass [:stream, :options]
4
+
5
+ def initialize is_predicate = false, &block
6
6
  super block
7
- @name = name
8
7
  @is_predicate = is_predicate
9
8
  end
10
9
 
11
10
  def parse! stream, options = {}
12
11
  stream.must_be Stream
13
12
  stream.lock do
14
- @expected.call stream, options
13
+ NODE.new([stream, options], options[:global]).eval options[:global], &@expected
15
14
  end
16
15
  end
17
16
 
18
17
  def predicate?
19
18
  @is_predicate
20
19
  end
21
-
22
- def to_s
23
- @name || @expected.inspect
24
- end
25
20
  end
26
21
  end
data/lib/parser_repeat.rb CHANGED
@@ -4,7 +4,7 @@ module Kaiseki
4
4
  attr_reader :expected, :min, :max
5
5
 
6
6
  def initialize expected, min, max = nil
7
- raise "RepeatParser can't be initalized with a predicate" if expected.predicate?
7
+ raise ArgumentError, "expected must not be a predicate" if expected.predicate?
8
8
  @expected = expected.to_parseable
9
9
  @min = min
10
10
  @max = max
@@ -16,13 +16,13 @@ module Kaiseki
16
16
  result = []
17
17
  while @max.nil? or result.length < @max
18
18
  begin
19
- catch :SkipSuccess do
19
+ protect do
20
20
  result << @expected.parse(stream, options)
21
21
  end
22
22
  rescue ParseError
23
23
  if options[:skipping]
24
24
  begin
25
- catch :SkipSuccess do
25
+ protect do
26
26
  options[:skipping].parse stream, options.merge(:skipping => nil)
27
27
  end
28
28
  redo
@@ -12,7 +12,7 @@ module Kaiseki
12
12
  rescue ParseError => e
13
13
  if options[:skipping]
14
14
  begin
15
- catch :SkipSuccess do
15
+ protect do
16
16
  options[:skipping].parse stream, options.merge(:skipping => nil)
17
17
  end
18
18
  redo
@@ -27,7 +27,14 @@ module Kaiseki
27
27
  end
28
28
  end
29
29
  if options[:simplify]
30
- result.length == 1 ? result[0] : result
30
+ case result.length
31
+ when 0
32
+ throw :SkipSuccess
33
+ when 1
34
+ result[0]
35
+ else
36
+ result
37
+ end
31
38
  else
32
39
  result
33
40
  end
@@ -36,6 +43,10 @@ module Kaiseki
36
43
 
37
44
  alias :& :append
38
45
 
46
+ def predicate?
47
+ @expected.find {|n| !n.predicate? } ? false : true
48
+ end
49
+
39
50
  def delimiter
40
51
  '&'
41
52
  end
data/lib/parser_symbol.rb CHANGED
@@ -3,7 +3,7 @@ module Kaiseki
3
3
  def parse! stream, options = {}
4
4
  if options[:grammar]
5
5
  if options[:grammar].rules[@expected]
6
- options[:grammar].rules[@expected].parse stream, options.merge(:rule => @expected)
6
+ options[:grammar].rules[@expected].parse stream, options.merge(:rule => @expected.to_s)
7
7
  else
8
8
  STDERR.puts "skipping #{self}: not implemented"
9
9
  raise NotImplementedError
data/lib/rule.rb CHANGED
@@ -18,11 +18,11 @@ module Kaiseki
18
18
  end
19
19
  end
20
20
 
21
- def custom &block
21
+ def custom is_predicate = false, &block
22
22
  if @parseable
23
23
  raise "parseable for rule #{@name.inspect} already defined"
24
24
  else
25
- @parseable = CustomParser.new &block
25
+ @parseable = CustomParser.new is_predicate, &block
26
26
  end
27
27
  end
28
28
 
@@ -36,6 +36,7 @@ module Kaiseki
36
36
 
37
37
  def skipping parseable
38
38
  if @parseable
39
+ raise "skipping rule must not be a predicate" if parseable.predicate?
39
40
  @parseable = @parseable.override :skipping => parseable.to_parseable
40
41
  else
41
42
  raise "parseable for rule #{@name.inspect} undefined"
data/lib/stream.rb CHANGED
@@ -50,8 +50,8 @@ module Kaiseki
50
50
  throw :SkipSuccess
51
51
  rescue ParseError => e
52
52
  @pos = safe_pos
53
- #e.line ||= self.line
54
- #e.column ||= self.column
53
+ e.line ||= self.line
54
+ e.column ||= self.column
55
55
  raise e
56
56
  end
57
57
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 1
7
7
  - 0
8
- - 7
9
- version: 1.0.7
8
+ - 8
9
+ version: 1.0.8
10
10
  platform: ruby
11
11
  authors:
12
12
  - William Hamilton-Levi
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2011-01-08 00:00:00 -05:00
17
+ date: 2011-01-11 00:00:00 -05:00
18
18
  default_executable:
19
19
  dependencies: []
20
20