Class: STSScanner
Constant Summary
STSConstants::DQ_STR_PATTERN, STSConstants::FLOATP_PATTERN, STSConstants::IDENT_PATTERN, STSConstants::INT_PATTERN, STSConstants::PROC_INST_PATTERN, STSConstants::SQ_STR_PATTERN
Instance Method Summary
collapse
Constructor Details
#initialize(script) ⇒ STSScanner
Initialization & Terminating methods
17
18
19
|
# File 'lib/statsailr/scanner/sts_scanner.rb', line 17
def initialize( script )
@script = script
end
|
Instance Method Details
#append_to_data_script(script) ⇒ Object
154
155
156
|
# File 'lib/statsailr/scanner/sts_scanner.rb', line 154
def append_to_data_script( script )
@data_script << script
end
|
#append_to_proc_tokens(tokens) ⇒ Object
172
173
174
|
# File 'lib/statsailr/scanner/sts_scanner.rb', line 172
def append_to_proc_tokens( tokens )
@proc_tokens.concat tokens
end
|
#bol? ⇒ Boolean
52
53
54
|
# File 'lib/statsailr/scanner/sts_scanner.rb', line 52
def bol?()
@scanner.bol?
end
|
#check(pattern) ⇒ Object
56
57
58
|
# File 'lib/statsailr/scanner/sts_scanner.rb', line 56
def check(pattern)
@scanner.check(pattern)
end
|
#eos? ⇒ Boolean
48
49
50
|
# File 'lib/statsailr/scanner/sts_scanner.rb', line 48
def eos?()
@scanner.eos?
end
|
#get_data_script ⇒ Object
158
159
160
|
# File 'lib/statsailr/scanner/sts_scanner.rb', line 158
def get_data_script()
return @data_script
end
|
#get_proc_tokens ⇒ Object
168
169
170
|
# File 'lib/statsailr/scanner/sts_scanner.rb', line 168
def get_proc_tokens()
return @proc_tokens
end
|
#get_scan_state ⇒ Object
308
309
310
|
# File 'lib/statsailr/scanner/sts_scanner.rb', line 308
def get_scan_state()
return @scan_state
end
|
#matched ⇒ Object
44
45
46
|
# File 'lib/statsailr/scanner/sts_scanner.rb', line 44
def matched()
@scanner.matched
end
|
#prepare_data_script ⇒ Object
Additional features for data script
150
151
152
|
# File 'lib/statsailr/scanner/sts_scanner.rb', line 150
def prepare_data_script()
@data_script = ""
end
|
#prepare_proc_tokens ⇒ Object
Additional features for proc stmts
164
165
166
|
# File 'lib/statsailr/scanner/sts_scanner.rb', line 164
def prepare_proc_tokens()
@proc_tokens = []
end
|
#scan(pattern) ⇒ Object
Delegate corresponding methods to StringScanner
32
33
34
|
# File 'lib/statsailr/scanner/sts_scanner.rb', line 32
def scan(pattern)
@scanner.scan(pattern)
end
|
#scan_end_line? ⇒ Boolean
129
130
131
132
133
134
135
136
137
138
139
|
# File 'lib/statsailr/scanner/sts_scanner.rb', line 129
def scan_end_line?()
if( scan(/[ \t]*E[Nn][Dd][ \t]*/))
if scan(/\S+/)
puts "Script after END is ignored (" + matched + ")"
end
scan_until(/\n/)
return true
else
return false
end
end
|
#scan_ident ⇒ Object
94
95
96
|
# File 'lib/statsailr/scanner/sts_scanner.rb', line 94
def scan_ident()
scan(IDENT_PATTERN)
end
|
#scan_proc_inst ⇒ Object
176
177
178
179
|
# File 'lib/statsailr/scanner/sts_scanner.rb', line 176
def scan_proc_inst()
skip_spaces()
scan(PROC_INST_PATTERN)
end
|
#scan_proc_special ⇒ Object
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
|
# File 'lib/statsailr/scanner/sts_scanner.rb', line 181
def scan_proc_special()
case
when scan(/\=\=/)
return :P_DEQ
when scan(/\=/)
return :P_EQ
when scan(/\*/)
return :P_MULT
when scan(/\+/)
return :P_PLUS
when scan(/\-/)
return :P_MINUS
when scan(/%%/)
return :P_INTDEV
when scan(/%\/%/)
return :P_MOD
when scan(/\%in\%/)
return :P_IN
when scan(/&&/)
return :P_DAND
when scan(/\|\|/)
return :P_DOR
when scan(/&/)
return :P_AND
when scan(/\|/)
return :P_OR
when scan(/>/)
return :P_LT
when scan(/</)
return :P_ST
when scan(/>=/)
return :P_LTE
when scan(/<=/)
return :P_STE
when scan(/\^/)
return :P_HAT
when scan(/\~/)
return :P_TILDE
when scan(/\:/)
return :P_COLON
when scan(/\(/)
return :P_LPAR
when scan(/\)/)
return :P_RPAR
when scan(/\[/)
return :P_LSQBR
when scan(/\]/)
return :P_RSQBR
when scan(/\,/)
return :P_COMMA
end
end
|
#scan_state_data? ⇒ Boolean
280
281
282
283
284
285
286
|
# File 'lib/statsailr/scanner/sts_scanner.rb', line 280
def scan_state_data?()
if @scan_state == :DATA
return true
else
return false
end
end
|
#scan_state_proc? ⇒ Boolean
288
289
290
291
292
293
294
|
# File 'lib/statsailr/scanner/sts_scanner.rb', line 288
def scan_state_proc?()
if @scan_state == :PROC
return true
else
return false
end
end
|
#scan_state_set_data ⇒ Object
300
301
302
|
# File 'lib/statsailr/scanner/sts_scanner.rb', line 300
def scan_state_set_data()
@scan_state = :DATA
end
|
#scan_state_set_proc ⇒ Object
304
305
306
|
# File 'lib/statsailr/scanner/sts_scanner.rb', line 304
def scan_state_set_proc()
@scan_state = :PROC
end
|
#scan_state_set_top ⇒ Object
296
297
298
|
# File 'lib/statsailr/scanner/sts_scanner.rb', line 296
def scan_state_set_top()
@scan_state = :TOP
end
|
#scan_state_top? ⇒ Boolean
272
273
274
275
276
277
278
|
# File 'lib/statsailr/scanner/sts_scanner.rb', line 272
def scan_state_top?()
if @scan_state == :TOP
return true
else
return false
end
end
|
#scan_toplevel_instruction ⇒ Object
Additional features for TOPLEVEL
143
144
145
146
|
# File 'lib/statsailr/scanner/sts_scanner.rb', line 143
def scan_toplevel_instruction
inst = Regexp.new( /\s*/.source() + IDENT_PATTERN.source() )
scan( inst )
end
|
#scan_until(pattern) ⇒ Object
36
37
38
|
# File 'lib/statsailr/scanner/sts_scanner.rb', line 36
def scan_until(pattern)
@scanner.scan_until(pattern)
end
|
#scan_whole_line ⇒ Object
125
126
127
|
# File 'lib/statsailr/scanner/sts_scanner.rb', line 125
def scan_whole_line()
scan(/.*\n/)
end
|
#skip_empty_line ⇒ Object
78
79
80
81
82
83
84
|
# File 'lib/statsailr/scanner/sts_scanner.rb', line 78
def skip_empty_line()
if scan(/[ \t]*\n/)
return true
else
return false
end
end
|
#skip_line ⇒ Object
66
67
68
|
# File 'lib/statsailr/scanner/sts_scanner.rb', line 66
def skip_line()
scan_until(/\n/)
end
|
86
87
88
89
90
91
92
|
# File 'lib/statsailr/scanner/sts_scanner.rb', line 86
def ()
if scan(/\s*\/\*(.|\n)+?\*\//)
return true
else
return false
end
end
|
70
71
72
73
74
75
76
|
# File 'lib/statsailr/scanner/sts_scanner.rb', line 70
def ()
if scan(/[ \t]*(\/\/).*\n/)
return true
else
return false
end
end
|
#skip_spaces ⇒ Object
Additional scanner methods
62
63
64
|
# File 'lib/statsailr/scanner/sts_scanner.rb', line 62
def skip_spaces()
scan(/[ \t]*/)
end
|
#skip_until(pattern) ⇒ Object
40
41
42
|
# File 'lib/statsailr/scanner/sts_scanner.rb', line 40
def skip_until(pattern)
@scanner.skip_until(pattern)
end
|
#start ⇒ Object
21
22
23
24
|
# File 'lib/statsailr/scanner/sts_scanner.rb', line 21
def start()
@scanner = StringScanner.new(@script)
@scan_state = :TOP
end
|
#terminate ⇒ Object
26
27
28
|
# File 'lib/statsailr/scanner/sts_scanner.rb', line 26
def terminate()
@scanner.terminate()
end
|
#tokenize_options ⇒ Object
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
# File 'lib/statsailr/scanner/sts_scanner.rb', line 98
def tokenize_options()
tokens = []
while 1 do
case
when eos? || scan(/\n/)
break
when scan(/=/)
tokens << [:ASSIGN, matched ]
when scan(IDENT_PATTERN)
tokens << [:IDENT, matched ]
when scan(FLOATP_PATTERN)
tokens << [:NUMBER, matched.to_f ]
when scan(INT_PATTERN)
tokens << [:NUMBER, matched.to_i ]
when scan(SQ_STR_PATTERN)
tokens << [:SQ_STRING, matched[Range.new(1, -2)] ]
when scan(DQ_STR_PATTERN)
tokens << [:DQ_STRING, matched[Range.new(1, -2)] ]
when scan(/[ \t]/)
else
raise "options cannot be tokenized."
end
end
return tokens
end
|
#tokenize_proc_line ⇒ Object
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
|
# File 'lib/statsailr/scanner/sts_scanner.rb', line 234
def tokenize_proc_line()
tokens = []
while 1 do
case
when eos? || scan(/\n/)
break
when scan(IDENT_PATTERN)
tokens << [:IDENT, matched ]
when scan(FLOATP_PATTERN)
tokens << [:NUMBER, matched.to_f ]
when scan(INT_PATTERN)
tokens << [:NUMBER, matched.to_i ]
when scan(SQ_STR_PATTERN)
tokens << [:SQ_STRING, matched[Range.new(1, -2)] ]
when scan(DQ_STR_PATTERN)
tokens << [:DQ_STRING, matched[Range.new(1, -2)] ]
when type = scan_proc_special()
tokens << [ type , matched ]
when scan(/[ \t]/)
when scan(/\/\//)
@scanner.unscan
break
when scan(/\/\*/)
@scanner.unscan
break
when scan(/\//)
tokens << [:P_SLASH, matched]
else
scan(/.*\n/)
raise "Current PROC line cannot be tokenized." + matched
end
end
return tokens
end
|