⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lexer.cpp

📁 将konqueror浏览器移植到ARM9 2410中
💻 CPP
📖 第 1 页 / 共 2 页
字号:
      break;    default:      assert(!"Unhandled state in switch statement");    }    // move on to the next character    if (!done)      shift(1);#ifndef KJS_PURE_ECMA    if (state != Start && state != InSingleLineComment)      bol = false;#endif  }  // no identifiers allowed directly after numeric literal, e.g. "3in" is bad  if ((state == Number || state == Octal || state == Hex)      && isIdentLetter(current))    state = Bad;  // terminate string  buffer8[pos8] = '\0';#ifdef KJS_DEBUG_LEX  fprintf(stderr, "line: %d ", lineNo());  fprintf(stderr, "yytext (%x): ", buffer8[0]);  fprintf(stderr, "%s ", buffer8);#endif  double dval = 0;  if (state == Number) {    dval = strtod(buffer8, 0L);  } else if (state == Hex) { // scan hex numbers    // TODO: support long unsigned int    unsigned int i;    sscanf(buffer8, "%x", &i);    dval = i;    state = Number;  } else if (state == Octal) {   // scan octal number    unsigned int ui;    sscanf(buffer8, "%o", &ui);    dval = ui;    state = Number;  }#ifdef KJS_DEBUG_LEX  switch (state) {  case Eof:    printf("(EOF)\n");    break;  case Other:    printf("(Other)\n");    break;  case Identifier:    printf("(Identifier)/(Keyword)\n");    break;  case String:    printf("(String)\n");    break;  case Number:    printf("(Number)\n");    break;  default:    printf("(unknown)");  }#endif  restrKeyword = false;  delimited = false;#ifdef KJS_DEBUGGER  yylloc.first_line = yylineno; // ???  yylloc.last_line = yylineno;#endif  switch (state) {  case Eof:    return 0;  case Other:    if(token == '}' || token == ';') {      delimited = true;    }    return token;  case Identifier:    if ((token = Lookup::find(&mainTable, buffer16, pos16)) < 0) {      /* TODO: close leak on parse error. same holds true for String */      kjsyylval.ustr = new UString(buffer16, pos16);      return IDENT;    }    if (token == CONTINUE || token == BREAK ||	token == RETURN || token == THROW)      restrKeyword = true;    return token;  case String:    kjsyylval.ustr = new UString(buffer16, pos16); return STRING;  case Number:    kjsyylval.dval = dval;    return NUMBER;  case Bad:    fprintf(stderr, "yylex: ERROR.\n");    return -1;  default:    assert(!"unhandled numeration value in switch");    return -1;  }}bool Lexer::isWhiteSpace() const{  return (current == ' ' || current == '\t' ||	  current == 0x0b || current == 0x0c);}bool Lexer::isLineTerminator() const{  return (current == '\n' || current == '\r');}bool Lexer::isIdentLetter(unsigned short c){  /* TODO: allow other legitimate unicode chars */  return (c >= 'a' && c <= 'z' ||	  c >= 'A' && c <= 'Z' ||	  c == '$' || c == '_');}bool Lexer::isDecimalDigit(unsigned short c){  return (c >= '0' && c <= '9');}bool Lexer::isHexDigit(unsigned short c) const{  return (c >= '0' && c <= '9' ||	  c >= 'a' && c <= 'f' ||	  c >= 'A' && c <= 'F');}bool Lexer::isOctalDigit(unsigned short c) const{  return (c >= '0' && c <= '7');}int Lexer::matchPunctuator(unsigned short c1, unsigned short c2,			      unsigned short c3, unsigned short c4){  if (c1 == '>' && c2 == '>' && c3 == '>' && c4 == '=') {    shift(4);    return URSHIFTEQUAL;  } else if (c1 == '=' && c2 == '=' && c3 == '=') {    shift(3);    return STREQ;  } else if (c1 == '!' && c2 == '=' && c3 == '=') {    shift(3);    return STRNEQ;   } else if (c1 == '>' && c2 == '>' && c3 == '>') {    shift(3);    return URSHIFT;  } else if (c1 == '<' && c2 == '<' && c3 == '=') {    shift(3);    return LSHIFTEQUAL;  } else if (c1 == '>' && c2 == '>' && c3 == '=') {    shift(3);    return RSHIFTEQUAL;  } else if (c1 == '<' && c2 == '=') {    shift(2);    return LE;  } else if (c1 == '>' && c2 == '=') {    shift(2);    return GE;  } else if (c1 == '!' && c2 == '=') {    shift(2);    return NE;  } else if (c1 == '+' && c2 == '+') {    shift(2);    if (terminator) {      // automatic semicolon insertion      stackToken = PLUSPLUS;      return AUTO;    } else      return PLUSPLUS;  } else if (c1 == '-' && c2 == '-') {    shift(2);    if (terminator) {      // automatic semicolon insertion      stackToken = MINUSMINUS;      return AUTO;    } else      return MINUSMINUS;  } else if (c1 == '=' && c2 == '=') {    shift(2);    return EQEQ;  } else if (c1 == '+' && c2 == '=') {    shift(2);    return PLUSEQUAL;  } else if (c1 == '-' && c2 == '=') {    shift(2);    return MINUSEQUAL;  } else if (c1 == '*' && c2 == '=') {    shift(2);    return MULTEQUAL;  } else if (c1 == '/' && c2 == '=') {    shift(2);    return DIVEQUAL;  } else if (c1 == '&' && c2 == '=') {    shift(2);    return ANDEQUAL;  } else if (c1 == '^' && c2 == '=') {    shift(2);    return XOREQUAL;  } else if (c1 == '%' && c2 == '=') {    shift(2);    return MODEQUAL;  } else if (c1 == '|' && c2 == '=') {    shift(2);    return OREQUAL;  } else if (c1 == '<' && c2 == '<') {    shift(2);    return LSHIFT;  } else if (c1 == '>' && c2 == '>') {    shift(2);    return RSHIFT;  } else if (c1 == '&' && c2 == '&') {    shift(2);    return AND;  } else if (c1 == '|' && c2 == '|') {    shift(2);    return OR;  }  switch(c1) {    case '=':    case '>':    case '<':    case ',':    case '!':    case '~':    case '?':    case ':':    case '.':    case '+':    case '-':    case '*':    case '/':    case '&':    case '|':    case '^':    case '%':    case '(':    case ')':    case '{':    case '}':    case '[':    case ']':    case ';':      shift(1);      return static_cast<int>(c1);    default:      return -1;  }}unsigned short Lexer::singleEscape(unsigned short c) const{  switch(c) {  case 'b':    return 0x08;  case 't':    return 0x09;  case 'n':    return 0x0A;  case 'v':    return 0x0B;  case 'f':    return 0x0C;  case 'r':    return 0x0D;  case '"':    return 0x22;  case '\'':    return 0x27;  case '\\':    return 0x5C;  default:    return c;  }}unsigned short Lexer::convertOctal(unsigned short c1, unsigned short c2,                                      unsigned short c3) const{  return ((c1 - '0') * 64 + (c2 - '0') * 8 + c3 - '0');}unsigned char Lexer::convertHex(unsigned short c){  if (c >= '0' && c <= '9')    return (c - '0');  else if (c >= 'a' && c <= 'f')    return (c - 'a' + 10);  else    return (c - 'A' + 10);}unsigned char Lexer::convertHex(unsigned short c1, unsigned short c2){  return ((convertHex(c1) << 4) + convertHex(c2));}UChar Lexer::convertUnicode(unsigned short c1, unsigned short c2,                                     unsigned short c3, unsigned short c4){  return UChar((convertHex(c1) << 4) + convertHex(c2),	       (convertHex(c3) << 4) + convertHex(c4));}void Lexer::record8(unsigned short c){  assert(c <= 0xff);  // enlarge buffer if full  if (pos8 >= size8 - 1) {    char *tmp = new char[2 * size8];    memcpy(tmp, buffer8, size8 * sizeof(char));    delete [] buffer8;    buffer8 = tmp;    size8 *= 2;  }  buffer8[pos8++] = (char) c;}void Lexer::record16(UChar c){  // enlarge buffer if full  if (pos16 >= size16 - 1) {    UChar *tmp = new UChar[2 * size16];    memcpy(tmp, buffer16, size16 * sizeof(UChar));    delete [] buffer16;    buffer16 = tmp;    size16 *= 2;  }  buffer16[pos16++] = c;}bool Lexer::scanRegExp(){  pos16 = 0;  bool lastWasEscape = false;  while (1) {    if (isLineTerminator() || current == 0)      return false;    else if (current != '/' || lastWasEscape == true)    {        record16(current);        lastWasEscape =            !lastWasEscape && (current == '\\');    }    else {      pattern = UString(buffer16, pos16);      pos16 = 0;      shift(1);      break;    }    shift(1);  }  while (isIdentLetter(current)) {    record16(current);    shift(1);  }  flags = UString(buffer16, pos16);  return true;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -