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