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