solidity 0.1.5 → 0.2.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.
- checksums.yaml +4 -4
- data/lib/solidity/lexer.rb +49 -28
- data/lib/solidity/parser.rb +8 -34
- data/lib/solidity/version.rb +2 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 92328b174c85612323db86d1d50654934da8b46d878831b99d49086673cda0df
|
4
|
+
data.tar.gz: 487298452cd42474065d694a87ef23f8425371dfd8ce29742c38b38227beaade
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 18ee1772f0ea6d2c5579d955301140bf7930e3f9b94810682da34d5929c9c93c7b10f62e7781d01abe16527f54502837cd2424c773b0177c3fc767ba43734706
|
7
|
+
data.tar.gz: 1dcd402d83754b2bee56794fe465f02f7f874770188dffb971ff3fe34ea7aa0f084416f6a0f64508e90132d2ea03795e2f364c29f023b7f767e62d0d450a682d
|
data/lib/solidity/lexer.rb
CHANGED
@@ -43,15 +43,14 @@ class Lexer
|
|
43
43
|
## SingleQuotedStringCharacter
|
44
44
|
## : ~['\r\n\\] | ('\\' .) ;
|
45
45
|
|
46
|
+
DOUBLE_QUOTE = %r{"
|
47
|
+
( \\\\. | [^"\r\n\\] )*
|
48
|
+
"}x
|
46
49
|
|
47
50
|
SINGLE_QUOTE = %r{'
|
48
|
-
( \\\\. | [^'] )*
|
51
|
+
( \\\\. | [^'\r\n\\] )*
|
49
52
|
'}x
|
50
53
|
|
51
|
-
DOUBLE_QUOTE = %r{"
|
52
|
-
( \\\\. | [^"] )*
|
53
|
-
"}x
|
54
|
-
|
55
54
|
|
56
55
|
## from the solidity grammar
|
57
56
|
## > An identifier in solidity has to start with a letter,
|
@@ -76,40 +75,34 @@ class Lexer
|
|
76
75
|
##
|
77
76
|
## COMMENT
|
78
77
|
## : '/*' .*? '*/' ;
|
79
|
-
##
|
80
78
|
## LINE_COMMENT
|
81
79
|
## : '//' ~[\r\n]* ;
|
82
80
|
|
81
|
+
COMMENT = %r{/\*
|
82
|
+
.*?
|
83
|
+
\*/}x
|
84
|
+
|
85
|
+
LINE_COMMENT = %r{//
|
86
|
+
[^\r\n]*}x
|
83
87
|
|
84
88
|
def tokenize
|
85
89
|
t = []
|
86
90
|
s = StringScanner.new( @txt )
|
87
91
|
|
88
92
|
until s.eos? ## loop until hitting end-of-string (file)
|
89
|
-
if s.
|
90
|
-
## note: auto-slurp leading (optinal) spaces!!!! - why? why not?
|
91
|
-
comment = s.scan_until( /\*\// )
|
92
|
-
## print "multi-line comment:"
|
93
|
-
## pp comment
|
94
|
-
t << [:comment, comment.lstrip]
|
95
|
-
elsif s.check( /[ \t]*\/\// )
|
96
|
-
## note: auto-slurp leading (optinal) spaces!!!! - why? why not?
|
97
|
-
## note: auto-remove newline AND trailing whitespace - why? why not?
|
98
|
-
comment = s.scan_until( /\n|$/ ).strip
|
99
|
-
## print "comment:"
|
100
|
-
## pp comment
|
101
|
-
t << [:comment, comment]
|
102
|
-
elsif s.scan( /[ \t]+/ ) ## one or more spaces
|
93
|
+
if s.scan( /[ \t]+/ ) ## one or more spaces
|
103
94
|
## note: (auto-)convert tab to space - why? why not?
|
104
95
|
t << [:sp, s.matched.gsub( /[\t]/, ' ') ]
|
105
96
|
elsif s.scan( /\r?\n/ ) ## check for (windows) carriage return (\r) - why? why not?
|
106
97
|
t << [:nl, "\n" ]
|
107
|
-
elsif s.
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
t << [:string,
|
98
|
+
elsif s.scan( COMMENT )
|
99
|
+
t << [:comment, s.matched]
|
100
|
+
elsif s.scan( LINE_COMMENT )
|
101
|
+
t << [:comment, s.matched]
|
102
|
+
elsif s.scan( DOUBLE_QUOTE ) ## double-quoted string
|
103
|
+
t << [:string, s.matched]
|
104
|
+
elsif s.scan( SINGLE_QUOTE ) ## single-quoted string
|
105
|
+
t << [:string, s.matched]
|
113
106
|
elsif s.scan( NAME )
|
114
107
|
name = s.matched
|
115
108
|
case name
|
@@ -154,13 +147,41 @@ class Lexer
|
|
154
147
|
## note: returns type lexeme (string content) for now
|
155
148
|
## and NOT token struct for now - why? why not?
|
156
149
|
t = @tokens[@pos]
|
157
|
-
|
150
|
+
str = t.nil? || t.is_a?( String ) ? t : t[1]
|
158
151
|
@pos += 1 unless t.nil?
|
159
|
-
|
152
|
+
str
|
160
153
|
end
|
161
154
|
def eos?() peek().nil?; end
|
162
155
|
|
163
156
|
|
164
157
|
|
158
|
+
|
159
|
+
#################################################
|
160
|
+
# "higher-level" helpers
|
161
|
+
def scan_until( tt, include: false )
|
162
|
+
code = String.new('')
|
163
|
+
while (peek=self.peek) != tt do
|
164
|
+
## note: turn inline comments into a single space
|
165
|
+
code << if peek == :comment
|
166
|
+
self.next ## note: next (w/o self) is parsed as keyword
|
167
|
+
' '
|
168
|
+
else
|
169
|
+
self.next ## note: next (w/o self) is parsed as keyword
|
170
|
+
end
|
171
|
+
end
|
172
|
+
code << self.next if include ## include ';' too - why? why not?
|
173
|
+
code = _norm_whitespace( code )
|
174
|
+
code
|
175
|
+
end
|
176
|
+
|
177
|
+
def _norm_whitespace( str )
|
178
|
+
## change newlines to spaces and
|
179
|
+
## all multiple spaces to one
|
180
|
+
str = str.gsub( /[ \t\n\r]+/, ' ' )
|
181
|
+
str.strip
|
182
|
+
end
|
183
|
+
|
184
|
+
|
185
|
+
|
165
186
|
end # class Lexer
|
166
187
|
end # module Solidity
|
data/lib/solidity/parser.rb
CHANGED
@@ -17,66 +17,40 @@ class Parser
|
|
17
17
|
|
18
18
|
|
19
19
|
|
20
|
-
def _scan_until( lex, tt, include: false )
|
21
|
-
code = String.new('')
|
22
|
-
while (peek=lex.peek) != tt do
|
23
|
-
## note: turn inline comments into a single space
|
24
|
-
code << if peek == :comment
|
25
|
-
lex.next
|
26
|
-
' '
|
27
|
-
else
|
28
|
-
lex.next
|
29
|
-
end
|
30
|
-
end
|
31
|
-
code << lex.next if include ## include ';' too - why? why not?
|
32
|
-
code = _norm_whitespace( code )
|
33
|
-
code
|
34
|
-
end
|
35
|
-
|
36
|
-
def _norm_whitespace( str )
|
37
|
-
## change newlines to spaces and
|
38
|
-
## all multiple spaces to one
|
39
|
-
str = str.gsub( /[ \t\n\r]+/, ' ' )
|
40
|
-
str.strip
|
41
|
-
end
|
42
|
-
|
43
|
-
|
44
20
|
def _quick_pass_one
|
45
21
|
tree = []
|
46
22
|
|
47
23
|
lex = Lexer.new( @txt )
|
48
24
|
|
49
25
|
until lex.eos?
|
50
|
-
while lex.peek == :sp do ## note: do NOT skip newlines here; pass along blank/empty lines for now - why? why not?
|
51
|
-
lex.next
|
52
|
-
end
|
53
|
-
|
54
26
|
case lex.peek
|
55
27
|
when :comment ## single or multi-line comment
|
56
28
|
tree << [:comment, lex.next]
|
29
|
+
## note: if next token is newline - slurp / ignore
|
30
|
+
lex.next if lex.peek == :nl
|
57
31
|
when :pragma
|
58
|
-
code =
|
59
|
-
|
32
|
+
code = lex.scan_until( :';',
|
33
|
+
include: true )
|
60
34
|
## print "pragma:"
|
61
35
|
## pp code
|
62
36
|
tree << [:pragma, code]
|
63
37
|
when :contract
|
64
|
-
code =
|
38
|
+
code = lex.scan_until( :'{' )
|
65
39
|
## print "contract:"
|
66
40
|
## pp code
|
67
41
|
tree << [:contract, code]
|
68
42
|
when :abstract
|
69
|
-
code =
|
43
|
+
code = lex.scan_until( :'{' )
|
70
44
|
## print "abstract contract:"
|
71
45
|
## pp code
|
72
46
|
tree << [:abstract_contract, code]
|
73
47
|
when :library
|
74
|
-
code =
|
48
|
+
code = lex.scan_until( :'{' )
|
75
49
|
## print "library:"
|
76
50
|
## pp code
|
77
51
|
tree << [:library, code]
|
78
52
|
when :interface
|
79
|
-
code =
|
53
|
+
code = lex.scan_until( :'{' )
|
80
54
|
## print "interface:"
|
81
55
|
## pp code
|
82
56
|
tree << [:interface, code]
|
data/lib/solidity/version.rb
CHANGED
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.
|
4
|
+
version: 0.2.0
|
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-02-
|
11
|
+
date: 2023-02-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cocos
|