pre_lexer.js

Summary

No overview generated for 'pre_lexer.js'


var pre_lexer = function(script)
{
  var input = script.source_data, line_arr = script.line_arr, state_arr = script.state_arr;
  var cur_cur = -1;
  var line_cur = 0;
  var line_cur_prev = -1;
  var s_quote_cur = -2;
  var d_quote_cur = -2;
  var slash_cur = -2;

  var min_cur = 0;

  var s_quote_val = '\'';
  var d_quote_val = '"';
  var slash_val = '/';

  var line_count = 0;

  var temp_count = 0;

  var temp_char = '';

  var temp_type = '';


  var string = new String(input);
  // states = default, s_quote, d_qute, slash
  var DEFAULT = 0, SINGLE_QUOTE = 1, DOUBLE_QUOTE = 2, REG_EXP = 3, COMMENT = 4;
  // lexer_states = default, s_quote, d_qute, slash
  var lex_state = 'DEFAULT'; // SINGLE_QUOTE; DOUBLE_QUOTE; SLASH
  var LEX_S_QUOTE = 1;
  var state = '';

  var get_min = Math.min;
  var get_max = Math.max;


  while( min_cur != -1 )
  {
    
    state = '';
    if( ( s_quote_cur != -1 ) && ( s_quote_cur <= cur_cur ) ) 
    {
      s_quote_cur = string.indexOf(s_quote_val, cur_cur + 1);
    }
    if( ( d_quote_cur != -1 ) && ( d_quote_cur <= cur_cur ) ) 
    {
      d_quote_cur = string.indexOf(d_quote_val, cur_cur + 1);
    }
    if( ( slash_cur != -1 ) && ( slash_cur <= cur_cur ) ) 
    {
      slash_cur = string.indexOf(slash_val, cur_cur + 1);
    }
    // get the minimum, but bigger then -1
    min_cur = get_max(s_quote_cur, d_quote_cur, slash_cur);
    if( s_quote_cur != -1 && s_quote_cur <= min_cur)
    {
      min_cur = s_quote_cur;
      state = 'SINGLE_QUOTE';
    }
    if( d_quote_cur != -1 && d_quote_cur <= min_cur )
    {
      min_cur = d_quote_cur;
      state = 'DOUBLE_QUOTE';
    }
    if( slash_cur != -1 && slash_cur <= min_cur )
    {
      min_cur = slash_cur;
      state = 'SLASH';
    }
    if( state )
    {
      
      while( line_cur <= min_cur )
      {
        line_arr[line_count++] = line_cur;
        if( ( line_cur = string.indexOf('\n', line_cur) + 1 ) == 0 )
        {
          if( line_arr[ line_arr.length - 1 ] < string.length )
          {
            line_arr[line_count] = string.length;
          }
          return;
        } 
      }
      switch( state )
      {
        case 'SINGLE_QUOTE':
        {
          do
          {
            s_quote_cur = string.indexOf(s_quote_val, s_quote_cur + 1);
            temp_count = 0;
            while( string.charAt( s_quote_cur - temp_count - 1 )=='\\' )
            {
              temp_count++;
            }
          }
          while ( ( temp_count&1 ) && s_quote_cur != -1 );
          if( s_quote_cur != -1 )
          {
            cur_cur = s_quote_cur;
            while( line_cur < cur_cur )
            {
              line_arr[line_count] = line_cur;
              state_arr[line_count++] = SINGLE_QUOTE;
              if( ( line_cur = string.indexOf('\n', line_cur) + 1 ) == 0 )
              {
                if( line_arr[ line_arr.length - 1 ] < string.length )
                {
                  line_arr[line_count] = string.length;
                }
                return;
              }
            }
          }
          continue;
        }
        case 'DOUBLE_QUOTE':
        {
          
          do
          {
            d_quote_cur = string.indexOf(d_quote_val, d_quote_cur + 1);
            temp_count = 0;
            while( string.charAt( d_quote_cur - temp_count - 1 )=='\\' )
            {
              temp_count++;
            }
          }
          while ( ( temp_count&1 ) && d_quote_cur != -1 );
          if( d_quote_cur != -1 )
          {
            cur_cur = d_quote_cur;
            while( line_cur < cur_cur )
            {
              line_arr[line_count] = line_cur;
              state_arr[line_count++] = DOUBLE_QUOTE;
              if( ( line_cur = string.indexOf('\n', line_cur) + 1 ) == 0 )
              {
                if( line_arr[ line_arr.length - 1 ] < string.length )
                {
                  line_arr[line_count] = string.length;
                }
                return;
              }
            }
          }
          
          continue;
        }
        case 'SLASH':
        {
          switch(string.charAt(slash_cur+1))
          {
            case '/':
            {
              cur_cur = string.indexOf('\n', slash_cur+2);
              while( line_cur < cur_cur )
              {
                line_arr[line_count++] = line_cur;
                if( ( line_cur = string.indexOf('\n', line_cur) + 1 ) == 0 )
                {
                  if( line_arr[ line_arr.length - 1 ] < string.length )
                  {
                    line_arr[line_count] = string.length;
                  }
                  return;
                }
              }
              continue;
            }
            case '*':
            {
              do
              {
                slash_cur = string.indexOf('*', slash_cur + 1);
                temp_char = string.charAt(slash_cur + 1);
              }
              while ( slash_cur != -1 && temp_char && temp_char != '/');
              if( slash_cur != -1 )
              {
                cur_cur = slash_cur+1;
                while( line_cur < cur_cur )
                {
                  line_arr[line_count] = line_cur;
                  state_arr[line_count++] = COMMENT;
                  if( ( line_cur = string.indexOf('\n', line_cur) + 1 ) == 0 )
                  {
                    if( line_arr[ line_arr.length - 1 ] < string.length )
                    {
                      line_arr[line_count] = string.length;
                    }
                    return;
                  }
                }
              }
              continue;
            }
            default:
            {
              temp_count = 1;
              do
              {
                temp_char = string.charAt(slash_cur-temp_count);
                temp_count++;
              }
              while ( temp_char == ' ' && ( slash_cur - temp_count > 0 ) );
              switch(temp_char)
              {
                case '=': 
                case '(': 
                case '[': 
                case ':': 
                case ',': 
                case '!':
                {
                  temp_type = 'REG_EXP';
                  break;
                }
                case '&': 
                case '|':
                {
                  if(string.charAt(slash_cur-temp_count) == temp_char)
                  {
                    temp_type = 'REG_EXP';
                    break;
                  }
                }
                default:
                {
                  temp_type = '';
                }
              }
              if(temp_type == 'REG_EXP')
              {
                do
                {
                  slash_cur = string.indexOf(slash_val, slash_cur + 1);
                  temp_count = 0;
                  while( string.charAt( slash_cur - temp_count - 1 )=='\\' )
                  {
                    temp_count++;
                  }
                }
                while ( ( temp_count&1 ) && slash_cur != -1 );
                if( slash_cur != -1 )
                {
                  cur_cur = slash_cur;
                  while( line_cur < cur_cur )
                  {
                    line_arr[line_count] = line_cur;
                    state_arr[line_count++] = REG_EXP;
                    if( ( line_cur = string.indexOf('\n', line_cur) + 1 ) == 0 )
                    {
                      if( line_arr[ line_arr.length - 1 ] < string.length )
                      {
                        line_arr[line_count] = string.length;
                      }
                      return;
                    }
                  }
                }
                continue;
              }
              else // should be a division
              {
                cur_cur = slash_cur;
                continue;
              }
            }
          }
        }
      }
    }
    else
    {
      if( !line_cur && !line_arr.length )
      {
        line_cur = string.indexOf('\n', line_cur) + 1 ;
        if( line_cur  || string.length )
        {
          line_arr[line_count++] = 0;
        }
      }
      while( line_cur )
      {
        line_arr[line_count++] = line_cur;
        line_cur = string.indexOf('\n', line_cur) + 1;
      }
      if( line_arr[ line_arr.length - 1 ] < string.length )
      {
        line_arr[line_count] = string.length;
      }
      
      return;
    }
  }
}


Documentation generated by JSDoc on Thu Oct 30 18:01:10 2008