edn-abnf 0.0.1
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 +7 -0
- data/bin/edn-abnf +57 -0
- data/edn-abnf.gemspec +20 -0
- data/lib/edn-abnf.rb +41 -0
- data/lib/parser/edn-util.rb +19 -0
- data/lib/parser/edngrammar.rb +3736 -0
- metadata +105 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 8e126887990e8896adb3bd44950656b51afc8d8f1302621c017ecbbc914361eb
|
4
|
+
data.tar.gz: 9766b5bc4ec7a00e40cea828776d737b2723b6f3ae9448d1fb3dcc10a45f336a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 1b6886f7d40dec4c34f5cb39c9900c5123605b97b68fb620f0d4ff40eefc1bdb27f26b1132464afdcd2e94be46a1be7d8d9e708f25b34a4047899bfb875e4ce9
|
7
|
+
data.tar.gz: 051ca2fbe7cb43b569d0c376b4fc7a8b1d29f4a33fb0b6b8c73da78029e73042356203b6bdc3dbb4ce4fb98fd1c0e5bcfc19eb218c72fa9b190ec7dc86b0517c
|
data/bin/edn-abnf
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'pp'
|
3
|
+
require 'yaml'
|
4
|
+
require 'treetop'
|
5
|
+
require 'json'
|
6
|
+
|
7
|
+
require_relative '../lib/edn-abnf.rb'
|
8
|
+
|
9
|
+
def snaky(name)
|
10
|
+
name.gsub(/-/, "_")
|
11
|
+
end
|
12
|
+
|
13
|
+
Encoding.default_external = Encoding::UTF_8
|
14
|
+
require 'optparse'
|
15
|
+
require 'ostruct'
|
16
|
+
|
17
|
+
$options = OpenStruct.new
|
18
|
+
begin
|
19
|
+
op = OptionParser.new do |opts|
|
20
|
+
opts.banner = "Usage: edn-abnf.rb [options] [file.edn... | -]"
|
21
|
+
|
22
|
+
opts.on("-v", "--[no-]verbose", "Run verbosely") do |v|
|
23
|
+
$options.verbose = v
|
24
|
+
end
|
25
|
+
opts.on("-tFMT", "--to=FMT", [:basic, :neat, :json, :yaml, :edn, :diag], "Target format") do |v|
|
26
|
+
$options.target = v
|
27
|
+
end
|
28
|
+
end
|
29
|
+
op.parse!
|
30
|
+
rescue Exception => e
|
31
|
+
warn e
|
32
|
+
exit 1
|
33
|
+
end
|
34
|
+
|
35
|
+
if ARGV == []
|
36
|
+
puts op
|
37
|
+
exit 1
|
38
|
+
end
|
39
|
+
|
40
|
+
edn_file = ARGF.read
|
41
|
+
|
42
|
+
edn = EDN.from_edn(edn_file)
|
43
|
+
result = edn.tree # XXX .tree?
|
44
|
+
|
45
|
+
case $options.target
|
46
|
+
when :basic, nil
|
47
|
+
pp result
|
48
|
+
when :neat, :json
|
49
|
+
require 'neatjson'
|
50
|
+
puts JSON.neat_generate(result, after_comma: 1, after_colon: 1)
|
51
|
+
when :yaml
|
52
|
+
puts result.to_yaml
|
53
|
+
when :edn, :diag
|
54
|
+
puts result.cbor_diagnostic
|
55
|
+
else
|
56
|
+
warn ["Unknown target format: ", $options.target].inspect
|
57
|
+
end
|
data/edn-abnf.gemspec
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = "edn-abnf"
|
3
|
+
s.version = "0.0.1"
|
4
|
+
s.summary = "CDDL (Concise Data Definition Language) converters and miscellaneous tools"
|
5
|
+
s.description = %q{edn-abnf implements converters and miscellaneous tools for CBOR EDN's ABNF}
|
6
|
+
s.author = "Carsten Bormann"
|
7
|
+
s.email = "cabo@tzi.org"
|
8
|
+
s.license = "MIT"
|
9
|
+
s.homepage = "http://github.com/cabo/edn-abnf"
|
10
|
+
s.files = Dir['lib/**/*.rb'] + %w(edn-abnf.gemspec) + Dir['data/*.cddl'] + Dir['bin/**/*.rb']
|
11
|
+
s.executables = Dir['bin/*'].map {|x| File.basename(x)}
|
12
|
+
s.required_ruby_version = '>= 1.9.2'
|
13
|
+
|
14
|
+
s.require_paths = ["lib"]
|
15
|
+
|
16
|
+
s.add_development_dependency 'bundler', '~>1'
|
17
|
+
s.add_dependency 'treetop', '~>1'
|
18
|
+
s.add_dependency 'json', '~>2'
|
19
|
+
s.add_dependency 'neatjson', '~>0.10'
|
20
|
+
end
|
data/lib/edn-abnf.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
require_relative "parser/edn-util.rb"
|
2
|
+
|
3
|
+
class EDN
|
4
|
+
@@parser = EDNGRAMMARParser.new
|
5
|
+
|
6
|
+
def self.reason(parser, s)
|
7
|
+
reason = [parser.failure_reason]
|
8
|
+
parser.failure_reason =~ /^(Expected .+) after/m
|
9
|
+
reason << "#{$1.gsub("\n", '<<<NEWLINE>>>')}:" if $1
|
10
|
+
if line = s.lines.to_a[parser.failure_line - 1]
|
11
|
+
reason << line
|
12
|
+
reason << "#{'~' * (parser.failure_column - 1)}^"
|
13
|
+
end
|
14
|
+
reason.join("\n")
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.from_edn(s)
|
18
|
+
ast = @@parser.parse s
|
19
|
+
if !ast
|
20
|
+
fail self.reason(@@parser, s)
|
21
|
+
end
|
22
|
+
ret = EDN.new(ast)
|
23
|
+
ret
|
24
|
+
end
|
25
|
+
|
26
|
+
attr_accessor :ast, :tree
|
27
|
+
def initialize(ast_)
|
28
|
+
@ast = ast_
|
29
|
+
@tree = ast.ast
|
30
|
+
end
|
31
|
+
|
32
|
+
def warn_error(s)
|
33
|
+
warn s
|
34
|
+
@error = true
|
35
|
+
end
|
36
|
+
def deep_clone
|
37
|
+
Marshal.load(Marshal.dump(self))
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'cbor-diagnostic'
|
2
|
+
module CBOR_DIAG
|
3
|
+
end
|
4
|
+
require 'cbor-diagnostic-app/dt'
|
5
|
+
|
6
|
+
require 'treetop'
|
7
|
+
require_relative './edngrammar'
|
8
|
+
|
9
|
+
class Treetop::Runtime::SyntaxNode
|
10
|
+
def ast
|
11
|
+
fail "undefined_ast #{inspect}"
|
12
|
+
end
|
13
|
+
def ast1 # devhack
|
14
|
+
"#{inspect[10..20]}--#{text_value[0..15]}"
|
15
|
+
end
|
16
|
+
def hex_value
|
17
|
+
text_value.to_i(16)
|
18
|
+
end
|
19
|
+
end
|