kaiseki 1.3.1 → 1.3.2

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.
@@ -0,0 +1,29 @@
1
+ module Kaiseki
2
+ LITERAL = CustomParser.new do
3
+ @stream.lock do
4
+ term = @stream.getc
5
+ failed = true
6
+ string = ''
7
+ raise ParseError.new "unexpected character \"#{term}\" (expected \"\"\" or \"\'\") when parsing #{self}", @options[:rule] unless term == '"' or term == "'"
8
+ while char = @stream.getc
9
+ if char == term
10
+ failed = false
11
+ break
12
+ elsif char == '\\'
13
+ if match = @stream.match(/\d+/)
14
+ string << Kernel.eval("\"\\#{match}\"")
15
+ else
16
+ string << Kernel.eval("\"\\#{@stream.getc}\"")
17
+ end
18
+ else
19
+ string << char
20
+ end
21
+ end
22
+ if failed
23
+ raise ParseError.new "unexpected end-of-string (expected \"#{term}\") when parsing #{self}", @options[:rule]
24
+ else
25
+ string
26
+ end
27
+ end
28
+ end
29
+ end
@@ -1,5 +1,5 @@
1
1
  module Kaiseki
2
- VERSION = '1.3.1'
2
+ VERSION = '1.3.2'
3
3
  file_path = File.dirname __FILE__
4
4
 
5
5
  #load basic kaiseki classes
@@ -28,6 +28,7 @@ module Kaiseki
28
28
  require file_path + '/parser_sequence'
29
29
  require file_path + '/parser_choice'
30
30
  require file_path + '/parser_repeat'
31
+ require file_path + '/parser_list'
31
32
 
32
33
  require file_path + '/parser_package'
33
34
 
@@ -63,4 +64,5 @@ module Kaiseki
63
64
 
64
65
  #load others
65
66
  require file_path + '/parser_custom'
67
+ require file_path + '/extras'
66
68
  end
@@ -22,7 +22,7 @@ module Kaiseki
22
22
  block.call
23
23
  throw :ParseSuccess
24
24
  end
25
- raise RuntimeError, "#{self.to_s} must not catch a SkipSuccess"
25
+ raise RuntimeError, "#{self} must not catch a SkipSuccess"
26
26
  end
27
27
  end
28
28
 
@@ -50,6 +50,10 @@ module Kaiseki
50
50
  repeat 1
51
51
  end
52
52
 
53
+ def list delimiter = ','
54
+ ListParser.new self, delimiter
55
+ end
56
+
53
57
  def and?
54
58
  AndPredicate.new self
55
59
  end
@@ -0,0 +1,77 @@
1
+ module Kaiseki
2
+ class ListParser
3
+ include Parseable
4
+ attr_reader :expected, :delimiter
5
+
6
+ def initialize expected, delimiter = ','
7
+ raise ArgumentError, "expected must not be a predicate" if expected.predicate?
8
+ @expected = expected
9
+ @delimiter = delimiter
10
+ end
11
+
12
+ def eql? other
13
+ other.is_a?(self.class) and other.expected == @expected and other.delimiter = @delimiter
14
+ end
15
+
16
+ alias :== :eql?
17
+
18
+ def to_s
19
+ "#{@expected}#{@delimiter} ..."
20
+ end
21
+
22
+ private
23
+ def parse! stream, options = {}
24
+ result = []
25
+ loop do
26
+ begin
27
+ catch :SkipSuccess do
28
+ result << @expected.parse(stream, options)
29
+ end
30
+ rescue ParseError => e
31
+ if options[:skipping]
32
+ begin
33
+ protect do
34
+ options[:skipping].parse stream, options.merge(:skipping => nil)
35
+ end
36
+ redo
37
+ rescue ParseError
38
+ raise e
39
+ end
40
+ else
41
+ raise e
42
+ end
43
+ end
44
+ begin
45
+ protect do
46
+ @delimiter.parse stream, options
47
+ end
48
+ rescue ParseError => e
49
+ if options[:skipping]
50
+ begin
51
+ protect do
52
+ options[:skipping].parse stream, options.merge(:skipping => nil)
53
+ end
54
+ redo
55
+ rescue ParseError
56
+ break
57
+ end
58
+ else
59
+ break
60
+ end
61
+ end
62
+ end
63
+ if options[:simplify]
64
+ case result.length
65
+ when 0
66
+ throw :SkipSuccess
67
+ when 1
68
+ result[0]
69
+ else
70
+ result
71
+ end
72
+ else
73
+ result
74
+ end
75
+ end
76
+ end
77
+ end
@@ -22,6 +22,10 @@ module Kaiseki
22
22
  end
23
23
  end
24
24
 
25
+ def eof?
26
+ @pos == @string.length
27
+ end
28
+
25
29
  def match regexp
26
30
  match = @string[@pos..-1].match /\A#{regexp}/
27
31
  if match
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: kaiseki
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 1.3.1
5
+ version: 1.3.2
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-03-01 00:00:00 -05:00
13
+ date: 2011-04-07 00:00:00 -04:00
14
14
  default_executable:
15
15
  dependencies: []
16
16
 
@@ -26,11 +26,13 @@ extra_rdoc_files: []
26
26
  files:
27
27
  - lib/result_merge.rb
28
28
  - lib/var_get.rb
29
+ - lib/parser_list.rb
29
30
  - lib/parser_package.rb
30
31
  - lib/var_set.rb
31
32
  - lib/mod_object.rb
32
33
  - lib/parser_string.rb
33
34
  - lib/node.rb
35
+ - lib/extras.rb
34
36
  - lib/predicate_skip.rb
35
37
  - lib/parser_choice.rb
36
38
  - lib/predicate_not.rb
@@ -92,7 +94,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
92
94
  requirements: []
93
95
 
94
96
  rubyforge_project:
95
- rubygems_version: 1.5.2
97
+ rubygems_version: 1.6.2
96
98
  signing_key:
97
99
  specification_version: 3
98
100
  summary: A parsing expression grammar generator