rison-rb 0.1.0

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.
@@ -0,0 +1,130 @@
1
+ class Rison::Parser
2
+ rule
3
+
4
+ target: value
5
+
6
+ object: LPAREN RPAREN { result = {} }
7
+ | LPAREN members RPAREN { result = val[1] }
8
+
9
+ members: pair
10
+ | pair COMMA members { result = val[0].merge(val[2]) }
11
+
12
+ pair: key COLON value { result = { val[0] => val[2] } }
13
+
14
+ array: EXCLAM LPAREN RPAREN { result = [] }
15
+ | EXCLAM LPAREN elements RPAREN { result = val[2] }
16
+
17
+ elements: value { result = [val[0]] }
18
+ | value COMMA elements { result = val[2].unshift(val[0]) }
19
+
20
+ key: id | string
21
+
22
+ value: id | string | number | object | array | bool | null
23
+
24
+ bool: EXCLAM T { result = true }
25
+ | EXCLAM F { result = false }
26
+
27
+ null: EXCLAM N { result = nil }
28
+
29
+ id: idstart
30
+ | idstart idchars { result = val[0] + val[1] }
31
+
32
+ idchars: idchar
33
+ | idchar idchars { result = val[0] + val[1] }
34
+
35
+ idchar: IDCHAR | idstart | MINUS | DIGIT
36
+
37
+ idstart: IDSTART | E | T | F | N | DOT
38
+
39
+ string: QUOTE QUOTE { result = '' }
40
+ | QUOTE strchars QUOTE { result = val[1] }
41
+
42
+ strchars: strchar
43
+ | strchar strchars { result = val[0] + val[1] }
44
+
45
+ strchar: STRCHAR
46
+ | idchar
47
+ | EXCLAM EXCLAM { result = '!' }
48
+ | EXCLAM QUOTE { result = "'" }
49
+ | COLON
50
+ | LPAREN
51
+ | RPAREN
52
+ | COMMA
53
+
54
+ number: int { result = val[0].to_i }
55
+ | int frac { result = "#{val[0]}#{val[1]}".to_f }
56
+ | int exp { result = "#{val[0]}#{val[1]}".to_f }
57
+ | int frac exp { result = "#{val[0]}#{val[1]}#{val[2]}".to_f }
58
+
59
+ int : DIGIT { result = val[0].to_i }
60
+ | DIGIT digits { result = "#{val[0]}#{val[1]}".to_i }
61
+ | MINUS DIGIT { result = "-#{val[1]}".to_i }
62
+ | MINUS DIGIT digits { result = "-#{val[1]}#{val[2]}".to_i }
63
+
64
+ frac: DOT digits { result = "#{val[0]}#{val[1]}" }
65
+
66
+ exp: e digits { result = "#{val[0]}#{val[1]}" }
67
+
68
+ digits: DIGIT
69
+ | DIGIT digits { result = "#{val[0]}#{val[1]}" }
70
+
71
+ e: E { result = 'e' }
72
+ | E MINUS { result = "e-" }
73
+
74
+ ---- inner
75
+
76
+ attr_reader :source, :input
77
+
78
+ def initialize(source)
79
+ @source = source
80
+ @input = StringScanner.new(source)
81
+ end
82
+
83
+ def self.parse(source)
84
+ self.new(source).do_parse
85
+ rescue Racc::ParseError => exn
86
+ raise ParserError.new("#{exn.message} in #{source}")
87
+ end
88
+
89
+ def next_token
90
+ case
91
+ when input.eos?
92
+ [false, false]
93
+ when input.scan(/'/)
94
+ [:QUOTE, input.matched]
95
+ when input.scan(/\(/)
96
+ [:LPAREN, input.matched]
97
+ when input.scan(/\)/)
98
+ [:RPAREN, input.matched]
99
+ when input.scan(/:/)
100
+ [:COLON, input.matched]
101
+ when input.scan(/\./)
102
+ [:DOT, input.matched]
103
+ when input.scan(/\,/)
104
+ [:COMMA, input.matched]
105
+ when input.scan(/!/)
106
+ [:EXCLAM, input.matched]
107
+ when input.scan(/\-/)
108
+ [:MINUS, input.matched]
109
+ when input.scan(/e/)
110
+ [:E, input.matched]
111
+ when input.scan(/t/)
112
+ [:T, input.matched]
113
+ when input.scan(/f/)
114
+ [:F, input.matched]
115
+ when input.scan(/n/)
116
+ [:N, input.matched]
117
+ # Originally, 0 is not allowed at the beginning of the number, but rison.js accepts this.
118
+ when input.scan(/[0-9]/)
119
+ [:DIGIT, input.matched]
120
+ # IDSTART and IDCHAR should originally accept only the ASCII symbols `-_./~`, but rison.js accepts other symbols.
121
+ # @see https://rison.io/
122
+ # @see https://github.com/Nanonid/rison/blob/e64af6c096fd30950ec32cfd48526ca6ee21649d/js/rison.js#L77-L84
123
+ when input.scan(/[^\-0-9 '!:\(\),\*@\$]/)
124
+ [:IDSTART, input.matched]
125
+ when input.scan(/[^ '!:\(\),\*@\$]/)
126
+ [:IDCHAR, input.matched]
127
+ when input.scan(/[^\'\!]/)
128
+ [:STRCHAR, input.matched]
129
+ end
130
+ end
@@ -0,0 +1,3 @@
1
+ module Rison
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,33 @@
1
+ lib = File.expand_path("lib", __dir__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require "rison/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "rison-rb"
7
+ spec.version = Rison::VERSION
8
+ spec.authors = ["Kazuma Watanabe"]
9
+ spec.email = ["watassbass@gmail.com"]
10
+
11
+ spec.summary = %q{A Ruby implementation for Rison}
12
+ spec.description = %q{This is a Ruby implementation for Rison that represents compact data in URIs. This module provides a parsing and dumping API like JSON module.}
13
+ spec.homepage = "https://github.com/wata727/rison-rb"
14
+ spec.license = "MIT"
15
+
16
+ spec.metadata["homepage_uri"] = spec.homepage
17
+ spec.metadata["source_code_uri"] = spec.homepage
18
+ spec.metadata["changelog_uri"] = "https://github.com/wata727/rison-rb/blob/master/CHANGELOG.md"
19
+
20
+ # Specify which files should be added to the gem when it is released.
21
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
22
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
23
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
24
+ end
25
+ spec.bindir = "exe"
26
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
27
+ spec.require_paths = ["lib"]
28
+
29
+ spec.add_development_dependency "bundler", "~> 2.0"
30
+ spec.add_development_dependency "rake", "~> 10.0"
31
+ spec.add_development_dependency "rspec", "~> 3.0"
32
+ spec.add_development_dependency "racc", "~> 1.4"
33
+ end
metadata ADDED
@@ -0,0 +1,126 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rison-rb
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Kazuma Watanabe
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2019-10-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: racc
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.4'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.4'
69
+ description: This is a Ruby implementation for Rison that represents compact data
70
+ in URIs. This module provides a parsing and dumping API like JSON module.
71
+ email:
72
+ - watassbass@gmail.com
73
+ executables: []
74
+ extensions: []
75
+ extra_rdoc_files: []
76
+ files:
77
+ - ".github/workflows/build.yml"
78
+ - ".gitignore"
79
+ - ".rspec"
80
+ - CHANGELOG.md
81
+ - CODE_OF_CONDUCT.md
82
+ - Gemfile
83
+ - LICENSE.txt
84
+ - README.md
85
+ - Rakefile
86
+ - bin/console
87
+ - bin/setup
88
+ - lib/rison.rb
89
+ - lib/rison/array/dumper.rb
90
+ - lib/rison/array/parser.rb
91
+ - lib/rison/array/parser.y
92
+ - lib/rison/dumper.rb
93
+ - lib/rison/object/dumper.rb
94
+ - lib/rison/object/parser.rb
95
+ - lib/rison/object/parser.y
96
+ - lib/rison/parser.rb
97
+ - lib/rison/parser.y
98
+ - lib/rison/version.rb
99
+ - rison-rb.gemspec
100
+ homepage: https://github.com/wata727/rison-rb
101
+ licenses:
102
+ - MIT
103
+ metadata:
104
+ homepage_uri: https://github.com/wata727/rison-rb
105
+ source_code_uri: https://github.com/wata727/rison-rb
106
+ changelog_uri: https://github.com/wata727/rison-rb/blob/master/CHANGELOG.md
107
+ post_install_message:
108
+ rdoc_options: []
109
+ require_paths:
110
+ - lib
111
+ required_ruby_version: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - ">="
114
+ - !ruby/object:Gem::Version
115
+ version: '0'
116
+ required_rubygems_version: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - ">="
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ requirements: []
122
+ rubygems_version: 3.0.6
123
+ signing_key:
124
+ specification_version: 4
125
+ summary: A Ruby implementation for Rison
126
+ test_files: []