亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? scanner.cpp

?? c-smile 一個語法類似與JS 又有點像C++的 編譯器
?? CPP
字號:
/*
*
* scanner.cpp
*
* Copyright (c) 2001, 2002
* Andrew Fedoniouk - andrew@terra-informatica.org
* Portions: Serge Kuznetsov -  kuznetsov@deeptown.org
*
* See the file "COPYING" for information on usage 
* and redistribution of this file
*
*/

#include <stdarg.h>
#include "c-smile.h"
#include "tool.h"
#include "scanner.h"
#include "compiler.h"
#include "streams.h"

#ifndef _WIN32
#define _vsnprintf vsnprintf
#endif


namespace c_smile
{

#ifdef COMPILER

  /* keyword table */
  static struct
  {
    char *kt_keyword; int kt_token;
  }
  ktab [] =
  {
    { "class",        T_CLASS       },
    { "static",       T_STATIC      },
    { "if",           T_IF          },
    { "else",         T_ELSE        },
    { "while",        T_WHILE       },
    { "return",       T_RETURN      },
    { "for",          T_FOR         },
    { "break",        T_BREAK       },
    { "continue",     T_CONTINUE    },
    { "do",           T_DO          },
    { "new",          T_NEW         },
    { "null",         T_NULL        },
    { "var",          T_VAR         },
    { "function",     T_FUNCTION    },
    { "package",      T_PACKAGE     },
    { "try",          T_TRY         },
    { "catch",        T_CATCH       },
    { "throw",        T_THROW       },
    { "property",     T_PROPERTY    },
    { "import",       T_IMPORT      },
    { "instanceof",   T_INSTANCEOF  },
    { "undefined",    T_UNDEFINED   },
    { "switch",       T_SWITCH      },
    { "case",         T_CASE        },
    { "default",      T_DEFAULT     },
    { "synchronized", T_SYNCHRO     },
    { "const",        T_CONST       },
    { NULL,           0             }
  };

  /* token name table */
  static char *t_names  [] =
  {
    "<string>",
    "<identifier>",
    "<number>",
    "class",
    "static",
    "if",
    "else",
    "while",
    "return",
    "for",
    "break",
    "continue",
    "do",
    "new",
    "null",
    "<=",
    "==",
    "!=",
    ">=",
    "<<",
    ">>",
    "&&",
    "||",
    "++",
    "--",
    "+=",
    "-=",
    "*=",
    "/=",
    "%=",
    "&=",
    "|=",
    "^=",
    "<<=",
    ">>=",
    "::",
    ".",
    "var",
    "function",
    "package",
    "try",
    "catch",
    "throw",
    "property",
    "import",
    "instanceof",
    "undefined",
    "$",
    "$$",
    "switch",
    "case",
    "default",
    "@",
    "synchronized",
    "const",
  };


  // init_scanner - initialize the scanner
  void
    scanner::init ( compiler *c, io_stream  *input )
  {
    comp = c;
    // remember the input
    this->input = input;

    // setup the line buffer
    lptr = line; *lptr = '\0';
    lnum = 0;

    // no lookahead yet
    savetkn = T_NOTOKEN;
    savech = '\0';

    // no last character
    lastch = '\0';
  }

  // token - get the next token
  int
    scanner::token ()
  {
    int tkn;

    if ( ( tkn = savetkn ) != T_NOTOKEN )
      savetkn = T_NOTOKEN;
    else
      tkn = rtoken ();
    return ( tkn );
  }

  // stoken - save a token
  void
    scanner::stoken ( int tkn )
  {
    savetkn = tkn;
  }

  // tkn_name - get the name of a token
  char *
    scanner::tkn_name ( int tkn )
  {
    static char tname [ 2 ];

    if ( tkn == T_EOF )
      return ( "<eof>" );
    else if ( tkn >= _TMIN && tkn <= _TMAX )
      return ( t_names [ tkn - _TMIN ] );
    tname [ 0 ] = tkn;
    tname [ 1 ] = '\0';
    return ( tname );
  }

  // rtoken - read the next token
  int
    scanner::rtoken ()
  {
    int ch, ch2;

    // check the next character
    for ( ; ; )
      switch ( ch = skipspaces  () )
      {
      case EOF:
        return ( T_EOF );
      case '"':
        return ( getstring () );
      case '\'':
        return ( getcharacter () );
      case '$':
        if ( (ch = getch () ) == '$' )
          return T_ARGUMENTS;
        savech = ch;
        return T_ARGUMENT;
      case '@':
        return T_MAKEREF;

      case '<':
        switch ( ch = getch () )
        {
        case '=':
          return ( T_LE );
        case '<':
          if ( (ch = getch () ) == '=' )
            return ( T_SHLEQ );
          savech = ch;
          return ( T_SHL );
        default:
          savech = ch;
          return ('<');
        }
      case '=':
        if ( (ch = getch () ) == '=' )
          return ( T_EQ );
        savech = ch;
        return ( '=' );
      case '!':
        if ( ( ch = getch () ) == '=' )
          return ( T_NE );
        savech = ch;
        return ('!');
      case '>':
        switch ( ch = getch () )
        {
        case '=':
          return ( T_GE );
        case '>':
          if ( ( ch = getch () ) == '=' )
            return ( T_SHREQ );
          savech = ch;
          return ( T_SHR );
        default:
          savech = ch;
          return ( '>' );
        }
      case '&':
        switch ( ch = getch () )
        {
        case '&':
          return ( T_AND );
        case '=':
          return ( T_ANDEQ );
        default:
          savech = ch;
          return ('&');
        }
      case '|':
        switch ( ch = getch () )
        {
        case '|':
          return ( T_OR );
        case '=':
          return ( T_OREQ );
        default:
          savech = ch;
          return ('|');
        }
      case '^':
        if ( ( ch = getch () ) == '=' )
          return ( T_XOREQ );
        savech = ch;
        return ('^');
      case '+':
        switch ( ch = getch () )
        {
        case '+':
          return ( T_INC );
        case '=':
          return ( T_ADDEQ );
        default:
          savech = ch;
          return ( '+' );
        }
      case '-':
        switch ( ch = getch () )
        {
        case '-':
          return ( T_DEC );
        case '=':
          return ( T_SUBEQ );
        default:
          savech = ch;
          if ( isdigit ( ch ) )
            return ( getnumber ( '-' ) );
          return ('-');
        }
      case '.':
        return ( T_MEMREF );
      case '*':
        if ( (ch = getch () ) == '=')
          return ( T_MULEQ );
        savech = ch;
        return ('*');
      case '/':
        switch ( ch = getch () )
        {
        case '=':
          return ( T_DIVEQ );
        case '/':
          while ( ( ch = getch () ) != EOF )
            if ( ch == '\n' )
              break;
          break;
        case '*':
          ch = ch2 = EOF;
          for ( ; ( ch2 = getch () ) != EOF; ch = ch2 )
            if ( ch == '*' && ch2 == '/')
              break;
          break;
        default:
          savech = ch;
          return ('/');
        }
        break;
      case ':':
        if ( ( ch = getch () ) == ':' )
          return ( T_CC );
        savech = ch;
        return ( ':' );
      default:
        if ( isdigit ( ch ) )
          return ( getnumber ( ch ) );
        else if ( isidchar ( ch ) )
          return ( getid ( ch ) );
        else
        {
          t_token.clear ();
          t_token += ch;
          return ( ch );
        }
      }
  }

  int
    scanner::getxch ()
  {
    int value, ch;

    if ( ( ch = getch () ) == EOF || !isxdigit ( ch ) )
    {
      savech = ch;
      return 0;
    }

    value = isdigit ( ch ) ? ch - '0' : tolower ( ch ) - 'a' + 10;
    if ( ( ch = getch  () ) == EOF || !isxdigit ( ch ) )
    {
      savech = ch;
      return value;
    }
    return ( value << 4 ) | ( isdigit ( ch ) ? ch - '0'
                                             : tolower ( ch ) - 'a' + 10 );
  }

  // getstring - get a string
  int
    scanner::getstring ()
  {
    int ch;

    /* get the string */
    t_token.clear ();
    while ( ( ch = getch () ) != EOF && ch != '"' )
    {
      if ( ch == '\\')
        switch ( ch = getch () )
      {
      case 'a':  ch = '\a'; break;
      case 'b':  ch = '\b'; break;
      case 'f':  ch = '\f'; break;
      case 'n':  ch = '\n'; break;
      case 'r':  ch = '\r'; break;
      case 't':  ch = '\t'; break;
      case 'v':  ch = '\v'; break;
      case '"':  ch = '"';  break;
      case 'x':  ch = getxch (); break;
      case '\\': ch = '\\'; break;
      case EOF:  goto  goteof;
      }
      t_token += ch;
    }
  goteof:
    if ( ch == EOF )
      savech = EOF;

    return ( T_STRING );
  }

  // getcharacter - get a character constant
  int
    scanner::getcharacter ()
  {
    t_value = literalch ();
    t_token.clear ();
    t_token += (char) int ( t_value );

    if ( getch ()  != '\'' )
      throw parse_error ( comp, "Expecting a closing single quote" );

    return ( T_NUMBER );
  }

  // literalch - get a character from a literal string
  int
    scanner::literalch ()
  {
    int ch;
    if ( ( ch = getch () ) == '\\' )
      switch ( ch = getch () )
      {
      case 'a':  ch = '\a'; break;
      case 'b':  ch = '\b'; break;
      case 'f':  ch = '\f'; break;
      case 'n':  ch = '\n'; break;
      case 'r':  ch = '\r'; break;
      case 't':  ch = '\t'; break;
      case 'v':  ch = '\v'; break;
      case '"':  ch = '"';  break;
      case '\\': ch = '\\'; break;
      case 'x':  ch = getxch (); break;
      case EOF:  ch = '\\'; savech = EOF; break;
      }

    return ( ch );
  }

  // getid - get an identifier
  int
    scanner::getid ( int ch )
  {
    int i;

    // get the identifier
    t_token.clear (); t_token += ch;

    while ( (ch = getch () ) != EOF && isidchar ( ch ) )
      t_token += ch;
    savech = ch;

    // check to see if it is a keyword
    for ( i = 0; ktab [ i ].kt_keyword != NULL; ++i )
      if ( strcmp ( ktab [ i ].kt_keyword, t_token ) == 0 )
        return ( ktab [ i ].kt_token );

    return ( T_IDENTIFIER );
  }

  bool
    is_num_char ( int ch, bool& dp, bool& dc )
  {
    if ( isdigit ( ch ) )
      return true;

    if ( !dp && ch == '.' )
    {
      dp = true;
      return true;
    }

    if ( !dc && ( (ch == 'd')|| ( ch == 'D')|| ( ch == 'e')|| ( ch == 'E') ) )
    {
      dc = true;
      return true;
    }

    return false;
  }

  // getnumber - get a number
  int
    scanner::getnumber ( int ch )
  {
    char *pp;
    bool dp = false, dc = false;

    // get the number
    t_token.clear ();
    t_token += ( char ) ch;
    ch = getch ();
    if ( t_token [ 0 ] == '0' && ( ch == 'x' || ch == 'X') )
    {
      t_token.clear ();
      while ( (ch = getch () ) != EOF && isxdigit ( ch ) )
        t_token += ch;
      t_value = (int) strtoul ( t_token, &pp, 16 );
      if ( *pp != '\0')
        goto error;
    }
    else if ( is_num_char ( ch, dp, dc ) )
    {
      t_token += ch;
      while ( ( ch = getch () ) != EOF && is_num_char ( ch, dp, dc ) )
        t_token += ch;

      if ( dp || dc )
        t_value = strtod ( t_token, &pp );
      else
        t_value = strtol ( t_token, &pp, 10 );

      if ( *pp != '\0')
        goto error;
    }
    else
    {
      t_value = long ( t_token [ 0 ] - '0');
    }
    savech = ch;
    return ( T_NUMBER );
  error:
    throw parse_error ( comp, "Bad number constant '%s'",
                        (const char *) t_token );
    return ( T_NUMBER );
  }

  // skipspaces - skip leading spaces
  int
    scanner::skipspaces ()
  {
    int ch;
    while ( ( ch = getch () ) != '\0' && isspace ( ch ) );

    return ( ch );
  }

  // isidchar - is this an identifier character
  int
    scanner::isidchar ( int ch )
  {
    return ( isupper ( ch ) ||
             islower ( ch ) ||
             isdigit ( ch ) ||
             ch == '_'
           );
  }

  // getch - get the next character
  int
    scanner::getch ()
  {
    int ch;

    // check for a lookahead character
    if ( ( ch = savech ) != '\0' )
      savech = '\0';
    // check for a buffered character
    else
    {
      while ( ( ch = *lptr++ ) == '\0' )
      {
        /* check for being at the end of file */
        if ( lastch == EOF )
          return ( EOF );

        /* read the next line */
        lptr = line;

        char c;
        while ( true )
        {
          if ( !input->get ( c ) )
          {
            lastch = EOF;
            break;
          }
          if ( ( lastch = c ) == '\n' )
            break;
          *lptr++ = lastch;
        }

        *lptr++ = '\n'; *lptr = '\0';
        lptr = line;
        ++lnum;
      }
    }

    // return the current character
    return ( ch );
  }

  // parse_error - error class
  parse_error::parse_error ( compiler *c, const char *fmt, ... )
  {
    char buffer [ 2049 ];
    va_list args;
    va_start ( args, fmt );
    int len = _vsnprintf ( buffer, 2048, fmt, args );
    va_end ( args );
    buffer [ 2048 ] = 0;

    description = buffer;
    line_no = c->scan.lnum;
    position = c->scan.lptr - c->scan.line;
    file_name = c->file_name;
    line_buf = c->scan.line;
  }

  string parse_error::report ()
  {
    string out; out.printf ( "%s ( %d ) :parse error:%s\n",
                             (const char *) file_name,
                             line_no,
                             (const char *) description
                           );
    return out;
  }

  string
    parse_error::full_report ()
  {
    string out = report ();
    out += line_buf;
    for ( int i = 0; i < ( (int) position - 1 ); ++i )
      out += ( line_buf [ i ] == '\t' ) ? '\t' : ' ';
    out += '^'; out += '\n';
    return out;
  }

#endif //COMPILER

};

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91麻豆精品国产91久久久久| 成人av在线播放网址| 欧美亚洲综合网| 一区二区三区高清不卡| 欧美体内she精视频| 亚洲国产日韩av| 777a∨成人精品桃花网| 麻豆成人久久精品二区三区小说| 日韩你懂的在线观看| 韩国av一区二区| 国产精品亲子伦对白| 欧美中文字幕一二三区视频| 日韩中文字幕不卡| 2020国产精品自拍| 粉嫩av亚洲一区二区图片| 亚洲精品视频自拍| 欧美美女一区二区三区| 韩国精品久久久| 亚洲欧美日韩在线| 日韩欧美一级精品久久| 国产成人免费视频一区| 一区二区三区日本| 欧美tickling挠脚心丨vk| 成人av在线资源网| 三级一区在线视频先锋| 久久精品一区八戒影视| 精品污污网站免费看| 国产在线视频一区二区| 樱花影视一区二区| 日韩欧美一级二级| 色偷偷久久一区二区三区| 激情综合网av| 亚洲一区在线观看免费观看电影高清| 精品裸体舞一区二区三区| 菠萝蜜视频在线观看一区| 日韩av中文字幕一区二区三区| 久久蜜桃av一区二区天堂 | 男男成人高潮片免费网站| 国产视频一区二区在线| 欧美日韩日日夜夜| 不卡一卡二卡三乱码免费网站| 日韩精品午夜视频| 亚洲欧美另类图片小说| 久久久久久亚洲综合| 欧美日韩不卡在线| 91丝袜呻吟高潮美腿白嫩在线观看| 热久久一区二区| 亚洲精品视频一区| 久久精品亚洲乱码伦伦中文| 制服丝袜av成人在线看| 91同城在线观看| 色丁香久综合在线久综合在线观看| 男女性色大片免费观看一区二区| 亚洲男人的天堂一区二区| 国产日韩成人精品| 久久久久久亚洲综合影院红桃| 欧美日韩色一区| 97国产精品videossex| 国产大陆a不卡| 激情图片小说一区| 奇米777欧美一区二区| 亚洲成人在线免费| 亚洲一区国产视频| 一区二区不卡在线视频 午夜欧美不卡在| 精品国产凹凸成av人网站| 91麻豆精品国产自产在线观看一区 | 欧美日韩精品福利| 色哟哟国产精品免费观看| 成人免费看的视频| 丁香婷婷综合激情五月色| 国产精品18久久久久久久久| 美女www一区二区| 日本在线观看不卡视频| 天堂久久一区二区三区| 亚洲成人免费视| 婷婷成人综合网| 日韩精彩视频在线观看| 天堂成人免费av电影一区| 亚洲国产成人av好男人在线观看| 一区二区三区小说| 亚洲午夜久久久久中文字幕久| 亚洲精品乱码久久久久| 亚洲午夜精品在线| 日日夜夜免费精品| 日本免费在线视频不卡一不卡二 | 欧美视频一区二区三区在线观看| 91视视频在线观看入口直接观看www | 国产欧美一区视频| 国产精品日日摸夜夜摸av| 国产精品美女一区二区| 亚洲激情在线激情| 亚洲香肠在线观看| 麻豆精品一区二区av白丝在线| 麻豆免费看一区二区三区| 精品一区二区三区久久久| 国产剧情一区二区| 99re视频精品| 777久久久精品| 2021国产精品久久精品 | 亚洲视频在线观看一区| 日韩毛片视频在线看| 亚洲国产精品自拍| 久久综合综合久久综合| 大陆成人av片| 色av综合在线| 精品毛片乱码1区2区3区| 中文字幕av一区 二区| 亚洲欧美一区二区三区孕妇| 亚洲电影在线播放| 国产一区二区三区免费看| 成人黄色小视频在线观看| 欧美视频在线一区二区三区 | 久久精品99久久久| 成人免费福利片| 欧美久久婷婷综合色| 欧美成人猛片aaaaaaa| 国产精品久久久久aaaa| 丝袜美腿成人在线| 国产成人av影院| 欧美日韩亚洲综合在线| 国产欧美一区二区三区在线老狼| 亚洲精品伦理在线| 激情av综合网| 欧美中文字幕亚洲一区二区va在线| 精品久久久久一区二区国产| 亚洲欧美偷拍三级| 国产精品影视网| 欧美日韩三级在线| 国产精品第一页第二页第三页| 午夜电影网一区| 97国产一区二区| 久久精品一区二区三区不卡 | 五月天一区二区三区| 成人教育av在线| 欧美一区二区三区公司| 亚洲美女偷拍久久| 成人在线视频一区| 日韩美女天天操| 亚洲国产va精品久久久不卡综合| 成人视屏免费看| 欧美v国产在线一区二区三区| 亚洲一区在线观看视频| av高清久久久| 欧美经典一区二区三区| 精品一区二区三区免费视频| 欧美日韩久久一区| 亚洲天堂精品在线观看| 成人性生交大片免费看视频在线| 欧美美女视频在线观看| 一区二区国产视频| 99综合电影在线视频| 久久久精品tv| 精品一区二区免费| 69堂成人精品免费视频| 午夜电影一区二区三区| 在线免费视频一区二区| 亚洲精品视频在线观看免费| 成人av高清在线| 国产精品乱码人人做人人爱| 激情文学综合网| 久久影院视频免费| 激情综合一区二区三区| 欧美精品一区视频| 国产一区 二区 三区一级| 久久综合狠狠综合久久激情| 精品一区二区精品| 久久色中文字幕| 国产一区二区三区在线看麻豆| 亚洲精品一区二区三区在线观看 | 欧美大片顶级少妇| 美女一区二区三区在线观看| 欧美老女人在线| 午夜精品久久久久久| 欧美一级高清片在线观看| 青娱乐精品在线视频| 欧美成人精品高清在线播放| 精彩视频一区二区三区| 国产亚洲人成网站| 国产91精品在线观看| 中文字幕欧美一区| 日本韩国欧美一区| 日韩国产在线观看一区| 日韩欧美激情在线| 欧洲国内综合视频| 香蕉成人伊视频在线观看| 91麻豆精品国产91久久久使用方法| 欧美aⅴ一区二区三区视频| 久久亚洲欧美国产精品乐播 | 成人激情电影免费在线观看| 最新欧美精品一区二区三区| 在线免费不卡视频| 日韩成人免费电影| 久久久青草青青国产亚洲免观| a在线欧美一区| 亚洲国产成人精品视频| 精品国产免费一区二区三区四区 | 日韩女优制服丝袜电影| 成人短视频下载| 亚洲一区二区三区爽爽爽爽爽| 欧美丰满美乳xxx高潮www|