kaiseki 1.0.6 → 1.0.7

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/kaiseki.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Kaiseki
2
- VERSION = '1.0.6'
2
+ VERSION = '1.0.7'
3
3
  file_path = File.dirname __FILE__
4
4
 
5
5
  #load basic kaiseki classes
@@ -30,6 +30,7 @@ module Kaiseki
30
30
  require file_path + '/parser_repeat'
31
31
 
32
32
  require file_path + '/parser_package'
33
+ require file_path + '/parser_custom'
33
34
 
34
35
  #load predicates
35
36
  require file_path + '/predicate_and'
data/lib/parse_error.rb CHANGED
@@ -10,7 +10,7 @@ module Kaiseki
10
10
  end
11
11
 
12
12
  def verbose
13
- to_s
13
+ "#{@line ? @line + 1 : 0}:#{@column ? @column + 1 : 0}:#{to_s}"
14
14
  end
15
15
  end
16
16
  end
data/lib/parseable.rb CHANGED
@@ -8,6 +8,10 @@ module Kaiseki
8
8
  self.to_parseable.parse! stream.to_stream, options
9
9
  end
10
10
 
11
+ def predicate?
12
+ false
13
+ end
14
+
11
15
  def & other
12
16
  SequenceParser.new self, other
13
17
  end
@@ -0,0 +1,26 @@
1
+ module Kaiseki
2
+ attr_reader :name
3
+
4
+ class CustomParser < BasicParser
5
+ def initialize name = nil, is_predicate = false, &block
6
+ super block
7
+ @name = name
8
+ @is_predicate = is_predicate
9
+ end
10
+
11
+ def parse! stream, options = {}
12
+ stream.must_be Stream
13
+ stream.lock do
14
+ @expected.call stream, options
15
+ end
16
+ end
17
+
18
+ def predicate?
19
+ @is_predicate
20
+ end
21
+
22
+ def to_s
23
+ @name || @expected.inspect
24
+ end
25
+ end
26
+ end
@@ -4,6 +4,10 @@ module Kaiseki
4
4
  super expected.to_parseable
5
5
  end
6
6
 
7
+ def predicate?
8
+ @expected.predicate?
9
+ end
10
+
7
11
  def to_s
8
12
  @expected.to_s
9
13
  end
data/lib/parser_repeat.rb CHANGED
@@ -4,6 +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
8
  @expected = expected.to_parseable
8
9
  @min = min
9
10
  @max = max
data/lib/predicate_and.rb CHANGED
@@ -12,6 +12,10 @@ module Kaiseki
12
12
  end
13
13
  end
14
14
 
15
+ def predicate?
16
+ true
17
+ end
18
+
15
19
  def to_s
16
20
  "#{@expected}.and?"
17
21
  end
data/lib/predicate_not.rb CHANGED
@@ -12,6 +12,10 @@ module Kaiseki
12
12
  end
13
13
  end
14
14
 
15
+ def predicate?
16
+ true
17
+ end
18
+
15
19
  def to_s
16
20
  "#{@expected}.not!"
17
21
  end
@@ -12,6 +12,10 @@ module Kaiseki
12
12
  end
13
13
  end
14
14
 
15
+ def predicate?
16
+ true
17
+ end
18
+
15
19
  def to_s
16
20
  "#{@expected}.skip"
17
21
  end
data/lib/rule.rb CHANGED
@@ -18,6 +18,14 @@ module Kaiseki
18
18
  end
19
19
  end
20
20
 
21
+ def custom &block
22
+ if @parseable
23
+ raise "parseable for rule #{@name.inspect} already defined"
24
+ else
25
+ @parseable = CustomParser.new &block
26
+ end
27
+ end
28
+
21
29
  def override options
22
30
  if @parseable
23
31
  @parseable = @parseable.override options
data/lib/stream.rb CHANGED
@@ -4,13 +4,13 @@ module Kaiseki
4
4
 
5
5
  def initialize string
6
6
  if string.is_a? File
7
- @string = ''
8
- string.each_char {|n| @string << n }
7
+ @string = string.to_a.join
9
8
  else
10
9
  @string = string.to_s
11
10
  end
12
11
  @pos = 0
13
- #index_lines
12
+ @newlines = []
13
+ index_lines
14
14
  end
15
15
 
16
16
  def getc
@@ -32,14 +32,6 @@ module Kaiseki
32
32
  end
33
33
  end
34
34
 
35
- def look len = 10
36
- if @string.length - @pos > len
37
- "\"#{@string[@pos, len - 3] + '...'}\""
38
- else
39
- "\"#{@string[@pos..-1]}\""
40
- end
41
- end
42
-
43
35
  def goto pos
44
36
  if pos < 0
45
37
  @pos = 0
@@ -79,20 +71,36 @@ module Kaiseki
79
71
  alias :size :length
80
72
 
81
73
  def line
82
-
74
+ bsearch @pos, 0, @newlines.length
83
75
  end
84
76
 
85
77
  def column
86
-
78
+ @pos - @newlines[self.line][0]
87
79
  end
88
80
 
89
81
  private
90
82
  def index_lines
91
-
83
+ @newlines = []
84
+ start = 0
85
+ @string.length.times do |i|
86
+ if @string[i] == "\n"
87
+ @newlines << [start, i]
88
+ start = i + 1
89
+ end
90
+ end
91
+ @newlines << [start, @string.length]
92
92
  end
93
93
 
94
- def bsearch
95
-
94
+ def bsearch value, low, high
95
+ return nil if high < low
96
+ mid = low + (high - low) / 2
97
+ if value < @newlines[mid][0]
98
+ bsearch value, low, mid - 1
99
+ elsif value > @newlines[mid][1]
100
+ bsearch value, mid + 1, high
101
+ else
102
+ mid
103
+ end
96
104
  end
97
105
  end
98
106
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 1
7
7
  - 0
8
- - 6
9
- version: 1.0.6
8
+ - 7
9
+ version: 1.0.7
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: 2010-12-24 00:00:00 -05:00
17
+ date: 2011-01-08 00:00:00 -05:00
18
18
  default_executable:
19
19
  dependencies: []
20
20
 
@@ -52,6 +52,7 @@ files:
52
52
  - lib/grammar_stub.rb
53
53
  - lib/parser_sequence.rb
54
54
  - lib/mod_symbol.rb
55
+ - lib/parser_custom.rb
55
56
  - lib/parser_eof.rb
56
57
  - lib/parse_result.rb
57
58
  - lib/parser_symbol.rb