packcr 0.0.6 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +21 -0
  3. data/README.md +73 -0
  4. data/lib/packcr/cli.rb +18 -16
  5. data/lib/packcr/code_block.rb +0 -1
  6. data/lib/packcr/context.rb +20 -18
  7. data/lib/packcr/generated/context.rb +483 -0
  8. data/lib/packcr/generated/node/action_node.rb +60 -0
  9. data/lib/packcr/generated/node/alternate_node.rb +98 -0
  10. data/lib/packcr/generated/node/capture_node.rb +39 -0
  11. data/lib/packcr/generated/node/charclass_node.rb +372 -0
  12. data/lib/packcr/generated/node/eof_node.rb +20 -0
  13. data/lib/packcr/generated/node/error_node.rb +67 -0
  14. data/lib/packcr/generated/node/expand_node.rb +30 -0
  15. data/lib/packcr/generated/node/predicate_node.rb +140 -0
  16. data/lib/packcr/generated/node/quantity_node.rb +166 -0
  17. data/lib/packcr/generated/node/reference_node.rb +70 -0
  18. data/lib/packcr/generated/node/rule_node.rb +63 -0
  19. data/lib/packcr/generated/node/sequence_node.rb +42 -0
  20. data/lib/packcr/generated/node/string_node.rb +60 -0
  21. data/lib/packcr/generator.rb +2 -1
  22. data/lib/packcr/node/action_node.rb +4 -2
  23. data/lib/packcr/node/alternate_node.rb +3 -1
  24. data/lib/packcr/node/capture_node.rb +3 -1
  25. data/lib/packcr/node/charclass_node.rb +24 -28
  26. data/lib/packcr/node/eof_node.rb +4 -2
  27. data/lib/packcr/node/error_node.rb +3 -1
  28. data/lib/packcr/node/expand_node.rb +8 -5
  29. data/lib/packcr/node/predicate_node.rb +4 -2
  30. data/lib/packcr/node/quantity_node.rb +12 -10
  31. data/lib/packcr/node/reference_node.rb +11 -5
  32. data/lib/packcr/node/root_node.rb +1 -0
  33. data/lib/packcr/node/rule_node.rb +7 -4
  34. data/lib/packcr/node/sequence_node.rb +3 -1
  35. data/lib/packcr/node/string_node.rb +9 -6
  36. data/lib/packcr/node.rb +3 -5
  37. data/lib/packcr/parser.rb +4389 -4064
  38. data/lib/packcr/stream.rb +17 -12
  39. data/lib/packcr/templates/context/header.c.erb +3 -3
  40. data/lib/packcr/templates/context/source.c.erb +481 -690
  41. data/lib/packcr/templates/context/source.rb.erb +123 -171
  42. data/lib/packcr/templates/node/action.c.erb +5 -5
  43. data/lib/packcr/templates/node/action.rb.erb +2 -2
  44. data/lib/packcr/templates/node/alternate.c.erb +9 -9
  45. data/lib/packcr/templates/node/alternate.rb.erb +4 -5
  46. data/lib/packcr/templates/node/capture.c.erb +7 -7
  47. data/lib/packcr/templates/node/capture.rb.erb +4 -4
  48. data/lib/packcr/templates/node/charclass.c.erb +12 -12
  49. data/lib/packcr/templates/node/charclass.rb.erb +6 -6
  50. data/lib/packcr/templates/node/charclass_any.c.erb +3 -3
  51. data/lib/packcr/templates/node/charclass_any.rb.erb +2 -2
  52. data/lib/packcr/templates/node/charclass_fail.c.erb +1 -1
  53. data/lib/packcr/templates/node/charclass_one.c.erb +10 -10
  54. data/lib/packcr/templates/node/charclass_one.rb.erb +6 -6
  55. data/lib/packcr/templates/node/charclass_utf8.c.erb +8 -8
  56. data/lib/packcr/templates/node/charclass_utf8.rb.erb +3 -3
  57. data/lib/packcr/templates/node/charclass_utf8_reverse.rb.erb +5 -5
  58. data/lib/packcr/templates/node/eof.c.erb +1 -1
  59. data/lib/packcr/templates/node/error.c.erb +11 -11
  60. data/lib/packcr/templates/node/error.rb.erb +2 -2
  61. data/lib/packcr/templates/node/expand.c.erb +5 -5
  62. data/lib/packcr/templates/node/expand.rb.erb +3 -3
  63. data/lib/packcr/templates/node/predicate.c.erb +10 -10
  64. data/lib/packcr/templates/node/predicate.rb.erb +6 -6
  65. data/lib/packcr/templates/node/predicate_neg.c.erb +8 -8
  66. data/lib/packcr/templates/node/predicate_neg.rb.erb +6 -6
  67. data/lib/packcr/templates/node/quantity_many.c.erb +47 -0
  68. data/lib/packcr/templates/node/{quantify_many.rb.erb → quantity_many.rb.erb} +9 -9
  69. data/lib/packcr/templates/node/quantity_one.c.erb +23 -0
  70. data/lib/packcr/templates/node/{quantify_one.rb.erb → quantity_one.rb.erb} +8 -8
  71. data/lib/packcr/templates/node/reference.c.erb +14 -2
  72. data/lib/packcr/templates/node/reference.rb.erb +16 -4
  73. data/lib/packcr/templates/node/reference_reverse.rb.erb +16 -4
  74. data/lib/packcr/templates/node/rule.c.erb +14 -7
  75. data/lib/packcr/templates/node/rule.rb.erb +26 -19
  76. data/lib/packcr/templates/node/string_many.c.erb +6 -6
  77. data/lib/packcr/templates/node/string_many.rb.erb +3 -3
  78. data/lib/packcr/templates/node/string_one.c.erb +5 -5
  79. data/lib/packcr/templates/node/string_one.rb.erb +3 -3
  80. data/lib/packcr/util.rb +21 -16
  81. data/lib/packcr/version.rb +1 -1
  82. data/lib/packcr.rb +8 -11
  83. metadata +40 -10
  84. data/lib/packcr/templates/node/quantify_many.c.erb +0 -45
  85. data/lib/packcr/templates/node/quantify_one.c.erb +0 -21
  86. data/lib/packcr/tokenizer.rb +0 -2948
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 53243fb5032a86ddf13dcd3c4b99075d4e8ebfae75a0f239ec4e4564ee56c8dc
4
- data.tar.gz: 17c31d7663eb1207a3426add4c226dde9bdbf4540a11b4570c4b26f5ddb5f0be
3
+ metadata.gz: cacf5e781ba49bcc7d755ac5ba6e348646a08e4a807efd4375ba720232262556
4
+ data.tar.gz: ce70800733fbc71527539174f373786489f3fdda416b5435bf8aa687de1cd321
5
5
  SHA512:
6
- metadata.gz: 5fd7efc77c5b5e49c540652d0072aa3b749b8d99c39bad10984ad02f12c4f0fef3df2783ff11a012f4eac5cf62e0d8c3640b381909ee9c08e00dc990e67a3acb
7
- data.tar.gz: cb94b6e3bc70fbad68a50471321f66d76425d6729775a1d542f44e45900fef286a592947fbabcf398cca67c142be58cc64b89a7249eba5baa5775ae19f7af4f3
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::Cli
5
- class << self
6
- def run(argv)
7
- new.run(argv)
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
- def run(argv)
12
- lang = nil
13
- debug = false
14
- ascii = false
15
- opt = OptionParser.new
16
- opt.on("-l", "--lang=VAL") {|v| lang = v.to_sym }
17
- opt.on("-d", "--debug") {|v| debug = true }
18
- opt.on("-a", "--ascii") {|v| ascii = true }
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
- opt.parse!(argv)
21
- argv.each do |ifile|
22
- Packcr.new(ifile, lang: lang, debug: debug, ascii: ascii).run
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
@@ -1,4 +1,3 @@
1
-
2
1
  class Packcr
3
2
  class CodeBlock
4
3
  attr_reader :text, :line
@@ -34,15 +34,15 @@ class Packcr
34
34
  @lang = lang.to_sym
35
35
  case @lang
36
36
  when :c
37
- @hname = path + ".h"
37
+ @hname = "#{path}.h"
38
38
  @patterns = {
39
- source: path + ".c",
40
- header: @hname
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
- source: path + ".rb"
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
- if block_given?
61
- yield(self)
62
- end
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
- "#<#{self.class}:0x%016x>" % object_id
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 || "pcc"
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])/) { "#{$1}#{$2}".upcase }
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 |template, ofile|
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.template("context/#{template}.#{@lang}.erb", binding), rewrite_line_directive: true
149
+ stream.write Packcr.format_code(public_send(meth, @lang, stream)), rewrite_line_directive: true
150
150
 
151
- if !@errnum.zero?
152
- results.each do |_, result|
153
- result.close
154
- end
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"