packcr 0.0.4 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/exe/packcr +3 -0
- data/lib/packcr/broadcast.rb +17 -0
- data/lib/packcr/cli.rb +27 -0
- data/lib/packcr/code_block.rb +2 -4
- data/lib/packcr/context.rb +66 -61
- data/lib/packcr/generated/context.rb +440 -0
- data/lib/packcr/generated/node/action_node.rb +60 -0
- data/lib/packcr/generated/node/alternate_node.rb +98 -0
- data/lib/packcr/generated/node/capture_node.rb +39 -0
- data/lib/packcr/generated/node/charclass_node.rb +372 -0
- data/lib/packcr/generated/node/eof_node.rb +20 -0
- data/lib/packcr/generated/node/error_node.rb +67 -0
- data/lib/packcr/generated/node/expand_node.rb +30 -0
- data/lib/packcr/generated/node/predicate_node.rb +140 -0
- data/lib/packcr/generated/node/quantity_node.rb +167 -0
- data/lib/packcr/generated/node/reference_node.rb +70 -0
- data/lib/packcr/generated/node/rule_node.rb +63 -0
- data/lib/packcr/generated/node/sequence_node.rb +42 -0
- data/lib/packcr/generated/node/string_node.rb +60 -0
- data/lib/packcr/generator.rb +14 -11
- data/lib/packcr/node/action_node.rb +18 -7
- data/lib/packcr/node/alternate_node.rb +22 -12
- data/lib/packcr/node/capture_node.rb +14 -12
- data/lib/packcr/node/charclass_node.rb +44 -24
- data/lib/packcr/node/eof_node.rb +25 -0
- data/lib/packcr/node/error_node.rb +20 -13
- data/lib/packcr/node/expand_node.rb +18 -9
- data/lib/packcr/node/predicate_node.rb +19 -26
- data/lib/packcr/node/quantity_node.rb +31 -24
- data/lib/packcr/node/reference_node.rb +31 -9
- data/lib/packcr/node/root_node.rb +61 -0
- data/lib/packcr/node/rule_node.rb +29 -3
- data/lib/packcr/node/sequence_node.rb +48 -31
- data/lib/packcr/node/string_node.rb +19 -16
- data/lib/packcr/node.rb +34 -5
- data/lib/packcr/parser.rb +4493 -3896
- data/lib/packcr/stream.rb +22 -22
- data/lib/packcr/templates/context/header.c.erb +29 -0
- data/lib/packcr/templates/context/source.c.erb +1069 -0
- data/lib/packcr/templates/context/source.rb.erb +341 -0
- data/lib/packcr/templates/node/action.c.erb +16 -0
- data/lib/packcr/templates/node/action.rb.erb +21 -0
- data/lib/packcr/templates/node/alternate.c.erb +34 -0
- data/lib/packcr/templates/node/alternate.rb.erb +39 -0
- data/lib/packcr/templates/node/capture.c.erb +17 -0
- data/lib/packcr/templates/node/capture.rb.erb +14 -0
- data/lib/packcr/templates/node/charclass.c.erb +47 -0
- data/lib/packcr/templates/node/charclass.rb.erb +49 -0
- data/lib/packcr/templates/node/charclass_any.c.erb +5 -0
- data/lib/packcr/templates/node/charclass_any.rb.erb +7 -0
- data/lib/packcr/templates/node/charclass_fail.c.erb +1 -0
- data/lib/packcr/templates/node/charclass_fail.rb.erb +1 -0
- data/lib/packcr/templates/node/charclass_one.c.erb +19 -0
- data/lib/packcr/templates/node/charclass_one.rb.erb +23 -0
- data/lib/packcr/templates/node/charclass_utf8.c.erb +49 -0
- data/lib/packcr/templates/node/charclass_utf8.rb.erb +50 -0
- data/lib/packcr/templates/node/charclass_utf8_reverse.rb.erb +51 -0
- data/lib/packcr/templates/node/eof.c.erb +1 -0
- data/lib/packcr/templates/node/eof.rb.erb +3 -0
- data/lib/packcr/templates/node/error.c.erb +28 -0
- data/lib/packcr/templates/node/error.rb.erb +34 -0
- data/lib/packcr/templates/node/expand.c.erb +16 -0
- data/lib/packcr/templates/node/expand.rb.erb +16 -0
- data/lib/packcr/templates/node/predicate.c.erb +30 -0
- data/lib/packcr/templates/node/predicate.rb.erb +28 -0
- data/lib/packcr/templates/node/predicate_neg.c.erb +23 -0
- data/lib/packcr/templates/node/predicate_neg.rb.erb +22 -0
- data/lib/packcr/templates/node/quantity_many.c.erb +45 -0
- data/lib/packcr/templates/node/quantity_many.rb.erb +47 -0
- data/lib/packcr/templates/node/quantity_one.c.erb +21 -0
- data/lib/packcr/templates/node/quantity_one.rb.erb +23 -0
- data/lib/packcr/templates/node/reference.c.erb +17 -0
- data/lib/packcr/templates/node/reference.rb.erb +21 -0
- data/lib/packcr/templates/node/reference_reverse.rb.erb +21 -0
- data/lib/packcr/templates/node/rule.c.erb +26 -0
- data/lib/packcr/templates/node/rule.rb.erb +30 -0
- data/lib/packcr/templates/node/sequence.c.erb +12 -0
- data/lib/packcr/templates/node/sequence.rb.erb +12 -0
- data/lib/packcr/templates/node/string_many.c.erb +11 -0
- data/lib/packcr/templates/node/string_many.rb.erb +10 -0
- data/lib/packcr/templates/node/string_one.c.erb +8 -0
- data/lib/packcr/templates/node/string_one.rb.erb +10 -0
- data/lib/packcr/util.rb +21 -24
- data/lib/packcr/version.rb +1 -1
- data/lib/packcr.rb +9 -13
- metadata +117 -10
- data/lib/packcr/buffer.rb +0 -47
data/lib/packcr/stream.rb
CHANGED
@@ -1,10 +1,9 @@
|
|
1
1
|
require "securerandom"
|
2
|
-
require "stringio"
|
3
2
|
|
4
3
|
class Packcr
|
5
4
|
class Stream
|
6
|
-
def initialize(
|
7
|
-
@
|
5
|
+
def initialize(stream, name, line)
|
6
|
+
@stream = stream
|
8
7
|
@name = name
|
9
8
|
@line = line
|
10
9
|
@line_directive_tag = nil
|
@@ -12,13 +11,13 @@ class Packcr
|
|
12
11
|
|
13
12
|
def write(s, rewrite_line_directive: false)
|
14
13
|
if rewrite_line_directive && @line_directive_tag && @line.respond_to?(:+)
|
15
|
-
s.gsub!(@line_directive_tag) { (@line +
|
14
|
+
s.gsub!(@line_directive_tag) { (@line + ::Regexp.last_match.pre_match.count("\n") + 1).to_s }
|
16
15
|
@line_directive_tag = nil
|
17
16
|
end
|
18
|
-
@
|
19
|
-
|
20
|
-
|
21
|
-
|
17
|
+
@stream << s
|
18
|
+
return unless @line.respond_to?(:+)
|
19
|
+
|
20
|
+
@line += s.count("\n")
|
22
21
|
end
|
23
22
|
|
24
23
|
def write_text(s)
|
@@ -27,6 +26,7 @@ class Packcr
|
|
27
26
|
|
28
27
|
def write_line_directive(fname, lineno)
|
29
28
|
return unless @line
|
29
|
+
|
30
30
|
if lineno.respond_to?(:+)
|
31
31
|
write("#line #{lineno + 1} \"")
|
32
32
|
else
|
@@ -45,22 +45,18 @@ class Packcr
|
|
45
45
|
def write_code_block(code, indent, fname)
|
46
46
|
text = code.text
|
47
47
|
ptr = text.b
|
48
|
-
len = code.len
|
49
48
|
lineno = code.line
|
50
|
-
if len == nil
|
51
|
-
return # for safety
|
52
|
-
end
|
53
49
|
|
54
50
|
ptr.sub!(/\A\n+/) do
|
55
|
-
lineno +=
|
51
|
+
lineno += ::Regexp.last_match(0).length
|
56
52
|
""
|
57
53
|
end
|
58
54
|
ptr.sub!(/[ \v\f\t\r\n]*\z/, "")
|
59
55
|
|
60
56
|
min_indent_spaces = nil
|
61
57
|
ptr.gsub!(/^([ \v\f\t]*)([^ \v\f\t\r\n])/) do
|
62
|
-
spaces =
|
63
|
-
char =
|
58
|
+
spaces = ::Regexp.last_match(1)
|
59
|
+
char = ::Regexp.last_match(2)
|
64
60
|
|
65
61
|
next char if char == "#"
|
66
62
|
|
@@ -76,7 +72,7 @@ class Packcr
|
|
76
72
|
if min_indent_spaces
|
77
73
|
indent_spaces = " " * indent
|
78
74
|
ptr.gsub!(/^#{min_indent_spaces}( *[^\n#])/) do
|
79
|
-
"#{indent_spaces}#{
|
75
|
+
"#{indent_spaces}#{::Regexp.last_match(1)}"
|
80
76
|
end
|
81
77
|
end
|
82
78
|
|
@@ -84,19 +80,23 @@ class Packcr
|
|
84
80
|
|
85
81
|
write_line_directive(fname, lineno)
|
86
82
|
ptr.scan(/^(.+?)[ \v\f\t\r]*$|^\r?\n/) do
|
87
|
-
write
|
83
|
+
write ::Regexp.last_match(1) if ::Regexp.last_match(1)
|
88
84
|
write "\n"
|
89
85
|
end
|
90
86
|
write_output_line_directive
|
91
87
|
end
|
92
88
|
|
93
89
|
def get_code_block(code, indent, fname)
|
94
|
-
buf =
|
95
|
-
line
|
90
|
+
buf = +""
|
91
|
+
line = @line
|
92
|
+
stream = @stream
|
93
|
+
@stream = buf
|
94
|
+
@line &&= :uuid
|
96
95
|
write_code_block(code, indent, fname)
|
97
|
-
|
96
|
+
buf
|
98
97
|
ensure
|
99
|
-
@line
|
98
|
+
@line = line
|
99
|
+
@stream = stream
|
100
100
|
end
|
101
101
|
end
|
102
|
-
end
|
102
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
/* A packrat parser generated by PackCR <%= Packcr::VERSION %> */
|
2
|
+
|
3
|
+
<%- code(:eheader).each do |code| -%>
|
4
|
+
<%= stream.get_code_block(code, 0, @iname) -%>
|
5
|
+
<%- end -%>
|
6
|
+
<%- if !code(:eheader).empty? -%>
|
7
|
+
|
8
|
+
<%- end -%>
|
9
|
+
#ifndef PCC_INCLUDED_<%= @hid %>
|
10
|
+
#define PCC_INCLUDED_<%= @hid %>
|
11
|
+
|
12
|
+
<%- code(:header).each do |code| -%>
|
13
|
+
<%= stream.get_code_block(code, 0, @iname) -%>
|
14
|
+
<%- end -%>
|
15
|
+
#ifdef __cplusplus
|
16
|
+
extern "C" {
|
17
|
+
#endif
|
18
|
+
|
19
|
+
typedef struct <%= prefix %>_context_tag <%= prefix %>_context_t;
|
20
|
+
|
21
|
+
<%= prefix %>_context_t *<%= prefix %>_create(<%= auxil_def %>auxil);
|
22
|
+
int <%= prefix %>_parse(<%= prefix %>_context_t *ctx, <%= value_def %>*ret);
|
23
|
+
void <%= prefix %>_destroy(<%= prefix %>_context_t *ctx);
|
24
|
+
|
25
|
+
#ifdef __cplusplus
|
26
|
+
}
|
27
|
+
#endif
|
28
|
+
|
29
|
+
#endif /* !PCC_INCLUDED_<%= @hid %> */
|