solidity 0.1.5 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|