packcr 0.0.3 → 0.0.4
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/lib/packcr/context.rb +10 -827
- data/lib/packcr/generator.rb +1 -0
- data/lib/packcr/node/action_node.rb +8 -2
- data/lib/packcr/node/alternate_node.rb +8 -3
- data/lib/packcr/node/capture_node.rb +14 -0
- data/lib/packcr/node/charclass_node.rb +4 -0
- data/lib/packcr/node/error_node.rb +15 -2
- data/lib/packcr/node/expand_node.rb +4 -0
- data/lib/packcr/node/predicate_node.rb +8 -3
- data/lib/packcr/node/quantity_node.rb +9 -4
- data/lib/packcr/node/reference_node.rb +22 -0
- data/lib/packcr/node/rule_node.rb +14 -2
- data/lib/packcr/node/sequence_node.rb +8 -3
- data/lib/packcr/node/string_node.rb +4 -0
- data/lib/packcr/node.rb +17 -0
- data/lib/packcr/parser.rb +4292 -0
- data/lib/packcr/stream.rb +2 -1
- data/lib/packcr/util.rb +3 -0
- data/lib/packcr/version.rb +1 -1
- metadata +3 -2
data/lib/packcr/generator.rb
CHANGED
@@ -3,8 +3,9 @@ class Packcr
|
|
3
3
|
class ActionNode < Packcr::Node
|
4
4
|
attr_accessor :code, :index, :vars, :capts
|
5
5
|
|
6
|
-
def initialize
|
7
|
-
super
|
6
|
+
def initialize(code = nil)
|
7
|
+
super()
|
8
|
+
@code = code
|
8
9
|
self.vars = []
|
9
10
|
self.capts = []
|
10
11
|
end
|
@@ -47,6 +48,11 @@ class Packcr
|
|
47
48
|
|
48
49
|
def link_references(ctx)
|
49
50
|
end
|
51
|
+
|
52
|
+
def setup_rule(rule)
|
53
|
+
@index = rule.codes.length
|
54
|
+
rule.codes.push(self)
|
55
|
+
end
|
50
56
|
end
|
51
57
|
end
|
52
58
|
end
|
@@ -3,9 +3,14 @@ class Packcr
|
|
3
3
|
class AlternateNode < Packcr::Node
|
4
4
|
attr_accessor :nodes
|
5
5
|
|
6
|
-
def initialize
|
7
|
-
super
|
8
|
-
self.nodes =
|
6
|
+
def initialize(*nodes)
|
7
|
+
super()
|
8
|
+
self.nodes = nodes
|
9
|
+
end
|
10
|
+
|
11
|
+
def alt(node)
|
12
|
+
@nodes << node
|
13
|
+
self
|
9
14
|
end
|
10
15
|
|
11
16
|
def debug_dump(indent = 0)
|
@@ -3,6 +3,10 @@ class Packcr
|
|
3
3
|
class CaptureNode < Packcr::Node
|
4
4
|
attr_accessor :expr, :index
|
5
5
|
|
6
|
+
def initialize(expr = nil)
|
7
|
+
@expr = expr
|
8
|
+
end
|
9
|
+
|
6
10
|
def debug_dump(indent = 0)
|
7
11
|
$stdout.print "#{" " * indent}Capture(index:"
|
8
12
|
Packcr.dump_integer_value(index)
|
@@ -29,6 +33,16 @@ class Packcr
|
|
29
33
|
def link_references(ctx)
|
30
34
|
expr.link_references(ctx)
|
31
35
|
end
|
36
|
+
|
37
|
+
def nodes
|
38
|
+
[expr]
|
39
|
+
end
|
40
|
+
|
41
|
+
def setup_rule(rule)
|
42
|
+
@index = rule.capts.length
|
43
|
+
rule.capts << self
|
44
|
+
super
|
45
|
+
end
|
32
46
|
end
|
33
47
|
end
|
34
48
|
end
|
@@ -3,8 +3,11 @@ class Packcr
|
|
3
3
|
class ErrorNode < Packcr::Node
|
4
4
|
attr_accessor :expr, :code, :index, :vars, :capts
|
5
5
|
|
6
|
-
def initialize
|
7
|
-
super
|
6
|
+
def initialize(expr = nil, code = nil, index = nil)
|
7
|
+
super()
|
8
|
+
@expr = expr
|
9
|
+
@code = code
|
10
|
+
@index = index
|
8
11
|
self.vars = []
|
9
12
|
self.capts = []
|
10
13
|
end
|
@@ -47,6 +50,16 @@ class Packcr
|
|
47
50
|
def link_references(ctx)
|
48
51
|
expr.link_references(ctx)
|
49
52
|
end
|
53
|
+
|
54
|
+
def nodes
|
55
|
+
[expr]
|
56
|
+
end
|
57
|
+
|
58
|
+
def setup_rule(rule)
|
59
|
+
@index = rule.codes.length
|
60
|
+
rule.codes.push(self)
|
61
|
+
super
|
62
|
+
end
|
50
63
|
end
|
51
64
|
end
|
52
65
|
end
|
@@ -3,9 +3,10 @@ class Packcr
|
|
3
3
|
class PredicateNode < Packcr::Node
|
4
4
|
attr_accessor :neg, :expr
|
5
5
|
|
6
|
-
def initialize
|
7
|
-
super
|
8
|
-
|
6
|
+
def initialize(expr = nil, neg = false)
|
7
|
+
super()
|
8
|
+
@expr = expr
|
9
|
+
@neg = neg
|
9
10
|
end
|
10
11
|
|
11
12
|
def debug_dump(indent = 0)
|
@@ -46,6 +47,10 @@ class Packcr
|
|
46
47
|
def link_references(ctx)
|
47
48
|
expr.link_references(ctx)
|
48
49
|
end
|
50
|
+
|
51
|
+
def nodes
|
52
|
+
[expr]
|
53
|
+
end
|
49
54
|
end
|
50
55
|
end
|
51
56
|
end
|
@@ -3,10 +3,11 @@ class Packcr
|
|
3
3
|
class QuantityNode < Packcr::Node
|
4
4
|
attr_accessor :min, :max, :expr
|
5
5
|
|
6
|
-
def initialize
|
7
|
-
super
|
8
|
-
|
9
|
-
|
6
|
+
def initialize(expr = nil, min = 0, max = 0)
|
7
|
+
super()
|
8
|
+
@expr = expr
|
9
|
+
@min = min
|
10
|
+
@max = max
|
10
11
|
end
|
11
12
|
|
12
13
|
def debug_dump(indent = 0)
|
@@ -50,6 +51,10 @@ class Packcr
|
|
50
51
|
def link_references(ctx)
|
51
52
|
expr.link_references(ctx)
|
52
53
|
end
|
54
|
+
|
55
|
+
def nodes
|
56
|
+
[expr]
|
57
|
+
end
|
53
58
|
end
|
54
59
|
end
|
55
60
|
end
|
@@ -3,6 +3,13 @@ class Packcr
|
|
3
3
|
class ReferenceNode < Packcr::Node
|
4
4
|
attr_accessor :var, :index, :name, :rule, :line, :col
|
5
5
|
|
6
|
+
def initialize(name = nil, var = nil, line = nil, col = nil)
|
7
|
+
@name = name
|
8
|
+
@var = var
|
9
|
+
@line = line
|
10
|
+
@col = col
|
11
|
+
end
|
12
|
+
|
6
13
|
def debug_dump(indent = 0)
|
7
14
|
$stdout.print "#{" " * indent}Reference(var:'#{var || "(null)"}', index:"
|
8
15
|
Packcr.dump_integer_value(index)
|
@@ -14,6 +21,21 @@ class Packcr
|
|
14
21
|
Packcr::CODE_REACH__BOTH
|
15
22
|
end
|
16
23
|
|
24
|
+
def setup_rule(rule)
|
25
|
+
return unless var
|
26
|
+
i = rule.vars.index do |ref|
|
27
|
+
unless ref.is_a?(Packcr::Node::ReferenceNode)
|
28
|
+
raise "Unexpected node type: #{ref.class}"
|
29
|
+
end
|
30
|
+
var == ref.var
|
31
|
+
end
|
32
|
+
if !i
|
33
|
+
i = rule.vars.length
|
34
|
+
rule.vars << self
|
35
|
+
end
|
36
|
+
@index = i
|
37
|
+
end
|
38
|
+
|
17
39
|
def verify_variables(vars)
|
18
40
|
return if index.nil?
|
19
41
|
|
@@ -3,12 +3,16 @@ class Packcr
|
|
3
3
|
class RuleNode < Packcr::Node
|
4
4
|
attr_accessor :codes, :name, :expr, :ref, :vars, :capts, :line, :col
|
5
5
|
|
6
|
-
def initialize
|
7
|
-
super
|
6
|
+
def initialize(expr = nil, name = nil, line = nil, col = nil)
|
7
|
+
super()
|
8
8
|
self.ref = 0
|
9
9
|
self.vars = []
|
10
10
|
self.capts = []
|
11
11
|
self.codes = []
|
12
|
+
@expr = expr
|
13
|
+
@name = name
|
14
|
+
@line = line
|
15
|
+
@col = col
|
12
16
|
end
|
13
17
|
|
14
18
|
def debug_dump(indent = 0)
|
@@ -25,6 +29,14 @@ class Packcr
|
|
25
29
|
def add_ref
|
26
30
|
@ref += 1
|
27
31
|
end
|
32
|
+
|
33
|
+
def setup
|
34
|
+
setup_rule(self)
|
35
|
+
end
|
36
|
+
|
37
|
+
def nodes
|
38
|
+
[expr]
|
39
|
+
end
|
28
40
|
end
|
29
41
|
end
|
30
42
|
end
|
@@ -3,9 +3,14 @@ class Packcr
|
|
3
3
|
class SequenceNode < Packcr::Node
|
4
4
|
attr_accessor :nodes
|
5
5
|
|
6
|
-
def initialize
|
7
|
-
super
|
8
|
-
self.nodes =
|
6
|
+
def initialize(*nodes)
|
7
|
+
super()
|
8
|
+
self.nodes = nodes
|
9
|
+
end
|
10
|
+
|
11
|
+
def seq(node)
|
12
|
+
@nodes << node
|
13
|
+
self
|
9
14
|
end
|
10
15
|
|
11
16
|
def debug_dump(indent = 0)
|
data/lib/packcr/node.rb
CHANGED
@@ -1,5 +1,22 @@
|
|
1
1
|
class Packcr
|
2
2
|
class Node
|
3
|
+
def seq(expr)
|
4
|
+
SequenceNode.new(self, expr)
|
5
|
+
end
|
6
|
+
|
7
|
+
def alt(expr)
|
8
|
+
AlternateNode.new(self, expr)
|
9
|
+
end
|
10
|
+
|
11
|
+
def setup_rule(rule)
|
12
|
+
nodes.each do |node|
|
13
|
+
node.setup_rule(rule)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def nodes
|
18
|
+
[]
|
19
|
+
end
|
3
20
|
end
|
4
21
|
end
|
5
22
|
|