kdl 0.1.2 → 1.0.0.rc1
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/.github/workflows/ruby.yml +4 -3
- data/.gitmodules +3 -0
- data/Rakefile +11 -6
- data/bin/console +2 -0
- data/bin/racc +29 -0
- data/bin/rake +29 -0
- data/bin/setup +1 -0
- data/kdl.gemspec +3 -4
- data/lib/kdl/document.rb +1 -2
- data/lib/kdl/kdl.tab.rb +218 -160
- data/lib/kdl/kdl.yy +20 -11
- data/lib/kdl/node.rb +16 -8
- data/lib/kdl/string_dumper.rb +45 -0
- data/lib/kdl/tokenizer.rb +47 -12
- data/lib/kdl/value.rb +31 -10
- data/lib/kdl/version.rb +1 -1
- data/lib/kdl.rb +1 -0
- metadata +12 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1da5c7ecdbb21b75f621fbb6876fd46270c525311d9b34443ebbda8e715f6b0d
|
4
|
+
data.tar.gz: c8317287f0573c91b256d28ff902e3a38bd3275b009016ce0d41c631e7321303
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 549b4b676a95b83146647aca4dbbccf44463fbaa5cc0192dc7e0e1e8977e194bdc505c29edde3c71f5f225a22eb23ea2ba484d4a26c24cdbae152015dde99b77
|
7
|
+
data.tar.gz: 13520a974cb5e28658bebd7b09fa79bb13e40cf2c12f50e0a51408fef74ab756e314f7e6758a357b0ef82afdda3cfa7604197184dad45607296ffb7469507df3
|
data/.github/workflows/ruby.yml
CHANGED
@@ -17,18 +17,19 @@ jobs:
|
|
17
17
|
test:
|
18
18
|
strategy:
|
19
19
|
matrix:
|
20
|
-
ruby: [2.3, 2.4, 2.5, 2.6, 2.7, 3.0
|
20
|
+
ruby: [2.3, 2.4, 2.5, 2.6, 2.7, 3.0, head]
|
21
21
|
|
22
22
|
runs-on: ubuntu-latest
|
23
23
|
|
24
24
|
steps:
|
25
25
|
- uses: actions/checkout@v2
|
26
|
+
with:
|
27
|
+
submodules: true
|
26
28
|
- name: Set up Ruby
|
27
29
|
uses: ruby/setup-ruby@v1
|
28
30
|
with:
|
29
31
|
ruby-version: ${{ matrix.ruby }}
|
30
|
-
|
31
|
-
run: gem install bundler && bundle install
|
32
|
+
bundler-cache: true # install and cache dependencies
|
32
33
|
- name: Build parser
|
33
34
|
run: bundle exec racc lib/kdl/kdl.yy
|
34
35
|
- name: Run tests
|
data/.gitmodules
ADDED
data/Rakefile
CHANGED
@@ -1,10 +1,15 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
require 'rake/testtask'
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
file 'lib/kdl/kdl.tab.rb' => ['lib/kdl/kdl.yy'] do
|
5
|
+
raise "racc command failed" unless system 'bin/racc lib/kdl/kdl.yy'
|
6
|
+
end
|
7
|
+
task :racc => 'lib/kdl/kdl.tab.rb'
|
8
|
+
|
9
|
+
Rake::TestTask.new(:test => :racc) do |t|
|
10
|
+
t.libs << 'test'
|
11
|
+
t.libs << 'lib'
|
12
|
+
t.test_files = FileList['test/**/*_test.rb']
|
8
13
|
t.options = '--pride'
|
9
14
|
end
|
10
15
|
|
data/bin/console
CHANGED
data/bin/racc
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
#
|
5
|
+
# This file was generated by Bundler.
|
6
|
+
#
|
7
|
+
# The application 'racc' is installed as part of a gem, and
|
8
|
+
# this file is here to facilitate running it.
|
9
|
+
#
|
10
|
+
|
11
|
+
require "pathname"
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
13
|
+
Pathname.new(__FILE__).realpath)
|
14
|
+
|
15
|
+
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
|
+
|
17
|
+
if File.file?(bundle_binstub)
|
18
|
+
if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
|
19
|
+
load(bundle_binstub)
|
20
|
+
else
|
21
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
22
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
require "rubygems"
|
27
|
+
require "bundler/setup"
|
28
|
+
|
29
|
+
load Gem.bin_path("racc", "racc")
|
data/bin/rake
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
#
|
5
|
+
# This file was generated by Bundler.
|
6
|
+
#
|
7
|
+
# The application 'rake' is installed as part of a gem, and
|
8
|
+
# this file is here to facilitate running it.
|
9
|
+
#
|
10
|
+
|
11
|
+
require "pathname"
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
13
|
+
Pathname.new(__FILE__).realpath)
|
14
|
+
|
15
|
+
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
|
+
|
17
|
+
if File.file?(bundle_binstub)
|
18
|
+
if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
|
19
|
+
load(bundle_binstub)
|
20
|
+
else
|
21
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
22
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
require "rubygems"
|
27
|
+
require "bundler/setup"
|
28
|
+
|
29
|
+
load Gem.bin_path("rake", "rake")
|
data/bin/setup
CHANGED
data/kdl.gemspec
CHANGED
@@ -3,7 +3,7 @@ require_relative 'lib/kdl/version'
|
|
3
3
|
Gem::Specification.new do |spec|
|
4
4
|
spec.name = "kdl"
|
5
5
|
spec.version = KDL::VERSION
|
6
|
-
spec.authors = ["
|
6
|
+
spec.authors = ["Danielle Smith"]
|
7
7
|
spec.email = ["danini@hey.com"]
|
8
8
|
|
9
9
|
spec.summary = %q{KDL Document Language}
|
@@ -13,8 +13,8 @@ Gem::Specification.new do |spec|
|
|
13
13
|
spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
|
14
14
|
|
15
15
|
spec.metadata["homepage_uri"] = spec.homepage
|
16
|
-
spec.metadata["source_code_uri"] = "https://github.com/
|
17
|
-
spec.metadata["changelog_uri"] = "https://github.com/
|
16
|
+
spec.metadata["source_code_uri"] = "https://github.com/danini-the-panini/kdl-rb"
|
17
|
+
spec.metadata["changelog_uri"] = "https://github.com/danini-the-panini/kdl-rb/releases"
|
18
18
|
|
19
19
|
# Specify which files should be added to the gem when it is released.
|
20
20
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
@@ -22,7 +22,6 @@ Gem::Specification.new do |spec|
|
|
22
22
|
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
23
23
|
end + ['lib/kdl/kdl.tab.rb']
|
24
24
|
spec.bindir = "exe"
|
25
|
-
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
26
25
|
spec.require_paths = ["lib"]
|
27
26
|
|
28
27
|
spec.add_development_dependency 'racc', '~> 1.5'
|
data/lib/kdl/document.rb
CHANGED
data/lib/kdl/kdl.tab.rb
CHANGED
@@ -8,7 +8,7 @@ require 'racc/parser.rb'
|
|
8
8
|
module KDL
|
9
9
|
class Parser < Racc::Parser
|
10
10
|
|
11
|
-
module_eval(<<'...end kdl.yy/module_eval...', 'kdl.yy',
|
11
|
+
module_eval(<<'...end kdl.yy/module_eval...', 'kdl.yy', 68)
|
12
12
|
def parse(str)
|
13
13
|
@tokenizer = ::KDL::Tokenizer.new(str)
|
14
14
|
do_parse
|
@@ -23,119 +23,139 @@ module_eval(<<'...end kdl.yy/module_eval...', 'kdl.yy', 59)
|
|
23
23
|
##### State transition tables begin ###
|
24
24
|
|
25
25
|
racc_action_table = [
|
26
|
-
-2, 10,
|
27
|
-
6, 7,
|
28
|
-
|
29
|
-
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
26
|
+
-2, 10, 18, 19, 20, 18, 19, 20, 6, 7,
|
27
|
+
6, 7, 44, 24, 17, 37, 8, 17, 8, 16,
|
28
|
+
57, 30, 16, 18, 46, 47, 51, 52, 55, 56,
|
29
|
+
54, 44, 37, -42, 61, 17, 18, 19, 20, 37,
|
30
|
+
42, -28, -29, 18, 19, 20, 63, 73, 17, 18,
|
31
|
+
19, 20, nil, 16, 74, 17, 18, 19, 20, nil,
|
32
|
+
16, 17, 18, 46, 47, 51, 52, 55, 56, 54,
|
33
|
+
nil, nil, 57, nil, 17, 65, 66, 51, 52, 55,
|
34
|
+
56, 54, 28, 7, nil, nil, 17, 6, 7, 33,
|
35
|
+
8, 30, 6, 7, 33, 8, 6, 7, nil, 33,
|
36
|
+
8, 6, 7, nil, 8, 6, 7, 6, 7, 8,
|
37
|
+
6, 7, nil, 8, nil, 8, nil, nil, 8, 65,
|
38
|
+
66, 51, 52, 55, 56, 54, 18, 19, 20 ]
|
35
39
|
|
36
40
|
racc_action_check = [
|
37
|
-
3, 1, 2, 2, 5, 5,
|
38
|
-
3, 3,
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
41
|
+
3, 1, 2, 2, 2, 5, 5, 5, 0, 0,
|
42
|
+
3, 3, 44, 10, 2, 16, 0, 5, 3, 2,
|
43
|
+
29, 44, 5, 28, 28, 28, 28, 28, 28, 28,
|
44
|
+
28, 28, 30, 28, 38, 28, 67, 67, 67, 42,
|
45
|
+
28, 46, 47, 68, 68, 68, 48, 67, 67, 36,
|
46
|
+
36, 36, nil, 67, 68, 68, 15, 15, 15, nil,
|
47
|
+
68, 36, 62, 62, 62, 62, 62, 62, 62, 62,
|
48
|
+
nil, nil, 62, nil, 62, 63, 63, 63, 63, 63,
|
49
|
+
63, 63, 13, 13, nil, nil, 63, 26, 26, 13,
|
50
|
+
13, 13, 27, 27, 26, 26, 31, 31, nil, 27,
|
51
|
+
27, 33, 33, nil, 31, 57, 57, 59, 59, 33,
|
52
|
+
69, 69, nil, 57, nil, 59, nil, nil, 69, 50,
|
53
|
+
50, 50, 50, 50, 50, 50, 17, 17, 17 ]
|
46
54
|
|
47
55
|
racc_action_pointer = [
|
48
|
-
|
49
|
-
|
50
|
-
nil, nil, nil,
|
51
|
-
|
52
|
-
nil,
|
53
|
-
|
54
|
-
nil, nil, nil
|
56
|
+
-2, 1, 0, 0, nil, 3, nil, nil, nil, nil,
|
57
|
+
13, nil, nil, 72, nil, 54, 5, 124, nil, nil,
|
58
|
+
nil, nil, nil, nil, nil, nil, 77, 82, 21, 8,
|
59
|
+
22, 86, nil, 91, nil, nil, 47, nil, 19, nil,
|
60
|
+
nil, nil, 29, nil, 2, nil, 25, 26, 30, nil,
|
61
|
+
116, nil, nil, nil, nil, nil, nil, 95, nil, 97,
|
62
|
+
nil, nil, 60, 72, nil, nil, nil, 34, 41, 100,
|
63
|
+
nil, nil, nil, nil, nil ]
|
55
64
|
|
56
65
|
racc_action_default = [
|
57
|
-
-
|
58
|
-
-
|
59
|
-
|
60
|
-
-
|
61
|
-
-
|
62
|
-
-
|
63
|
-
-26, -
|
66
|
+
-50, -51, -1, -49, -3, -51, -43, -44, -45, -46,
|
67
|
+
-51, -6, -7, -50, -11, -51, -50, -51, -27, -28,
|
68
|
+
-29, -47, -4, -5, 75, -8, -51, -51, -43, -51,
|
69
|
+
-50, -22, -23, -24, -41, -12, -51, -42, -51, -9,
|
70
|
+
-10, -13, -50, -15, -51, -21, -33, -34, -51, -31,
|
71
|
+
-51, -35, -36, -37, -38, -39, -40, -50, -20, -25,
|
72
|
+
-17, -26, -51, -51, -32, -33, -34, -51, -51, -49,
|
73
|
+
-14, -16, -30, -19, -18 ]
|
64
74
|
|
65
75
|
racc_goto_table = [
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
nil, nil,
|
70
|
-
|
71
|
-
nil,
|
76
|
+
21, 22, 23, 2, 3, 4, 50, 35, 5, 38,
|
77
|
+
41, 25, 43, 36, 1, 26, 27, 64, nil, nil,
|
78
|
+
48, nil, nil, nil, 39, 40, nil, nil, 21, nil,
|
79
|
+
nil, nil, 60, nil, nil, nil, nil, 59, nil, 62,
|
80
|
+
50, 50, nil, nil, 70, 72, 71, nil, nil, nil,
|
81
|
+
nil, nil, nil, nil, 48, nil, 21, nil, nil, nil,
|
82
|
+
68, 69, 4, 22, 23, 67, 21 ]
|
72
83
|
|
73
84
|
racc_goto_check = [
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
nil, nil,
|
78
|
-
|
79
|
-
nil,
|
85
|
+
20, 6, 7, 2, 3, 4, 13, 12, 5, 12,
|
86
|
+
14, 9, 16, 15, 1, 10, 11, 18, nil, nil,
|
87
|
+
12, nil, nil, nil, 9, 9, nil, nil, 20, nil,
|
88
|
+
nil, nil, 6, nil, nil, nil, nil, 3, nil, 15,
|
89
|
+
13, 13, nil, nil, 14, 14, 16, nil, nil, nil,
|
90
|
+
nil, nil, nil, nil, 12, nil, 20, nil, nil, nil,
|
91
|
+
2, 3, 4, 6, 7, 5, 20 ]
|
80
92
|
|
81
93
|
racc_goto_pointer = [
|
82
|
-
nil,
|
83
|
-
|
94
|
+
nil, 14, 3, 4, 5, 8, -4, -3, nil, -2,
|
95
|
+
2, 3, -8, -22, -18, -3, -16, nil, -33, nil,
|
96
|
+
-3 ]
|
84
97
|
|
85
98
|
racc_goto_default = [
|
86
|
-
nil, nil, nil,
|
87
|
-
|
99
|
+
nil, nil, nil, 31, 34, nil, 11, 12, 13, nil,
|
100
|
+
58, 45, 14, 15, nil, 29, nil, 32, 49, 53,
|
101
|
+
9 ]
|
88
102
|
|
89
103
|
racc_reduce_table = [
|
90
104
|
0, 0, :racc_error,
|
91
|
-
1,
|
92
|
-
1,
|
93
|
-
1,
|
94
|
-
2,
|
95
|
-
2,
|
96
|
-
2,
|
97
|
-
2,
|
98
|
-
2,
|
99
|
-
3,
|
100
|
-
3,
|
101
|
-
1,
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
1,
|
113
|
-
|
114
|
-
1,
|
115
|
-
|
105
|
+
1, 21, :_reduce_1,
|
106
|
+
1, 21, :_reduce_2,
|
107
|
+
1, 22, :_reduce_3,
|
108
|
+
2, 22, :_reduce_4,
|
109
|
+
2, 22, :_reduce_5,
|
110
|
+
2, 22, :_reduce_6,
|
111
|
+
2, 22, :_reduce_7,
|
112
|
+
2, 26, :_reduce_8,
|
113
|
+
3, 26, :_reduce_9,
|
114
|
+
3, 26, :_reduce_10,
|
115
|
+
1, 28, :_reduce_11,
|
116
|
+
2, 28, :_reduce_12,
|
117
|
+
3, 28, :_reduce_13,
|
118
|
+
5, 28, :_reduce_14,
|
119
|
+
3, 28, :_reduce_15,
|
120
|
+
5, 28, :_reduce_16,
|
121
|
+
3, 27, :_reduce_none,
|
122
|
+
4, 30, :_reduce_18,
|
123
|
+
4, 30, :_reduce_19,
|
124
|
+
2, 31, :_reduce_none,
|
125
|
+
2, 31, :_reduce_none,
|
126
|
+
1, 29, :_reduce_none,
|
127
|
+
1, 29, :_reduce_none,
|
128
|
+
1, 37, :_reduce_none,
|
129
|
+
2, 37, :_reduce_none,
|
116
130
|
3, 33, :_reduce_26,
|
117
|
-
1,
|
118
|
-
1,
|
119
|
-
1,
|
120
|
-
|
121
|
-
1,
|
122
|
-
|
123
|
-
1,
|
124
|
-
1,
|
125
|
-
1,
|
126
|
-
1,
|
127
|
-
1,
|
128
|
-
1,
|
129
|
-
1,
|
130
|
-
1,
|
131
|
-
|
132
|
-
1,
|
131
|
+
1, 32, :_reduce_27,
|
132
|
+
1, 32, :_reduce_28,
|
133
|
+
1, 32, :_reduce_29,
|
134
|
+
3, 36, :_reduce_30,
|
135
|
+
1, 34, :_reduce_none,
|
136
|
+
2, 34, :_reduce_32,
|
137
|
+
1, 38, :_reduce_33,
|
138
|
+
1, 38, :_reduce_34,
|
139
|
+
1, 38, :_reduce_35,
|
140
|
+
1, 38, :_reduce_36,
|
141
|
+
1, 38, :_reduce_37,
|
142
|
+
1, 38, :_reduce_38,
|
143
|
+
1, 39, :_reduce_39,
|
144
|
+
1, 39, :_reduce_40,
|
145
|
+
1, 35, :_reduce_none,
|
146
|
+
1, 35, :_reduce_none,
|
147
|
+
1, 40, :_reduce_none,
|
148
|
+
1, 40, :_reduce_none,
|
149
|
+
1, 40, :_reduce_none,
|
133
150
|
1, 23, :_reduce_none,
|
134
|
-
|
151
|
+
2, 23, :_reduce_none,
|
152
|
+
1, 25, :_reduce_none,
|
153
|
+
1, 25, :_reduce_none,
|
154
|
+
0, 24, :_reduce_50 ]
|
135
155
|
|
136
|
-
racc_reduce_n =
|
156
|
+
racc_reduce_n = 51
|
137
157
|
|
138
|
-
racc_shift_n =
|
158
|
+
racc_shift_n = 75
|
139
159
|
|
140
160
|
racc_token_table = {
|
141
161
|
false => 0,
|
@@ -150,14 +170,16 @@ racc_token_table = {
|
|
150
170
|
:NULL => 9,
|
151
171
|
:WS => 10,
|
152
172
|
:NEWLINE => 11,
|
153
|
-
:
|
154
|
-
:
|
155
|
-
:
|
156
|
-
:
|
157
|
-
:
|
158
|
-
:
|
173
|
+
:LBRACE => 12,
|
174
|
+
:RBRACE => 13,
|
175
|
+
:LPAREN => 14,
|
176
|
+
:RPAREN => 15,
|
177
|
+
:EQUALS => 16,
|
178
|
+
:SEMICOLON => 17,
|
179
|
+
:EOF => 18,
|
180
|
+
:SLASHDASH => 19 }
|
159
181
|
|
160
|
-
racc_nt_base =
|
182
|
+
racc_nt_base = 20
|
161
183
|
|
162
184
|
racc_use_result_var = false
|
163
185
|
|
@@ -190,6 +212,8 @@ Racc_token_to_s_table = [
|
|
190
212
|
"NULL",
|
191
213
|
"WS",
|
192
214
|
"NEWLINE",
|
215
|
+
"LBRACE",
|
216
|
+
"RBRACE",
|
193
217
|
"LPAREN",
|
194
218
|
"RPAREN",
|
195
219
|
"EQUALS",
|
@@ -209,10 +233,12 @@ Racc_token_to_s_table = [
|
|
209
233
|
"node_children",
|
210
234
|
"empty_children",
|
211
235
|
"identifier",
|
236
|
+
"type",
|
212
237
|
"value",
|
213
238
|
"ws_star",
|
214
239
|
"property",
|
215
240
|
"semicolon_term",
|
241
|
+
"untyped_value",
|
216
242
|
"boolean",
|
217
243
|
"linespace" ]
|
218
244
|
|
@@ -222,107 +248,115 @@ Racc_debug_parser = false
|
|
222
248
|
|
223
249
|
# reduce 0 omitted
|
224
250
|
|
225
|
-
module_eval(<<'.,.,', 'kdl.yy',
|
251
|
+
module_eval(<<'.,.,', 'kdl.yy', 13)
|
226
252
|
def _reduce_1(val, _values)
|
227
253
|
KDL::Document.new(val[0])
|
228
254
|
end
|
229
255
|
.,.,
|
230
256
|
|
231
|
-
module_eval(<<'.,.,', 'kdl.yy',
|
257
|
+
module_eval(<<'.,.,', 'kdl.yy', 14)
|
232
258
|
def _reduce_2(val, _values)
|
233
259
|
KDL::Document.new([])
|
234
260
|
end
|
235
261
|
.,.,
|
236
262
|
|
237
|
-
module_eval(<<'.,.,', 'kdl.yy',
|
263
|
+
module_eval(<<'.,.,', 'kdl.yy', 16)
|
238
264
|
def _reduce_3(val, _values)
|
239
265
|
[]
|
240
266
|
end
|
241
267
|
.,.,
|
242
268
|
|
243
|
-
module_eval(<<'.,.,', 'kdl.yy',
|
269
|
+
module_eval(<<'.,.,', 'kdl.yy', 17)
|
244
270
|
def _reduce_4(val, _values)
|
245
271
|
[val[1]]
|
246
272
|
end
|
247
273
|
.,.,
|
248
274
|
|
249
|
-
module_eval(<<'.,.,', 'kdl.yy',
|
275
|
+
module_eval(<<'.,.,', 'kdl.yy', 18)
|
250
276
|
def _reduce_5(val, _values)
|
251
277
|
[]
|
252
278
|
end
|
253
279
|
.,.,
|
254
280
|
|
255
|
-
module_eval(<<'.,.,', 'kdl.yy',
|
281
|
+
module_eval(<<'.,.,', 'kdl.yy', 19)
|
256
282
|
def _reduce_6(val, _values)
|
257
283
|
[*val[0], val[1]]
|
258
284
|
end
|
259
285
|
.,.,
|
260
286
|
|
261
|
-
module_eval(<<'.,.,', 'kdl.yy',
|
287
|
+
module_eval(<<'.,.,', 'kdl.yy', 20)
|
262
288
|
def _reduce_7(val, _values)
|
263
289
|
val[0]
|
264
290
|
end
|
265
291
|
.,.,
|
266
292
|
|
267
|
-
module_eval(<<'.,.,', 'kdl.yy',
|
293
|
+
module_eval(<<'.,.,', 'kdl.yy', 21)
|
268
294
|
def _reduce_8(val, _values)
|
269
|
-
val[0]
|
295
|
+
val[0].tap { |x| x.children = nil }
|
270
296
|
end
|
271
297
|
.,.,
|
272
298
|
|
273
|
-
module_eval(<<'.,.,', 'kdl.yy',
|
299
|
+
module_eval(<<'.,.,', 'kdl.yy', 22)
|
274
300
|
def _reduce_9(val, _values)
|
275
301
|
val[0].tap { |x| x.children = val[1] }
|
276
302
|
end
|
277
303
|
.,.,
|
278
304
|
|
279
|
-
module_eval(<<'.,.,', 'kdl.yy',
|
305
|
+
module_eval(<<'.,.,', 'kdl.yy', 23)
|
280
306
|
def _reduce_10(val, _values)
|
281
|
-
val[0]
|
307
|
+
val[0].tap { |x| x.children = nil }
|
282
308
|
end
|
283
309
|
.,.,
|
284
310
|
|
285
|
-
module_eval(<<'.,.,', 'kdl.yy',
|
311
|
+
module_eval(<<'.,.,', 'kdl.yy', 24)
|
286
312
|
def _reduce_11(val, _values)
|
287
313
|
KDL::Node.new(val[0])
|
288
314
|
end
|
289
315
|
.,.,
|
290
316
|
|
291
|
-
module_eval(<<'.,.,', 'kdl.yy',
|
317
|
+
module_eval(<<'.,.,', 'kdl.yy', 25)
|
292
318
|
def _reduce_12(val, _values)
|
293
|
-
val[
|
319
|
+
KDL::Node.new(val[1], type: val[0])
|
294
320
|
end
|
295
321
|
.,.,
|
296
322
|
|
297
|
-
module_eval(<<'.,.,', 'kdl.yy',
|
323
|
+
module_eval(<<'.,.,', 'kdl.yy', 26)
|
298
324
|
def _reduce_13(val, _values)
|
299
|
-
val[0]
|
325
|
+
val[0].tap { |x| x.arguments << val[2] }
|
300
326
|
end
|
301
327
|
.,.,
|
302
328
|
|
303
|
-
module_eval(<<'.,.,', 'kdl.yy',
|
329
|
+
module_eval(<<'.,.,', 'kdl.yy', 27)
|
304
330
|
def _reduce_14(val, _values)
|
305
|
-
val[0]
|
331
|
+
val[0]
|
306
332
|
end
|
307
333
|
.,.,
|
308
334
|
|
309
|
-
module_eval(<<'.,.,', 'kdl.yy',
|
335
|
+
module_eval(<<'.,.,', 'kdl.yy', 28)
|
310
336
|
def _reduce_15(val, _values)
|
337
|
+
val[0].tap { |x| x.properties[val[2][0]] = val[2][1] }
|
338
|
+
end
|
339
|
+
.,.,
|
340
|
+
|
341
|
+
module_eval(<<'.,.,', 'kdl.yy', 29)
|
342
|
+
def _reduce_16(val, _values)
|
311
343
|
val[0]
|
312
344
|
end
|
313
345
|
.,.,
|
314
346
|
|
315
|
-
# reduce
|
347
|
+
# reduce 17 omitted
|
316
348
|
|
317
|
-
module_eval(<<'.,.,', 'kdl.yy',
|
318
|
-
def
|
349
|
+
module_eval(<<'.,.,', 'kdl.yy', 31)
|
350
|
+
def _reduce_18(val, _values)
|
319
351
|
val[2]
|
320
352
|
end
|
321
353
|
.,.,
|
322
354
|
|
323
|
-
|
324
|
-
|
325
|
-
|
355
|
+
module_eval(<<'.,.,', 'kdl.yy', 32)
|
356
|
+
def _reduce_19(val, _values)
|
357
|
+
[]
|
358
|
+
end
|
359
|
+
.,.,
|
326
360
|
|
327
361
|
# reduce 20 omitted
|
328
362
|
|
@@ -332,92 +366,116 @@ module_eval(<<'.,.,', 'kdl.yy', 29)
|
|
332
366
|
|
333
367
|
# reduce 23 omitted
|
334
368
|
|
335
|
-
|
336
|
-
|
369
|
+
# reduce 24 omitted
|
370
|
+
|
371
|
+
# reduce 25 omitted
|
372
|
+
|
373
|
+
module_eval(<<'.,.,', 'kdl.yy', 38)
|
374
|
+
def _reduce_26(val, _values)
|
375
|
+
val[1]
|
376
|
+
end
|
377
|
+
.,.,
|
378
|
+
|
379
|
+
module_eval(<<'.,.,', 'kdl.yy', 40)
|
380
|
+
def _reduce_27(val, _values)
|
337
381
|
val[0].value
|
338
382
|
end
|
339
383
|
.,.,
|
340
384
|
|
341
|
-
module_eval(<<'.,.,', 'kdl.yy',
|
342
|
-
def
|
385
|
+
module_eval(<<'.,.,', 'kdl.yy', 41)
|
386
|
+
def _reduce_28(val, _values)
|
343
387
|
val[0].value
|
344
388
|
end
|
345
389
|
.,.,
|
346
390
|
|
347
|
-
module_eval(<<'.,.,', 'kdl.yy',
|
348
|
-
def
|
391
|
+
module_eval(<<'.,.,', 'kdl.yy', 42)
|
392
|
+
def _reduce_29(val, _values)
|
393
|
+
val[0].value
|
394
|
+
end
|
395
|
+
.,.,
|
396
|
+
|
397
|
+
module_eval(<<'.,.,', 'kdl.yy', 44)
|
398
|
+
def _reduce_30(val, _values)
|
349
399
|
[val[0], val[2]]
|
350
400
|
end
|
351
401
|
.,.,
|
352
402
|
|
353
|
-
|
354
|
-
|
403
|
+
# reduce 31 omitted
|
404
|
+
|
405
|
+
module_eval(<<'.,.,', 'kdl.yy', 47)
|
406
|
+
def _reduce_32(val, _values)
|
407
|
+
val[1].as_type(val[0])
|
408
|
+
end
|
409
|
+
.,.,
|
410
|
+
|
411
|
+
module_eval(<<'.,.,', 'kdl.yy', 49)
|
412
|
+
def _reduce_33(val, _values)
|
355
413
|
KDL::Value::String.new(val[0].value)
|
356
414
|
end
|
357
415
|
.,.,
|
358
416
|
|
359
|
-
module_eval(<<'.,.,', 'kdl.yy',
|
360
|
-
def
|
417
|
+
module_eval(<<'.,.,', 'kdl.yy', 50)
|
418
|
+
def _reduce_34(val, _values)
|
361
419
|
KDL::Value::String.new(val[0].value)
|
362
420
|
end
|
363
421
|
.,.,
|
364
422
|
|
365
|
-
module_eval(<<'.,.,', 'kdl.yy',
|
366
|
-
def
|
423
|
+
module_eval(<<'.,.,', 'kdl.yy', 51)
|
424
|
+
def _reduce_35(val, _values)
|
367
425
|
KDL::Value::Int.new(val[0].value)
|
368
426
|
end
|
369
427
|
.,.,
|
370
428
|
|
371
|
-
module_eval(<<'.,.,', 'kdl.yy',
|
372
|
-
def
|
373
|
-
KDL::Value::Float.new(val[0].value)
|
429
|
+
module_eval(<<'.,.,', 'kdl.yy', 52)
|
430
|
+
def _reduce_36(val, _values)
|
431
|
+
KDL::Value::Float.new(val[0].value, format: val[0].meta[:format])
|
374
432
|
end
|
375
433
|
.,.,
|
376
434
|
|
377
|
-
module_eval(<<'.,.,', 'kdl.yy',
|
378
|
-
def
|
435
|
+
module_eval(<<'.,.,', 'kdl.yy', 53)
|
436
|
+
def _reduce_37(val, _values)
|
379
437
|
KDL::Value::Boolean.new(val[0])
|
380
438
|
end
|
381
439
|
.,.,
|
382
440
|
|
383
|
-
module_eval(<<'.,.,', 'kdl.yy',
|
384
|
-
def
|
441
|
+
module_eval(<<'.,.,', 'kdl.yy', 54)
|
442
|
+
def _reduce_38(val, _values)
|
385
443
|
KDL::Value::Null
|
386
444
|
end
|
387
445
|
.,.,
|
388
446
|
|
389
|
-
module_eval(<<'.,.,', 'kdl.yy',
|
390
|
-
def
|
447
|
+
module_eval(<<'.,.,', 'kdl.yy', 56)
|
448
|
+
def _reduce_39(val, _values)
|
391
449
|
true
|
392
450
|
end
|
393
451
|
.,.,
|
394
452
|
|
395
|
-
module_eval(<<'.,.,', 'kdl.yy',
|
396
|
-
def
|
453
|
+
module_eval(<<'.,.,', 'kdl.yy', 57)
|
454
|
+
def _reduce_40(val, _values)
|
397
455
|
false
|
398
456
|
end
|
399
457
|
.,.,
|
400
458
|
|
401
|
-
# reduce
|
459
|
+
# reduce 41 omitted
|
402
460
|
|
403
|
-
# reduce
|
461
|
+
# reduce 42 omitted
|
404
462
|
|
405
|
-
# reduce
|
463
|
+
# reduce 43 omitted
|
406
464
|
|
407
|
-
# reduce
|
465
|
+
# reduce 44 omitted
|
408
466
|
|
409
|
-
# reduce
|
467
|
+
# reduce 45 omitted
|
410
468
|
|
411
|
-
# reduce
|
469
|
+
# reduce 46 omitted
|
412
470
|
|
413
|
-
# reduce
|
471
|
+
# reduce 47 omitted
|
414
472
|
|
415
|
-
# reduce
|
473
|
+
# reduce 48 omitted
|
416
474
|
|
417
|
-
# reduce
|
475
|
+
# reduce 49 omitted
|
418
476
|
|
419
|
-
module_eval(<<'.,.,', 'kdl.yy',
|
420
|
-
def
|
477
|
+
module_eval(<<'.,.,', 'kdl.yy', 64)
|
478
|
+
def _reduce_50(val, _values)
|
421
479
|
nil
|
422
480
|
end
|
423
481
|
.,.,
|
data/lib/kdl/kdl.yy
CHANGED
@@ -4,6 +4,7 @@ class KDL::Parser
|
|
4
4
|
STRING RAWSTRING
|
5
5
|
INTEGER FLOAT TRUE FALSE NULL
|
6
6
|
WS NEWLINE
|
7
|
+
LBRACE RBRACE
|
7
8
|
LPAREN RPAREN
|
8
9
|
EQUALS
|
9
10
|
SEMICOLON
|
@@ -18,32 +19,40 @@ rule
|
|
18
19
|
| linespace_star empty_node { [] }
|
19
20
|
| nodes node { [*val[0], val[1]] }
|
20
21
|
| nodes empty_node { val[0] }
|
21
|
-
node : node_decl node_term { val[0] }
|
22
|
+
node : node_decl node_term { val[0].tap { |x| x.children = nil } }
|
22
23
|
| node_decl node_children node_term { val[0].tap { |x| x.children = val[1] } }
|
23
|
-
| node_decl empty_children node_term
|
24
|
+
| node_decl empty_children node_term { val[0].tap { |x| x.children = nil } }
|
24
25
|
node_decl : identifier { KDL::Node.new(val[0]) }
|
26
|
+
| type identifier { KDL::Node.new(val[1], type: val[0]) }
|
25
27
|
| node_decl WS value { val[0].tap { |x| x.arguments << val[2] } }
|
26
28
|
| node_decl WS SLASHDASH ws_star value { val[0] }
|
27
29
|
| node_decl WS property { val[0].tap { |x| x.properties[val[2][0]] = val[2][1] } }
|
28
30
|
| node_decl WS SLASHDASH ws_star property { val[0] }
|
29
31
|
empty_node: SLASHDASH ws_star node
|
30
|
-
node_children: ws_star
|
32
|
+
node_children: ws_star LBRACE nodes RBRACE { val[2] }
|
33
|
+
| ws_star LBRACE linespace_star RBRACE { [] }
|
31
34
|
empty_children: SLASHDASH node_children
|
32
35
|
| WS empty_children
|
33
36
|
node_term: linespaces | semicolon_term
|
34
37
|
semicolon_term: SEMICOLON | SEMICOLON linespaces
|
35
38
|
|
36
|
-
|
37
|
-
|
39
|
+
type : LPAREN identifier RPAREN { val[1] }
|
40
|
+
|
41
|
+
identifier: IDENT { val[0].value }
|
42
|
+
| STRING { val[0].value }
|
43
|
+
| RAWSTRING { val[0].value }
|
38
44
|
|
39
45
|
property: identifier EQUALS value { [val[0], val[2]] }
|
40
46
|
|
41
|
-
value :
|
42
|
-
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
+
value : untyped_value
|
48
|
+
| type untyped_value { val[1].as_type(val[0]) }
|
49
|
+
|
50
|
+
untyped_value : STRING { KDL::Value::String.new(val[0].value) }
|
51
|
+
| RAWSTRING { KDL::Value::String.new(val[0].value) }
|
52
|
+
| INTEGER { KDL::Value::Int.new(val[0].value) }
|
53
|
+
| FLOAT { KDL::Value::Float.new(val[0].value, format: val[0].meta[:format]) }
|
54
|
+
| boolean { KDL::Value::Boolean.new(val[0]) }
|
55
|
+
| NULL { KDL::Value::Null }
|
47
56
|
|
48
57
|
boolean : TRUE { true }
|
49
58
|
| FALSE { false }
|
data/lib/kdl/node.rb
CHANGED
@@ -1,31 +1,33 @@
|
|
1
1
|
module KDL
|
2
2
|
class Node
|
3
|
-
attr_accessor :name, :arguments, :properties, :children
|
3
|
+
attr_accessor :name, :arguments, :properties, :children, :type
|
4
4
|
|
5
|
-
def initialize(name, arguments = [], properties = {}, children =
|
5
|
+
def initialize(name, arguments = [], properties = {}, children = nil, type: nil)
|
6
6
|
@name = name
|
7
7
|
@arguments = arguments
|
8
8
|
@properties = properties
|
9
9
|
@children = children
|
10
|
+
@type = type
|
10
11
|
end
|
11
12
|
|
12
13
|
def to_s(level = 0)
|
13
14
|
indent = ' ' * level
|
14
|
-
s = "#{indent}#{name}"
|
15
|
+
s = "#{indent}#{type ? "(#{id_to_s type})" : ''}#{id_to_s name}"
|
15
16
|
unless arguments.empty?
|
16
17
|
s += " #{arguments.map(&:to_s).join(' ')}"
|
17
18
|
end
|
18
19
|
unless properties.empty?
|
19
|
-
s += " #{properties.map { |k, v| "#{k}=#{v}" }.join(' ')}"
|
20
|
+
s += " #{properties.map { |k, v| "#{id_to_s k}=#{v}" }.join(' ')}"
|
20
21
|
end
|
21
|
-
unless children.
|
22
|
+
unless children.nil?
|
22
23
|
s += " {\n"
|
23
|
-
|
24
|
-
|
24
|
+
unless children.empty?
|
25
|
+
s += children.map { |c| "#{c.to_s(level + 1)}\n" }.join("\n")
|
26
|
+
end
|
27
|
+
s += "#{indent}}"
|
25
28
|
end
|
26
29
|
s
|
27
30
|
end
|
28
|
-
alias inspect to_s
|
29
31
|
|
30
32
|
def ==(other)
|
31
33
|
return false unless other.is_a?(Node)
|
@@ -35,5 +37,11 @@ module KDL
|
|
35
37
|
properties == other.properties &&
|
36
38
|
children == other.children
|
37
39
|
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def id_to_s(id)
|
44
|
+
StringDumper.stringify_identifier(id)
|
45
|
+
end
|
38
46
|
end
|
39
47
|
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module KDL
|
2
|
+
module StringDumper
|
3
|
+
class << self
|
4
|
+
def call(string)
|
5
|
+
%("#{string.each_char.map { |char| escape(char) }.join}")
|
6
|
+
end
|
7
|
+
|
8
|
+
def stringify_identifier(ident)
|
9
|
+
if bare_identifier?(ident)
|
10
|
+
ident
|
11
|
+
else
|
12
|
+
call(ident)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def print?(char)
|
19
|
+
' ' <= char && char <= '\x7e'
|
20
|
+
end
|
21
|
+
|
22
|
+
def escape(char)
|
23
|
+
case char
|
24
|
+
when "\n" then '\n'
|
25
|
+
when "\r" then '\r'
|
26
|
+
when "\t" then '\t'
|
27
|
+
when '\\' then '\\\\'
|
28
|
+
when '"' then '\"'
|
29
|
+
when "\b" then '\b'
|
30
|
+
when "\f" then '\f'
|
31
|
+
else char
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def unicode_escape(char)
|
36
|
+
"\\u{#{char.codepoints.first.to_s(16)}}"
|
37
|
+
end
|
38
|
+
|
39
|
+
def bare_identifier?(name)
|
40
|
+
escape_chars = '\\\/(){}<>;\[\]=,"'
|
41
|
+
name =~ /^([^0-9\-+\s#{escape_chars}][^\s#{escape_chars}]*|[\-+](?!true|false|null)[^0-9\s#{escape_chars}][^\s#{escape_chars}]*)$/
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/lib/kdl/tokenizer.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'bigdecimal'
|
2
|
+
|
1
3
|
module KDL
|
2
4
|
class Tokenizer
|
3
5
|
class Error < StandardError
|
@@ -7,13 +9,14 @@ module KDL
|
|
7
9
|
end
|
8
10
|
|
9
11
|
class Token
|
10
|
-
attr_reader :type, :value, :line, :column
|
12
|
+
attr_reader :type, :value, :line, :column, :meta
|
11
13
|
|
12
|
-
def initialize(type, value, line, column)
|
14
|
+
def initialize(type, value, line, column, meta = {})
|
13
15
|
@type = type
|
14
16
|
@value = value
|
15
17
|
@line = line
|
16
18
|
@column = column
|
19
|
+
@meta = meta
|
17
20
|
end
|
18
21
|
|
19
22
|
def ==(other)
|
@@ -31,8 +34,8 @@ module KDL
|
|
31
34
|
attr_reader :index
|
32
35
|
|
33
36
|
SYMBOLS = {
|
34
|
-
'{' => :
|
35
|
-
'}' => :
|
37
|
+
'{' => :LBRACE,
|
38
|
+
'}' => :RBRACE,
|
36
39
|
'=' => :EQUALS,
|
37
40
|
'=' => :EQUALS,
|
38
41
|
';' => :SEMICOLON
|
@@ -46,10 +49,13 @@ module KDL
|
|
46
49
|
|
47
50
|
NEWLINES = ["\u000A", "\u0085", "\u000C", "\u2028", "\u2029"]
|
48
51
|
|
49
|
-
NON_IDENTIFIER_CHARS = Regexp.escape "#{SYMBOLS.keys.join('')}
|
52
|
+
NON_IDENTIFIER_CHARS = Regexp.escape "#{SYMBOLS.keys.join('')}()/\\<>[]\","
|
50
53
|
IDENTIFIER_CHARS = /[^#{NON_IDENTIFIER_CHARS}\x0-\x20]/
|
51
54
|
INITIAL_IDENTIFIER_CHARS = /[^#{NON_IDENTIFIER_CHARS}0-9\x0-\x20]/
|
52
55
|
|
56
|
+
ALLOWED_IN_TYPE = [:ident, :string, :rawstring]
|
57
|
+
NOT_ALLOWED_AFTER_TYPE = [:single_line_comment, :multi_line_comment]
|
58
|
+
|
53
59
|
def initialize(str, start = 0)
|
54
60
|
@str = str
|
55
61
|
@context = nil
|
@@ -60,6 +66,7 @@ module KDL
|
|
60
66
|
@previous_context = nil
|
61
67
|
@line = 1
|
62
68
|
@column = 1
|
69
|
+
@type_context = false
|
63
70
|
end
|
64
71
|
|
65
72
|
def next_token
|
@@ -174,6 +181,12 @@ module KDL
|
|
174
181
|
self.context = :ident
|
175
182
|
@buffer = c
|
176
183
|
traverse(1)
|
184
|
+
when '('
|
185
|
+
@type_context = true
|
186
|
+
return token(:LPAREN, c).tap { traverse(1) }
|
187
|
+
when ')'
|
188
|
+
@type_context = false
|
189
|
+
return token(:RPAREN, c).tap { traverse(1) }
|
177
190
|
else
|
178
191
|
raise_error "Unexpected character #{c.inspect}"
|
179
192
|
end
|
@@ -304,8 +317,8 @@ module KDL
|
|
304
317
|
|
305
318
|
private
|
306
319
|
|
307
|
-
def token(type, value)
|
308
|
-
[type, Token.new(type, value, @line_at_start, @column_at_start)]
|
320
|
+
def token(type, value, **meta)
|
321
|
+
@last_token = [type, Token.new(type, value, @line_at_start, @column_at_start, meta)]
|
309
322
|
end
|
310
323
|
|
311
324
|
def traverse(n = 1)
|
@@ -323,6 +336,11 @@ module KDL
|
|
323
336
|
end
|
324
337
|
|
325
338
|
def context=(val)
|
339
|
+
if @type_context && !ALLOWED_IN_TYPE.include?(val)
|
340
|
+
raise_error "#{val} context not allowed in type declaration"
|
341
|
+
elsif @last_token && @last_token[0] == :RPAREN && NOT_ALLOWED_AFTER_TYPE.include?(val)
|
342
|
+
raise_error 'Comments are not allowed after a type declaration'
|
343
|
+
end
|
326
344
|
@previous_context = @context
|
327
345
|
@context = val
|
328
346
|
end
|
@@ -333,18 +351,35 @@ module KDL
|
|
333
351
|
end
|
334
352
|
|
335
353
|
def parse_decimal(s)
|
336
|
-
return
|
337
|
-
|
354
|
+
return parse_float(s) if s =~ /[.E]/i
|
355
|
+
|
356
|
+
token(:INTEGER, Integer(munch_underscores(s), 10), format: '%d')
|
357
|
+
end
|
358
|
+
|
359
|
+
def parse_float(s)
|
360
|
+
match, whole, fraction, exponent = *s.match(/^([-+]?[\d_]+)(?:\.(\d+))?(?:[eE]([-+]?[\d_]+))?$/)
|
361
|
+
raise_error "Invalid floating point value #{s}" if match.nil?
|
362
|
+
|
363
|
+
s = munch_underscores(s)
|
364
|
+
|
365
|
+
decimals = fraction.nil? ? 0 : fraction.size
|
366
|
+
value = Float(s)
|
367
|
+
scientific = value.abs >= 100 || (exponent && exponent.to_i.abs >= 2)
|
368
|
+
if value.infinite? || (value.zero? && exponent.to_i < 0)
|
369
|
+
token(:FLOAT, BigDecimal(s))
|
370
|
+
else
|
371
|
+
token(:FLOAT, value, format: scientific ? "%.#{decimals}E" : nil)
|
372
|
+
end
|
338
373
|
end
|
339
|
-
|
374
|
+
|
340
375
|
def parse_hexadecimal(s)
|
341
376
|
token(:INTEGER, Integer(munch_underscores(s), 16))
|
342
377
|
end
|
343
|
-
|
378
|
+
|
344
379
|
def parse_octal(s)
|
345
380
|
token(:INTEGER, Integer(munch_underscores(s), 8))
|
346
381
|
end
|
347
|
-
|
382
|
+
|
348
383
|
def parse_binary(s)
|
349
384
|
token(:INTEGER, Integer(munch_underscores(s), 2))
|
350
385
|
end
|
data/lib/kdl/value.rb
CHANGED
@@ -1,15 +1,28 @@
|
|
1
1
|
module KDL
|
2
2
|
class Value
|
3
|
-
attr_reader :value
|
3
|
+
attr_reader :value, :format, :type
|
4
4
|
|
5
|
-
def initialize(value)
|
5
|
+
def initialize(value, format: nil, type: nil)
|
6
6
|
@value = value
|
7
|
+
@format = format
|
8
|
+
@type = type
|
9
|
+
end
|
10
|
+
|
11
|
+
def as_type(type)
|
12
|
+
self.class.new(value, format: format, type: type)
|
7
13
|
end
|
8
14
|
|
9
15
|
def to_s
|
16
|
+
return stringify_value unless type
|
17
|
+
|
18
|
+
"(#{StringDumper.stringify_identifier type})#{stringify_value}"
|
19
|
+
end
|
20
|
+
|
21
|
+
def stringify_value
|
22
|
+
return format % value if format
|
23
|
+
|
10
24
|
value.to_s
|
11
25
|
end
|
12
|
-
alias inspect to_s
|
13
26
|
|
14
27
|
class Int < Value
|
15
28
|
def ==(other)
|
@@ -21,6 +34,16 @@ module KDL
|
|
21
34
|
def ==(other)
|
22
35
|
other.is_a?(Float) && value == other.value
|
23
36
|
end
|
37
|
+
|
38
|
+
def stringify_value
|
39
|
+
return super.upcase unless value.is_a?(BigDecimal)
|
40
|
+
|
41
|
+
sign, digits, _, exponent = value.split
|
42
|
+
s = sign.negative? ? '-' : ''
|
43
|
+
s += "#{digits[0]}.#{digits[1..-1]}"
|
44
|
+
s += "E#{exponent.negative? ? '' : '+'}#{exponent - 1}"
|
45
|
+
s
|
46
|
+
end
|
24
47
|
end
|
25
48
|
|
26
49
|
class Boolean < Value
|
@@ -30,10 +53,9 @@ module KDL
|
|
30
53
|
end
|
31
54
|
|
32
55
|
class String < Value
|
33
|
-
def
|
34
|
-
value
|
56
|
+
def stringify_value
|
57
|
+
StringDumper.call(value)
|
35
58
|
end
|
36
|
-
alias inspect to_s
|
37
59
|
|
38
60
|
def ==(other)
|
39
61
|
other.is_a?(String) && value == other.value
|
@@ -41,14 +63,13 @@ module KDL
|
|
41
63
|
end
|
42
64
|
|
43
65
|
class NullImpl < Value
|
44
|
-
def initialize
|
45
|
-
super(nil)
|
66
|
+
def initialize(_=nil, format: nil, type: nil)
|
67
|
+
super(nil, type: type)
|
46
68
|
end
|
47
69
|
|
48
|
-
def
|
70
|
+
def stringify_value
|
49
71
|
"null"
|
50
72
|
end
|
51
|
-
alias inspect to_s
|
52
73
|
|
53
74
|
def ==(other)
|
54
75
|
other.is_a?(NullImpl)
|
data/lib/kdl/version.rb
CHANGED
data/lib/kdl.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kdl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0.rc1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- Danielle Smith
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-09-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: racc
|
@@ -33,12 +33,15 @@ extra_rdoc_files: []
|
|
33
33
|
files:
|
34
34
|
- ".github/workflows/ruby.yml"
|
35
35
|
- ".gitignore"
|
36
|
+
- ".gitmodules"
|
36
37
|
- CODE_OF_CONDUCT.md
|
37
38
|
- Gemfile
|
38
39
|
- LICENSE.txt
|
39
40
|
- README.md
|
40
41
|
- Rakefile
|
41
42
|
- bin/console
|
43
|
+
- bin/racc
|
44
|
+
- bin/rake
|
42
45
|
- bin/setup
|
43
46
|
- kdl.gemspec
|
44
47
|
- lib/kdl.rb
|
@@ -46,6 +49,7 @@ files:
|
|
46
49
|
- lib/kdl/kdl.tab.rb
|
47
50
|
- lib/kdl/kdl.yy
|
48
51
|
- lib/kdl/node.rb
|
52
|
+
- lib/kdl/string_dumper.rb
|
49
53
|
- lib/kdl/tokenizer.rb
|
50
54
|
- lib/kdl/value.rb
|
51
55
|
- lib/kdl/version.rb
|
@@ -54,8 +58,8 @@ licenses:
|
|
54
58
|
- MIT
|
55
59
|
metadata:
|
56
60
|
homepage_uri: https://kdl.dev
|
57
|
-
source_code_uri: https://github.com/
|
58
|
-
changelog_uri: https://github.com/
|
61
|
+
source_code_uri: https://github.com/danini-the-panini/kdl-rb
|
62
|
+
changelog_uri: https://github.com/danini-the-panini/kdl-rb/releases
|
59
63
|
post_install_message:
|
60
64
|
rdoc_options: []
|
61
65
|
require_paths:
|
@@ -67,11 +71,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
67
71
|
version: 2.3.0
|
68
72
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
69
73
|
requirements:
|
70
|
-
- - "
|
74
|
+
- - ">"
|
71
75
|
- !ruby/object:Gem::Version
|
72
|
-
version:
|
76
|
+
version: 1.3.1
|
73
77
|
requirements: []
|
74
|
-
rubygems_version: 3.
|
78
|
+
rubygems_version: 3.2.22
|
75
79
|
signing_key:
|
76
80
|
specification_version: 4
|
77
81
|
summary: KDL Document Language
|