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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +17 -0
- data/README +5 -0
- data/Rakefile +4 -0
- data/lib/tdparser/action_parser.rb +29 -0
- data/lib/tdparser/any_parser.rb +20 -0
- data/lib/tdparser/backref_parser.rb +29 -0
- data/lib/tdparser/buffer_utils.rb +13 -0
- data/lib/tdparser/choice_parser.rb +80 -0
- data/lib/tdparser/composite_parser.rb +29 -0
- data/lib/tdparser/concat_parser.rb +21 -0
- data/lib/tdparser/condition_parser.rb +28 -0
- data/lib/tdparser/empty_parser.rb +15 -0
- data/lib/tdparser/fail_parser.rb +15 -0
- data/lib/tdparser/grammar.rb +23 -0
- data/lib/tdparser/iteration_parser.rb +73 -0
- data/lib/tdparser/label_parser.rb +25 -0
- data/lib/tdparser/negative_parser.rb +17 -0
- data/lib/tdparser/non_terminal_parser.rb +33 -0
- data/lib/tdparser/none_parser.rb +18 -0
- data/lib/tdparser/parallel_parser.rb +18 -0
- data/lib/tdparser/parser.rb +104 -0
- data/lib/tdparser/reference_parser.rb +23 -0
- data/lib/tdparser/sequence.rb +7 -0
- data/lib/tdparser/stack_parser.rb +29 -0
- data/lib/tdparser/stackref_parser.rb +29 -0
- data/lib/tdparser/state_parser.rb +28 -0
- data/lib/tdparser/terminal_parser.rb +28 -0
- data/lib/tdparser/token_buffer.rb +43 -0
- data/lib/tdparser/token_generator.rb +43 -0
- data/lib/tdparser/utils.rb +4 -5
- data/lib/tdparser/version.rb +1 -1
- data/lib/tdparser/xml.rb +13 -11
- data/lib/tdparser.rb +45 -818
- data/samples/sample4.rb +0 -1
- data/sig/tdparser.rbs +334 -0
- data/updoc +11 -0
- metadata +37 -3
@@ -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
|
data/lib/tdparser/utils.rb
CHANGED
@@ -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.
|
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
|
data/lib/tdparser/version.rb
CHANGED
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
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
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)
|