class STSScanDriver
Public Class Methods
new( path )
click to toggle source
# File lib/statsailr/scanner/sts_scanner.rb, line 335 def initialize( path ) @source_path = path end
Public Instance Methods
tokenize()
click to toggle source
# File lib/statsailr/scanner/sts_scanner.rb, line 339 def tokenize s = STSScanner.new(@source_path) s.start() @tokens = [] while ! s.eos? do case when s.scan_state_top? case when s.bol? && s.scan(/[ \t]*D[Aa][Tt][Aa]/) @tokens << [:DATA_START, "DATA" ] s.skip_spaces() if s.scan(/\:/) @tokens << [:COLON, s.matched] s.skip_spaces s.scan_ident() @tokens << [:IDENT, s.matched] s.skip_spaces() end s.scan_ident() @tokens << [:IDENT, s.matched] s.skip_spaces() @tokens.concat s.tokenize_options() @tokens << [:TERMIN, "\n"] s.scan_state_set_data() s.prepare_data_script() when s.bol? && s.scan(/[ \t]*P[Rr][Oo][Cc]/) @tokens << [:PROC_START, "PROC" ] s.skip_spaces() s.scan_ident() @tokens << [:IDENT, s.matched] s.skip_spaces() @tokens.concat s.tokenize_options() @tokens << [:TERMIN, "\n"] s.scan_state_set_proc() s.prepare_proc_tokens() else if s.skip_rest_after_comment_sign() elsif s.skip_empty_line() elsif s.skip_multiple_line_comment() elsif s.scan_toplevel_instruction @tokens << [:TOP_INST, s.matched() ] @tokens.concat s.tokenize_options() @tokens << [:TOP_INST_END, "TOP_INST_END"] @tokens << [:TERMIN, "\n"] else print("Unknown part on TOP LEVEL(" + s.get_scan_state.to_s + ") " ) p s.check(/...../) # Show five letters if s.skip_until(/\n/) # Discard the current line else s.skip_until(/$/) # Last line end end end when s.scan_state_data? if s.scan_end_line? @tokens << [:DATA_SCRIPT, s.get_data_script() ] @tokens << [:DATA_END, "END"] @tokens << [:TERMIN, "D_TERMIN"] s.scan_state_set_top() # Return to TOP_LEVEL else # Store data lines to one token s.scan_whole_line() line = s.matched() s.append_to_data_script( line ) end when s.scan_state_proc? if s.scan_end_line? @tokens.concat s.get_proc_tokens() @tokens << [:PROC_END, "END"] @tokens << [:TERMIN, "P_TERMIN"] s.scan_state_set_top() # Return to TOP_LEVEL elsif s.skip_rest_after_comment_sign() # Ignore after comment sign. elsif s.skip_empty_line() # Ignore the empty line. elsif s.skip_multiple_line_comment() # Ignore multiple comment. else s.scan_proc_inst() s.append_to_proc_tokens( [].append [:PROC_INST , s.matched ]) proc_tokens = s.tokenize_proc_line() # Tokenize the current line s.append_to_proc_tokens(proc_tokens) s.append_to_proc_tokens( [].append [:TERMIN, "TERMIN"] ) end else raise "Error: StatSailrScanner has an invalid scan state " + s.get_scan_state end end s.terminate() return @tokens end