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.
- data/lib/extras.rb +29 -0
- data/lib/kaiseki.rb +3 -1
- data/lib/parseable.rb +5 -1
- data/lib/parser_list.rb +77 -0
- data/lib/stream.rb +4 -0
- metadata +5 -3
data/lib/extras.rb
ADDED
@@ -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
|
data/lib/kaiseki.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
module Kaiseki
|
2
|
-
VERSION = '1.3.
|
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
|
data/lib/parseable.rb
CHANGED
@@ -22,7 +22,7 @@ module Kaiseki
|
|
22
22
|
block.call
|
23
23
|
throw :ParseSuccess
|
24
24
|
end
|
25
|
-
raise RuntimeError, "#{self
|
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
|
data/lib/parser_list.rb
ADDED
@@ -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
|
data/lib/stream.rb
CHANGED
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: kaiseki
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 1.3.
|
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-
|
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.
|
97
|
+
rubygems_version: 1.6.2
|
96
98
|
signing_key:
|
97
99
|
specification_version: 3
|
98
100
|
summary: A parsing expression grammar generator
|