kaiseki 1.3.1 → 1.3.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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