packcr 0.0.6 → 0.0.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE +21 -0
- data/README.md +73 -0
- data/lib/packcr/cli.rb +18 -16
- data/lib/packcr/code_block.rb +0 -1
- data/lib/packcr/context.rb +20 -18
- data/lib/packcr/generated/context.rb +483 -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 +166 -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 +2 -1
- data/lib/packcr/node/action_node.rb +4 -2
- data/lib/packcr/node/alternate_node.rb +3 -1
- data/lib/packcr/node/capture_node.rb +3 -1
- data/lib/packcr/node/charclass_node.rb +24 -28
- data/lib/packcr/node/eof_node.rb +4 -2
- data/lib/packcr/node/error_node.rb +3 -1
- data/lib/packcr/node/expand_node.rb +8 -5
- data/lib/packcr/node/predicate_node.rb +4 -2
- data/lib/packcr/node/quantity_node.rb +12 -10
- data/lib/packcr/node/reference_node.rb +11 -5
- data/lib/packcr/node/root_node.rb +1 -0
- data/lib/packcr/node/rule_node.rb +7 -4
- data/lib/packcr/node/sequence_node.rb +3 -1
- data/lib/packcr/node/string_node.rb +9 -6
- data/lib/packcr/node.rb +3 -5
- data/lib/packcr/parser.rb +4389 -4064
- data/lib/packcr/stream.rb +17 -12
- data/lib/packcr/templates/context/header.c.erb +3 -3
- data/lib/packcr/templates/context/source.c.erb +481 -690
- data/lib/packcr/templates/context/source.rb.erb +123 -171
- data/lib/packcr/templates/node/action.c.erb +5 -5
- data/lib/packcr/templates/node/action.rb.erb +2 -2
- data/lib/packcr/templates/node/alternate.c.erb +9 -9
- data/lib/packcr/templates/node/alternate.rb.erb +4 -5
- data/lib/packcr/templates/node/capture.c.erb +7 -7
- data/lib/packcr/templates/node/capture.rb.erb +4 -4
- data/lib/packcr/templates/node/charclass.c.erb +12 -12
- data/lib/packcr/templates/node/charclass.rb.erb +6 -6
- data/lib/packcr/templates/node/charclass_any.c.erb +3 -3
- data/lib/packcr/templates/node/charclass_any.rb.erb +2 -2
- data/lib/packcr/templates/node/charclass_fail.c.erb +1 -1
- data/lib/packcr/templates/node/charclass_one.c.erb +10 -10
- data/lib/packcr/templates/node/charclass_one.rb.erb +6 -6
- data/lib/packcr/templates/node/charclass_utf8.c.erb +8 -8
- data/lib/packcr/templates/node/charclass_utf8.rb.erb +3 -3
- data/lib/packcr/templates/node/charclass_utf8_reverse.rb.erb +5 -5
- data/lib/packcr/templates/node/eof.c.erb +1 -1
- data/lib/packcr/templates/node/error.c.erb +11 -11
- data/lib/packcr/templates/node/error.rb.erb +2 -2
- data/lib/packcr/templates/node/expand.c.erb +5 -5
- data/lib/packcr/templates/node/expand.rb.erb +3 -3
- data/lib/packcr/templates/node/predicate.c.erb +10 -10
- data/lib/packcr/templates/node/predicate.rb.erb +6 -6
- data/lib/packcr/templates/node/predicate_neg.c.erb +8 -8
- data/lib/packcr/templates/node/predicate_neg.rb.erb +6 -6
- data/lib/packcr/templates/node/quantity_many.c.erb +47 -0
- data/lib/packcr/templates/node/{quantify_many.rb.erb → quantity_many.rb.erb} +9 -9
- data/lib/packcr/templates/node/quantity_one.c.erb +23 -0
- data/lib/packcr/templates/node/{quantify_one.rb.erb → quantity_one.rb.erb} +8 -8
- data/lib/packcr/templates/node/reference.c.erb +14 -2
- data/lib/packcr/templates/node/reference.rb.erb +16 -4
- data/lib/packcr/templates/node/reference_reverse.rb.erb +16 -4
- data/lib/packcr/templates/node/rule.c.erb +14 -7
- data/lib/packcr/templates/node/rule.rb.erb +26 -19
- data/lib/packcr/templates/node/string_many.c.erb +6 -6
- data/lib/packcr/templates/node/string_many.rb.erb +3 -3
- data/lib/packcr/templates/node/string_one.c.erb +5 -5
- data/lib/packcr/templates/node/string_one.rb.erb +3 -3
- data/lib/packcr/util.rb +21 -16
- data/lib/packcr/version.rb +1 -1
- data/lib/packcr.rb +8 -11
- metadata +40 -10
- data/lib/packcr/templates/node/quantify_many.c.erb +0 -45
- data/lib/packcr/templates/node/quantify_one.c.erb +0 -21
- data/lib/packcr/tokenizer.rb +0 -2948
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cacf5e781ba49bcc7d755ac5ba6e348646a08e4a807efd4375ba720232262556
|
4
|
+
data.tar.gz: ce70800733fbc71527539174f373786489f3fdda416b5435bf8aa687de1cd321
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f0cf28feb81c97f094f6b098656ab4ec30f312e99c84789c5e5f53cf8a520c4c63a561d48a240b7ab0699d2e063820e3b923118d33e2a9e3b5dfc2884993ac9d
|
7
|
+
data.tar.gz: c858ad58e577af40013bbd7438eb3c4066d0c76b0a6407c5ab051ae63a379936594da974a1c203a72659d3dcebc4794c0aaaf5beea2ab98169388a89c0c79773
|
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
PackCR: a packrat parser generator for C as ruby library.
|
2
|
+
|
3
|
+
Copyright (c) 2022 wanabe All rights reserved.
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
# PackCR
|
2
|
+
|
3
|
+
## Overview
|
4
|
+
|
5
|
+
PackCR is a parser generator for C or Ruby.
|
6
|
+
This library is a port of PackCC rewritten in ruby.
|
7
|
+
The Original PackCC is https://github.com/arithy/packcc.
|
8
|
+
|
9
|
+
## Usage
|
10
|
+
|
11
|
+
You can get Packcr object with `Packcr.new(peg_path)` and it can generate C source and header with `Packcr#run`.
|
12
|
+
|
13
|
+
Example(1):
|
14
|
+
|
15
|
+
```
|
16
|
+
$ cat ./tmp/example1.sh
|
17
|
+
#!/bin/sh
|
18
|
+
set -e
|
19
|
+
cd $0/..
|
20
|
+
cp ../packcc/examples/calc.peg calc.c.peg
|
21
|
+
bundle exec ruby -e 'require "packcr"; Packcr.new("calc.c.peg").run'
|
22
|
+
gcc calc.c
|
23
|
+
echo "1 + 2 * 3 - 4 / 2" | ./a.out
|
24
|
+
|
25
|
+
$ ./tmp/example1.sh
|
26
|
+
answer=5
|
27
|
+
```
|
28
|
+
|
29
|
+
Example(2):
|
30
|
+
|
31
|
+
```
|
32
|
+
$ cat ./tmp/example2.sh
|
33
|
+
#!/bin/sh
|
34
|
+
set -e
|
35
|
+
cd $0/..
|
36
|
+
cp ../examples/calc.rb.peg .
|
37
|
+
bundle exec ruby -e 'require "packcr"; Packcr.new("calc.rb.peg").run'
|
38
|
+
ruby calc.rb "1 + 2 * 3 - 4 / 2"
|
39
|
+
|
40
|
+
$ ./tmp/example2.sh
|
41
|
+
answer=5
|
42
|
+
```
|
43
|
+
|
44
|
+
## Syntax
|
45
|
+
|
46
|
+
The syntax is almost the same as PackCC.
|
47
|
+
Additional syntax is shown below.
|
48
|
+
|
49
|
+
**`%location` `{` _source code_ `}`**
|
50
|
+
|
51
|
+
It defines your own location structure.
|
52
|
+
It should have some definitions for C:
|
53
|
+
|
54
|
+
- struct
|
55
|
+
- `packcr_location_t`
|
56
|
+
- function
|
57
|
+
- `void packcr_location_init(packcr_location_t *lp)`
|
58
|
+
- `void packcr_location_forward(packcr_location_t *lp, char *buf, size_t n)`
|
59
|
+
- `packcr_location_t packcr_location_add(packcr_location_t l1, packcr_location_t l2)`
|
60
|
+
- `packcr_location_t packcr_location_sub(packcr_location_t l1, packcr_location_t l2)`
|
61
|
+
- (The functions can be `static` and/or `inline`)
|
62
|
+
|
63
|
+
Or it should have some definitions for ruby:
|
64
|
+
- class
|
65
|
+
- `Location`
|
66
|
+
- method
|
67
|
+
- `Location#initialize(...)`
|
68
|
+
- `Location#+(loc)`
|
69
|
+
- `Location#-(loc)`
|
70
|
+
- `Location#forward(str, index, n)`
|
71
|
+
|
72
|
+
Locations are captured and they can be refer with **`$`**_n_**`sl`** and **`$`**_n_**`el`**.
|
73
|
+
You can see the examples [examples/calc_loc.peg](examples/calc_loc.peg) and [examples/calc_loc.rb.peg](examples/calc_loc.rb.peg).
|
data/lib/packcr/cli.rb
CHANGED
@@ -1,25 +1,27 @@
|
|
1
1
|
require "packcr"
|
2
2
|
require "optparse"
|
3
3
|
|
4
|
-
class Packcr
|
5
|
-
class
|
6
|
-
|
7
|
-
|
4
|
+
class Packcr
|
5
|
+
class Cli
|
6
|
+
class << self
|
7
|
+
def run(argv)
|
8
|
+
new.run(argv)
|
9
|
+
end
|
8
10
|
end
|
9
|
-
end
|
10
11
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
12
|
+
def run(argv)
|
13
|
+
lang = nil
|
14
|
+
debug = false
|
15
|
+
ascii = false
|
16
|
+
opt = OptionParser.new
|
17
|
+
opt.on("-l", "--lang=VAL") { |v| lang = v.to_sym }
|
18
|
+
opt.on("-d", "--debug") { |_v| debug = true }
|
19
|
+
opt.on("-a", "--ascii") { |_v| ascii = true }
|
19
20
|
|
20
|
-
|
21
|
-
|
22
|
-
|
21
|
+
opt.parse!(argv)
|
22
|
+
argv.each do |ifile|
|
23
|
+
::Packcr.new(ifile, lang: lang, debug: debug, ascii: ascii).run
|
24
|
+
end
|
23
25
|
end
|
24
26
|
end
|
25
27
|
end
|
data/lib/packcr/code_block.rb
CHANGED
data/lib/packcr/context.rb
CHANGED
@@ -34,15 +34,15 @@ class Packcr
|
|
34
34
|
@lang = lang.to_sym
|
35
35
|
case @lang
|
36
36
|
when :c
|
37
|
-
@hname = path
|
37
|
+
@hname = "#{path}.h"
|
38
38
|
@patterns = {
|
39
|
-
|
40
|
-
|
39
|
+
get_source_code: "#{path}.c",
|
40
|
+
get_header_code: @hname,
|
41
41
|
}
|
42
42
|
@hid = File.basename(@hname).upcase.gsub(/[^A-Z0-9]/, "_")
|
43
43
|
when :rb
|
44
44
|
@patterns = {
|
45
|
-
|
45
|
+
get_source_code: "#{path}.rb",
|
46
46
|
}
|
47
47
|
else
|
48
48
|
raise "unexpected lang: #{@lang}"
|
@@ -57,9 +57,9 @@ class Packcr
|
|
57
57
|
@codes = {}
|
58
58
|
@root = Node::RootNode.new
|
59
59
|
|
60
|
-
|
61
|
-
|
62
|
-
|
60
|
+
return unless block_given?
|
61
|
+
|
62
|
+
yield(self)
|
63
63
|
end
|
64
64
|
|
65
65
|
def code(name)
|
@@ -67,7 +67,7 @@ class Packcr
|
|
67
67
|
end
|
68
68
|
|
69
69
|
def inspect
|
70
|
-
"
|
70
|
+
format("#<%s:0x%016x>", self.class, object_id)
|
71
71
|
end
|
72
72
|
|
73
73
|
def error(line, col, message)
|
@@ -84,7 +84,7 @@ class Packcr
|
|
84
84
|
end
|
85
85
|
|
86
86
|
def prefix
|
87
|
-
@prefix || "
|
87
|
+
@prefix || "packcr"
|
88
88
|
end
|
89
89
|
|
90
90
|
def pass_value_code(var)
|
@@ -97,7 +97,7 @@ class Packcr
|
|
97
97
|
end
|
98
98
|
|
99
99
|
def class_name
|
100
|
-
prefix.gsub(/(?:_|^|(\W))([a-z])/) { "#{
|
100
|
+
prefix.gsub(/(?:_|^|(\W))([a-z])/) { "#{::Regexp.last_match(1)}#{::Regexp.last_match(2)}".upcase }
|
101
101
|
end
|
102
102
|
|
103
103
|
def auxil_def
|
@@ -141,24 +141,24 @@ class Packcr
|
|
141
141
|
def generate
|
142
142
|
results = []
|
143
143
|
|
144
|
-
@patterns.each do |
|
144
|
+
@patterns.each do |meth, ofile|
|
145
145
|
result = Tempfile.new
|
146
146
|
result.unlink
|
147
147
|
results << [ofile, result]
|
148
148
|
stream = Packcr::Stream.new(result, ofile, @lines ? 0 : nil)
|
149
|
-
stream.write Packcr.
|
149
|
+
stream.write Packcr.format_code(public_send(meth, @lang, stream)), rewrite_line_directive: true
|
150
150
|
|
151
|
-
if
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
return false
|
151
|
+
next if @errnum.zero?
|
152
|
+
|
153
|
+
results.each do |_, r|
|
154
|
+
r.close
|
156
155
|
end
|
156
|
+
return false
|
157
157
|
end
|
158
158
|
|
159
159
|
results.each do |(name, result)|
|
160
160
|
result.rewind
|
161
|
-
open(name, "wt") do |f|
|
161
|
+
File.open(name, "wt") do |f|
|
162
162
|
IO.copy_stream(result, f)
|
163
163
|
end
|
164
164
|
end
|
@@ -166,3 +166,5 @@ class Packcr
|
|
166
166
|
end
|
167
167
|
end
|
168
168
|
end
|
169
|
+
|
170
|
+
require "packcr/generated/context"
|