solidity 0.1.2 → 0.1.3
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/Manifest.txt +1 -0
- data/README.md +49 -0
- data/Rakefile +9 -0
- data/lib/solidity/parser.rb +173 -0
- data/lib/solidity/version.rb +1 -2
- data/lib/solidity.rb +1 -176
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7a34efb053c8fd9211832cedb2a99a05362f10fb3e43323d6bca7cd69783a88d
|
4
|
+
data.tar.gz: 3e113d90344d4a4745836b3b8bea5f18f4ac3c621d56914e5610c331f25dba20
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ea91690f94b665991f5f2e6934def21c1dd70ac475efc1e6cd578d84a05e31a7437dac0c1c3f9bffecb1283655ba3454d663f04a4ff190246ce240b4ea900535
|
7
|
+
data.tar.gz: f8b3f08e0691d3cfc34b25ab6652a632f41df90a6d0d593f699971886301a329fcb4f6fac048d3d041432d446030b89338cf9cabd01239a00a4a69aa50de9c45
|
data/Manifest.txt
CHANGED
data/README.md
CHANGED
@@ -1,3 +1,20 @@
|
|
1
|
+
|
2
|
+
---
|
3
|
+
|
4
|
+
_The Ruby Programming Language for Contract / Transaction Scripts on the Blockchain World Computer - Yes, It's Just Ruby_
|
5
|
+
|
6
|
+
**sruby - Small, Smart, Secure, Safe, Solid & Sound (S6) Ruby**
|
7
|
+
|
8
|
+
sruby is a subset of mruby that is a subset of "classic" ruby.
|
9
|
+
|
10
|
+
|
11
|
+
For more see the [**Red Paper »**](https://github.com/s6ruby/redpaper)
|
12
|
+
|
13
|
+
---
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
|
1
18
|
# Solidity
|
2
19
|
|
3
20
|
solidity gem - (fuzzy) parser for (crypto) contracts for ethereum & co.
|
@@ -10,6 +27,29 @@ solidity gem - (fuzzy) parser for (crypto) contracts for ethereum & co.
|
|
10
27
|
|
11
28
|
|
12
29
|
|
30
|
+
## New to the Solidity (Contract) Programming Language?
|
31
|
+
|
32
|
+
_Official_
|
33
|
+
|
34
|
+
Solidity Language @ <https://soliditylang.org>
|
35
|
+
|
36
|
+
- Read the Docs @ <https://docs.soliditylang.org/en/latest/>
|
37
|
+
- Blog @ <https://blog.soliditylang.org>
|
38
|
+
- Forum @ <https://forum.soliditylang.org>
|
39
|
+
- Source @ <https://github.com/ethereum/solidity>
|
40
|
+
|
41
|
+
<!-- break -->
|
42
|
+
|
43
|
+
_More_
|
44
|
+
|
45
|
+
Solidity by Example @ <https://solidity-by-example.org>
|
46
|
+
|
47
|
+
Learn X in Y Minutes (Where X=Solidity) @ <https://learnxinyminutes.com/docs/solidity>
|
48
|
+
|
49
|
+
Awesome Solidity @ <https://github.com/bkrem/awesome-solidity>
|
50
|
+
|
51
|
+
|
52
|
+
|
13
53
|
|
14
54
|
|
15
55
|
## Usage
|
@@ -96,6 +136,15 @@ library EnumerableSet
|
|
96
136
|
|
97
137
|
|
98
138
|
|
139
|
+
|
140
|
+
## Bonus: Solidity (Fuzzy) Parser in the Wild / Real-World
|
141
|
+
|
142
|
+
See [**Awesome (Ethereum) Contracts @ Open Blockchains »**](https://github.com/openblockchains/awesome-contracts)
|
143
|
+
|
144
|
+
Add your usage here. Yes, you can.
|
145
|
+
|
146
|
+
|
147
|
+
|
99
148
|
## License
|
100
149
|
|
101
150
|
The `solidity` scripts are dedicated to the public domain.
|
data/Rakefile
CHANGED
@@ -1,6 +1,15 @@
|
|
1
1
|
require 'hoe'
|
2
2
|
require './lib/solidity/version.rb'
|
3
3
|
|
4
|
+
|
5
|
+
###
|
6
|
+
# hack/ quick fix for broken intuit_values - overwrite with dummy
|
7
|
+
class Hoe
|
8
|
+
def intuit_values( input ); end
|
9
|
+
end
|
10
|
+
|
11
|
+
|
12
|
+
|
4
13
|
Hoe.spec 'solidity' do
|
5
14
|
|
6
15
|
self.version = Solidity::VERSION
|
@@ -0,0 +1,173 @@
|
|
1
|
+
module Solidity
|
2
|
+
|
3
|
+
class Parser
|
4
|
+
|
5
|
+
def self.read( path )
|
6
|
+
txt = read_text( path )
|
7
|
+
new( txt )
|
8
|
+
end
|
9
|
+
|
10
|
+
|
11
|
+
|
12
|
+
def initialize( txt )
|
13
|
+
@txt = txt
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
###############
|
18
|
+
## quotes
|
19
|
+
##
|
20
|
+
## note: regex pattern \\ needs to get escaped twice, thus, \\.
|
21
|
+
## and for literal \\ use \\\\\.
|
22
|
+
|
23
|
+
## => \\\\. -- allow backslash escapes e.g. \n \t \\ etc.
|
24
|
+
## => [^`] -- everything except backquote
|
25
|
+
|
26
|
+
## todo/fix - check if [^`] includes/matches newline too (yes)? -- add \n for multi-line!
|
27
|
+
|
28
|
+
SINGLE_QUOTE = %r{'
|
29
|
+
( \\\\. | [^'] )*
|
30
|
+
'}x
|
31
|
+
|
32
|
+
DOUBLE_QUOTE = %r{"
|
33
|
+
( \\\\. | [^"] )*
|
34
|
+
"}x
|
35
|
+
|
36
|
+
|
37
|
+
NAME = /[a-zA-Z][a-zA-Z0-9_]*/
|
38
|
+
END_OF_LINE = /\n|$/
|
39
|
+
## inline comments (multi- or end-of-line)
|
40
|
+
END_OF_LINE_OR_COMMENT_OR_KEYWORD_OR_QUOTE = / \n
|
41
|
+
| $
|
42
|
+
| (?=['"])
|
43
|
+
| (?=\/(\/|\*))
|
44
|
+
| (?=\bpragma\b)
|
45
|
+
| (?=\bcontract\b)
|
46
|
+
| (?=\babstract\b)
|
47
|
+
| (?=\blibrary\b)
|
48
|
+
| (?=\binterface\b)
|
49
|
+
/x
|
50
|
+
|
51
|
+
|
52
|
+
def _norm_whitespace( str )
|
53
|
+
## change newlines to spaces and
|
54
|
+
## all multiple spaces to one
|
55
|
+
str = str.gsub( /[ \t\n\r]+/, ' ' )
|
56
|
+
str.strip
|
57
|
+
end
|
58
|
+
|
59
|
+
def _quick_pass_one
|
60
|
+
## note: CANNOT handle inline comments
|
61
|
+
## in pragma, contract, etc. (get "silently" slurped)
|
62
|
+
## report a parse error - if comments slurped - why? why not?
|
63
|
+
##
|
64
|
+
|
65
|
+
|
66
|
+
tree = []
|
67
|
+
|
68
|
+
s = StringScanner.new( @txt )
|
69
|
+
|
70
|
+
loop do
|
71
|
+
s.skip( /[ \t]+/ ) ## note: do NOT skip newlines here; pass along blank/empty lines for now - why? why not?
|
72
|
+
if s.check( "'" ) ## single-quoted string
|
73
|
+
str = s.scan( SINGLE_QUOTE )
|
74
|
+
tree << [:string, str]
|
75
|
+
elsif s.check( '"' ) ## double-quoted string
|
76
|
+
str = s.scan( DOUBLE_QUOTE )
|
77
|
+
tree << [:string, str]
|
78
|
+
elsif s.check( '/*' )
|
79
|
+
comment = s.scan_until( /\*\// )
|
80
|
+
## print "multi-line comment:"
|
81
|
+
## pp comment
|
82
|
+
tree << [:comment, comment]
|
83
|
+
elsif s.check( '//' )
|
84
|
+
comment = s.scan_until( END_OF_LINE ).rstrip
|
85
|
+
## print "comment:"
|
86
|
+
## pp comment
|
87
|
+
tree << [:comment, comment]
|
88
|
+
else
|
89
|
+
name = s.check( NAME )
|
90
|
+
case name
|
91
|
+
when 'pragma'
|
92
|
+
code = s.scan_until( /;/ )
|
93
|
+
code = _norm_whitespace( code )
|
94
|
+
## print "pragma:"
|
95
|
+
## pp code
|
96
|
+
tree << [:pragma, code]
|
97
|
+
when 'contract'
|
98
|
+
code = s.scan_until( /(?=\{)/ )
|
99
|
+
code = _norm_whitespace( code )
|
100
|
+
## print "contract:"
|
101
|
+
## pp code
|
102
|
+
tree << [:contract, code]
|
103
|
+
when 'abstract'
|
104
|
+
code = s.scan_until( /(?=\{)/ )
|
105
|
+
code = _norm_whitespace( code )
|
106
|
+
## print "abstract contract:"
|
107
|
+
## pp code
|
108
|
+
tree << [:abstract_contract, code]
|
109
|
+
when 'library'
|
110
|
+
code = s.scan_until( /(?=\{)/ )
|
111
|
+
code = _norm_whitespace( code )
|
112
|
+
## print "library:"
|
113
|
+
## pp code
|
114
|
+
tree << [:library, code]
|
115
|
+
when 'interface'
|
116
|
+
code = s.scan_until( /(?=\{)/ )
|
117
|
+
code = _norm_whitespace( code )
|
118
|
+
## print "interface:"
|
119
|
+
## pp code
|
120
|
+
tree << [:interface, code]
|
121
|
+
else
|
122
|
+
## slurp chunk ,that is, until newline or comment or tracked keyword
|
123
|
+
chunk = s.scan_until( END_OF_LINE_OR_COMMENT_OR_KEYWORD_OR_QUOTE ).rstrip
|
124
|
+
## puts "chunk: >#{chunk.inspect}<"
|
125
|
+
tree << chunk
|
126
|
+
end
|
127
|
+
end
|
128
|
+
break if s.eos?
|
129
|
+
end
|
130
|
+
|
131
|
+
tree
|
132
|
+
end
|
133
|
+
|
134
|
+
|
135
|
+
def outline
|
136
|
+
buf = String.new( '' )
|
137
|
+
tree = _quick_pass_one
|
138
|
+
|
139
|
+
tree.each do |node|
|
140
|
+
if node.is_a?( Array )
|
141
|
+
case node[0]
|
142
|
+
when :contract then buf << node[1] << "\n"
|
143
|
+
when :abstract_contract then buf << node[1] << "\n"
|
144
|
+
when :interface then buf << node[1] << "\n"
|
145
|
+
when :library then buf << node[1] << "\n"
|
146
|
+
else
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
buf
|
152
|
+
end
|
153
|
+
|
154
|
+
def pragmas
|
155
|
+
buf = String.new( '' )
|
156
|
+
tree = _quick_pass_one
|
157
|
+
|
158
|
+
tree.each do |node|
|
159
|
+
if node.is_a?( Array )
|
160
|
+
case node[0]
|
161
|
+
when :pragma then buf << node[1] << "\n"
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
buf
|
167
|
+
end
|
168
|
+
|
169
|
+
|
170
|
+
end # class Parser
|
171
|
+
|
172
|
+
|
173
|
+
end # module Solidity
|
data/lib/solidity/version.rb
CHANGED
data/lib/solidity.rb
CHANGED
@@ -3,184 +3,9 @@ require 'cocos'
|
|
3
3
|
|
4
4
|
## our own code
|
5
5
|
require_relative 'solidity/version' # note: let version always go first
|
6
|
+
require_relative 'solidity/parser'
|
6
7
|
|
7
8
|
|
8
9
|
|
9
10
|
|
10
|
-
module Solidity
|
11
|
-
|
12
|
-
class Parser
|
13
|
-
|
14
|
-
def self.read( path )
|
15
|
-
txt = read_text( path )
|
16
|
-
new( txt )
|
17
|
-
end
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
def initialize( txt )
|
22
|
-
@txt = txt
|
23
|
-
end
|
24
|
-
|
25
|
-
|
26
|
-
###############
|
27
|
-
## quotes
|
28
|
-
##
|
29
|
-
## note: regex pattern \\ needs to get escaped twice, thus, \\.
|
30
|
-
## and for literal \\ use \\\\\.
|
31
|
-
|
32
|
-
## => \\\\. -- allow backslash escapes e.g. \n \t \\ etc.
|
33
|
-
## => [^`] -- everything except backquote
|
34
|
-
|
35
|
-
## todo/fix - check if [^`] includes/matches newline too (yes)? -- add \n for multi-line!
|
36
|
-
|
37
|
-
SINGLE_QUOTE = %r{'
|
38
|
-
( \\\\. | [^'] )*
|
39
|
-
'}x
|
40
|
-
|
41
|
-
DOUBLE_QUOTE = %r{"
|
42
|
-
( \\\\. | [^"] )*
|
43
|
-
"}x
|
44
|
-
|
45
|
-
|
46
|
-
NAME = /[a-zA-Z][a-zA-Z0-9_]*/
|
47
|
-
END_OF_LINE = /\n|$/
|
48
|
-
## inline comments (multi- or end-of-line)
|
49
|
-
END_OF_LINE_OR_COMMENT_OR_KEYWORD_OR_QUOTE = / \n
|
50
|
-
| $
|
51
|
-
| (?=['"])
|
52
|
-
| (?=\/(\/|\*))
|
53
|
-
| (?=pragma\b)
|
54
|
-
| (?=contract\b)
|
55
|
-
| (?=abstract\b)
|
56
|
-
| (?=library\b)
|
57
|
-
| (?=interface\b)
|
58
|
-
/x
|
59
|
-
|
60
|
-
|
61
|
-
def _norm_whitespace( str )
|
62
|
-
## change newlines to spaces and
|
63
|
-
## all multiple spaces to one
|
64
|
-
str = str.gsub( /[ \t\n\r]+/, ' ' )
|
65
|
-
str.strip
|
66
|
-
end
|
67
|
-
|
68
|
-
def _quick_pass_one
|
69
|
-
## note: CANNOT handle inline comments
|
70
|
-
## in pragma, contract, etc. (get "silently" slurped)
|
71
|
-
## report a parse error - if comments slurped - why? why not?
|
72
|
-
##
|
73
|
-
|
74
|
-
|
75
|
-
tree = []
|
76
|
-
|
77
|
-
s = StringScanner.new( @txt )
|
78
|
-
|
79
|
-
loop do
|
80
|
-
s.skip( /[ \t]+/ ) ## note: do NOT skip newlines here; pass along blank/empty lines for now - why? why not?
|
81
|
-
if s.check( "'" ) ## single-quoted string
|
82
|
-
str = s.scan( SINGLE_QUOTE )
|
83
|
-
tree << [:string, str]
|
84
|
-
elsif s.check( '"' ) ## double-quoted string
|
85
|
-
str = s.scan( DOUBLE_QUOTE )
|
86
|
-
tree << [:string, str]
|
87
|
-
elsif s.check( '/*' )
|
88
|
-
comment = s.scan_until( /\*\// )
|
89
|
-
## print "multi-line comment:"
|
90
|
-
## pp comment
|
91
|
-
tree << [:comment, comment]
|
92
|
-
elsif s.check( '//' )
|
93
|
-
comment = s.scan_until( END_OF_LINE ).rstrip
|
94
|
-
## print "comment:"
|
95
|
-
## pp comment
|
96
|
-
tree << [:comment, comment]
|
97
|
-
else
|
98
|
-
name = s.check( NAME )
|
99
|
-
case name
|
100
|
-
when 'pragma'
|
101
|
-
code = s.scan_until( /;/ )
|
102
|
-
code = _norm_whitespace( code )
|
103
|
-
## print "pragma:"
|
104
|
-
## pp code
|
105
|
-
tree << [:pragma, code]
|
106
|
-
when 'contract'
|
107
|
-
code = s.scan_until( /(?=\{)/ )
|
108
|
-
code = _norm_whitespace( code )
|
109
|
-
## print "contract:"
|
110
|
-
## pp code
|
111
|
-
tree << [:contract, code]
|
112
|
-
when 'abstract'
|
113
|
-
code = s.scan_until( /(?=\{)/ )
|
114
|
-
code = _norm_whitespace( code )
|
115
|
-
## print "abstract contract:"
|
116
|
-
## pp code
|
117
|
-
tree << [:abstract_contract, code]
|
118
|
-
when 'library'
|
119
|
-
code = s.scan_until( /(?=\{)/ )
|
120
|
-
code = _norm_whitespace( code )
|
121
|
-
## print "library:"
|
122
|
-
## pp code
|
123
|
-
tree << [:library, code]
|
124
|
-
when 'interface'
|
125
|
-
code = s.scan_until( /(?=\{)/ )
|
126
|
-
code = _norm_whitespace( code )
|
127
|
-
## print "interface:"
|
128
|
-
## pp code
|
129
|
-
tree << [:interface, code]
|
130
|
-
else
|
131
|
-
## slurp chunk ,that is, until newline or comment or tracked keyword
|
132
|
-
chunk = s.scan_until( END_OF_LINE_OR_COMMENT_OR_KEYWORD_OR_QUOTE ).rstrip
|
133
|
-
## puts "chunk: >#{chunk.inspect}<"
|
134
|
-
tree << chunk
|
135
|
-
end
|
136
|
-
end
|
137
|
-
break if s.eos?
|
138
|
-
end
|
139
|
-
|
140
|
-
tree
|
141
|
-
end
|
142
|
-
|
143
|
-
|
144
|
-
def outline
|
145
|
-
buf = String.new( '' )
|
146
|
-
tree = _quick_pass_one
|
147
|
-
|
148
|
-
tree.each do |node|
|
149
|
-
if node.is_a?( Array )
|
150
|
-
case node[0]
|
151
|
-
when :contract then buf << node[1] << "\n"
|
152
|
-
when :abstract_contract then buf << node[1] << "\n"
|
153
|
-
when :interface then buf << node[1] << "\n"
|
154
|
-
when :library then buf << node[1] << "\n"
|
155
|
-
else
|
156
|
-
end
|
157
|
-
end
|
158
|
-
end
|
159
|
-
|
160
|
-
buf
|
161
|
-
end
|
162
|
-
|
163
|
-
def pragmas
|
164
|
-
buf = String.new( '' )
|
165
|
-
tree = _quick_pass_one
|
166
|
-
|
167
|
-
tree.each do |node|
|
168
|
-
if node.is_a?( Array )
|
169
|
-
case node[0]
|
170
|
-
when :pragma then buf << node[1] << "\n"
|
171
|
-
end
|
172
|
-
end
|
173
|
-
end
|
174
|
-
|
175
|
-
buf
|
176
|
-
end
|
177
|
-
|
178
|
-
|
179
|
-
end # class Parser
|
180
|
-
|
181
|
-
|
182
|
-
end # module Solidity
|
183
|
-
|
184
|
-
|
185
|
-
|
186
11
|
puts Solidity.banner ## say hello
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: solidity
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gerald Bauer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-01
|
11
|
+
date: 2023-02-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cocos
|
@@ -72,6 +72,7 @@ files:
|
|
72
72
|
- README.md
|
73
73
|
- Rakefile
|
74
74
|
- lib/solidity.rb
|
75
|
+
- lib/solidity/parser.rb
|
75
76
|
- lib/solidity/version.rb
|
76
77
|
homepage: https://github.com/rubycocos/blockchain
|
77
78
|
licenses:
|