tdparser 1.5.0 → 1.6.0

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 TDParser
2
+ class StackParser < CompositeParser # :nodoc:
3
+ attr_reader :stack
4
+
5
+ def initialize(parser, stack)
6
+ @stack = stack
7
+ super(parser)
8
+ end
9
+
10
+ def call(tokens, buff)
11
+ x = @parsers[0].call(tokens, buff)
12
+ @stack.push(x)
13
+ x
14
+ end
15
+
16
+ def ==(other)
17
+ super(other) &&
18
+ (@stack == other.stack)
19
+ end
20
+
21
+ def same?(_r)
22
+ false
23
+ end
24
+
25
+ def to_s
26
+ "<stack:#{@stack.object_id}>"
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,29 @@
1
+ module TDParser
2
+ class StackrefParser < ReferenceParser # :nodoc:
3
+ attr_reader :stack, :equality
4
+
5
+ def initialize(stack, eqsym)
6
+ @stack = stack
7
+ @equality = eqsym
8
+ end
9
+
10
+ def call(tokens, buff)
11
+ ys = @stack.pop
12
+ if ys.nil? || ys.empty?
13
+ nil
14
+ else
15
+ back_ref(ys.dup, @equality).call(tokens, buff)
16
+ end
17
+ end
18
+
19
+ def to_s
20
+ "<stackref:#{@stack.object_id}>"
21
+ end
22
+
23
+ def ==(other)
24
+ super(other) &&
25
+ @stack.equal?(other.stack) &&
26
+ (@equality == other.equality)
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,28 @@
1
+ module TDParser
2
+ class StateParser < Parser # :nodoc:
3
+ attr_reader :state
4
+
5
+ def initialize(s)
6
+ @state = s
7
+ end
8
+
9
+ def call(_tokens, buff)
10
+ return unless buff.map[:state] == @state
11
+
12
+ Sequence[@state]
13
+ end
14
+
15
+ def to_s
16
+ "<state:#{@state}>"
17
+ end
18
+
19
+ def ==(other)
20
+ super(other) &&
21
+ (@state == other.state)
22
+ end
23
+
24
+ def same?(_r)
25
+ false
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,28 @@
1
+ module TDParser
2
+ class TerminalParser < Parser # :nodoc:
3
+ attr_reader :symbol, :equality
4
+
5
+ def initialize(obj, eqsym)
6
+ @symbol = obj
7
+ @equality = eqsym
8
+ end
9
+
10
+ def call(tokens, buff)
11
+ t = tokens.shift
12
+ buff.unshift(t)
13
+ return unless @symbol.__send__(@equality, t) || t.__send__(@equality, @symbol)
14
+
15
+ Sequence[t]
16
+ end
17
+
18
+ def ==(other)
19
+ (self.class == other.class) &&
20
+ (@symbol == other.symbol) &&
21
+ (@equality == other.equality)
22
+ end
23
+
24
+ def to_s
25
+ @symbol.to_s
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,43 @@
1
+ require "forwardable"
2
+
3
+ module TDParser
4
+ class TokenBuffer # :nodoc:
5
+ attr_accessor :map, :state
6
+
7
+ def initialize(*args)
8
+ @array = Array.new(args)
9
+ @map = {}
10
+ end
11
+
12
+ def [](idx)
13
+ case idx
14
+ when Symbol, String
15
+ @map[idx]
16
+ else
17
+ @array[idx]
18
+ end
19
+ end
20
+
21
+ def []=(idx, val)
22
+ case idx
23
+ when Symbol, String
24
+ @map[idx] = val
25
+ else
26
+ @array[idx] = val
27
+ end
28
+ end
29
+
30
+ def clear
31
+ @array.clear
32
+ @map.clear
33
+ end
34
+
35
+ class << self
36
+ alias [] new
37
+ end
38
+
39
+ extend Forwardable
40
+ def_delegators :@array, :each, :unshift, :insert, :reverse, :join, :pop, :push, :to_a
41
+ include Enumerable
42
+ end
43
+ end
@@ -0,0 +1,43 @@
1
+ module TDParser
2
+ class TokenGenerator
3
+ def initialize(args = nil, &block)
4
+ enumerator = Enumerator.new do |y|
5
+ if args
6
+ args.each { |arg| y << arg }
7
+ else
8
+ block.call(y)
9
+ end
10
+ end
11
+ @enumerator = enumerator
12
+
13
+ @buffer = []
14
+ end
15
+
16
+ def next
17
+ @enumerator.next
18
+ end
19
+
20
+ def next?
21
+ @enumerator.peek
22
+ true
23
+ rescue StopIteration
24
+ false
25
+ end
26
+
27
+ def to_a
28
+ @enumerator.to_a
29
+ end
30
+
31
+ def shift
32
+ if @buffer.empty?
33
+ (self.next if next?)
34
+ else
35
+ @buffer.shift
36
+ end
37
+ end
38
+
39
+ def unshift(*token)
40
+ @buffer.unshift(*token)
41
+ end
42
+ end
43
+ end
@@ -3,7 +3,7 @@
3
3
  require 'tdparser'
4
4
 
5
5
  module TDParser
6
- class Token
6
+ class Token # :nodoc:
7
7
  attr_accessor :kind, :value
8
8
 
9
9
  def initialize(kind, value)
@@ -26,7 +26,7 @@ module TDParser
26
26
  end
27
27
  end
28
28
 
29
- class BasicStringTokenizer
29
+ class BasicStringTokenizer # :nodoc:
30
30
  def self.[](rule, ignore = nil)
31
31
  new(rule, ignore)
32
32
  end
@@ -41,7 +41,7 @@ module TDParser
41
41
  def generate(str)
42
42
  scanner = StringScanner.new(str)
43
43
  TDParser::TokenGenerator.new do |x|
44
- until scanner.empty?
44
+ until scanner.eos?
45
45
  if @ignore_pattern
46
46
  while scanner.scan(@ignore_pattern)
47
47
  end
@@ -52,7 +52,6 @@ module TDParser
52
52
  next unless reg =~ sstr
53
53
 
54
54
  x.yield(Token.new(kind, sstr))
55
- yielded = true
56
55
  break
57
56
  end
58
57
  else
@@ -70,7 +69,7 @@ module TDParser
70
69
  end
71
70
  end
72
71
 
73
- class WaitingTokenGenerator < TDParser::TokenGenerator
72
+ class WaitingTokenGenerator < TDParser::TokenGenerator # :nodoc:
74
73
  def initialize(*args)
75
74
  super(*args)
76
75
  @terminated = false
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TDParser
4
- VERSION = '1.5.0'
4
+ VERSION = '1.6.0'
5
5
  end
data/lib/tdparser/xml.rb CHANGED
@@ -5,20 +5,22 @@ require 'rexml/parsers/pullparser'
5
5
  require 'rexml/document'
6
6
 
7
7
  module TDParser
8
- module XMLParser
9
- class XMLTokenGenerator < TDParser::TokenGenerator
10
- def initialize(src)
11
- @xparser = REXML::Parsers::BaseParser.new(src)
12
- super() do |g|
13
- while @xparser.has_next?
14
- e = @xparser.pull
15
- g.yield(e)
16
- end
8
+ class XMLTokenGenerator < TDParser::TokenGenerator
9
+ def initialize(src)
10
+ @xparser = REXML::Parsers::BaseParser.new(src)
11
+ super() do |g|
12
+ while @xparser.has_next?
13
+ e = @xparser.pull
14
+ g.yield(e)
17
15
  end
18
16
  end
19
17
  end
18
+ end
19
+
20
+ module XMLParser
21
+ XMLTokenGenerator = ::TDParser::XMLTokenGenerator # TODO: Delete in later version
20
22
 
21
- class XArray < Array
23
+ class XArray < Array # :nodoc:
22
24
  def ===(ary)
23
25
  return true if super(ary)
24
26
  return false unless ary.is_a?(Array)
@@ -34,7 +36,7 @@ module TDParser
34
36
  end
35
37
  end
36
38
 
37
- class XHash < Hash
39
+ class XHash < Hash # :nodoc:
38
40
  def ===(h)
39
41
  return true if super(h)
40
42
  return false unless h.is_a?(Hash)