void ScriptEdit::TextEdit::keyPressEvent(QKeyEvent *e) { updateCursor(); switch(e->key()) { // case Qt::Key_Space: // if(!(e->modifiers() & Qt::ControlModifier)) QTextEdit::keyPressEvent(e); // else Kernel::run(document()->toPlainText()); break; case Qt::Key_Tab: insert(" "); break; case Qt::Key_ParenLeft: if(!curChar().isLetterOrNumber()) { insert("()"); moveCursor(-1); } else QTextEdit::keyPressEvent(e); break; case Qt::Key_ParenRight: if(curChar() == ')') moveCursor(1); else QTextEdit::keyPressEvent(e); break; case Qt::Key_BraceLeft: insert("{}"); moveCursor(-1); break; case Qt::Key_BraceRight: if(curChar() == '}') moveCursor(1); else QTextEdit::keyPressEvent(e); break; case Qt::Key_Return: { QString text = document()->toPlainText(), space = ""; int n = 0; for(int i = 0; i < pos(); i++) if(text.at(i) == '{') n++; else if(text.at(i) == '}') n--; space.fill(' ', 4*n); if(prevChar() == '{') { insert("\n" + space); if(curChar() == '}') { insert("\n" + space.left(space.length()-4)); moveCursor(3-4*n); } break; } else if(curChar() == '}') { insert("\n" + space.left(space.length()-4)); break; } else { insert("\n" + space); break; } QTextEdit::keyPressEvent(e); break; } default: QTextEdit::keyPressEvent(e); } }
Token Lexer::parseNext() { //skip whitespace of the current character skipWhitespace(); //return eof if we are at the end if (curChar() == '\0') { return Token::Eof; } Token ret; //first check if it is a keyword and return it ret = parseKeyword(); if (ret != Token::None) return ret; ret = parseSymbol(); if (ret != Token::None) return ret; ret = parseIdentifier(); if (ret != Token::None) return ret; ret = parseNumeric(); if (ret != Token::None) return ret; //if nothing was able to parse it, it must be a character and we return it value.character = eatChar(); return Token::Character; }
Token Lexer::parseIdentifier() { //identifiers can only start with alphabetic characters, or underscores if (!(isalpha(curChar()) || curChar() == '_')) return Token::None; value.string.clear(); do { if (isalnum(curChar()) || curChar() == '_') value.string += eatChar(); else { return Token::Identifier; } } while (true); }
wchar_t nextChar(bool allow_change = true){ if(positions.size()>1) positions.back()++; auto tmp = curChar(allow_change); if(tmp == L'\n') lines.back()++; return tmp; }
wchar_t curChar(bool allow_change = true){ if(eof()) return '\0'; if(eos() && allow_change){ pop(); return curChar(); }else if(eos()) return '\0'; return data.back()[positions.back()]; }
Token Lexer::parseNumeric() { bool dotFound = false; //first check if we are parsing a number if (!(isdigit(curChar()) || curChar() == '.')) { return Token::None; } value.string.clear(); do { if (isdigit(curChar())) { value.string += eatChar(); } else if (!dotFound && curChar() == '.') { dotFound = true; value.string += eatChar(); } else { return Token::Numeric; } } while (true); }
Token recognizeToken(bool allow_change = true){ if(eof()) return Token::END; wchar_t wc = curChar(allow_change); if(is_dig(wc)) return Token::NUM; if(is_letter(wc)) return Token::IDENTIFER; if(wc == L'\"') return Token::STRING; if(wc == L'\'') return Token::CHAR; if(wc == L'\0') return Token::NONE; return Token::OPERATOR; }
// ----------------------------------------------------------------------------- // SdpUtil::GetElementsFromLineL // Gets all the elements from a single line // ----------------------------------------------------------------------------- // RArray<TPtrC8> SdpUtil::GetElementsFromLineL( TLex8& aLexer, TChar aDelimiter, TInt aErrCode ) { RArray<TPtrC8> lineArray; CleanupClosePushL( lineArray ); // Header is special case, because it is joined _without_ // space character with the first attribute, so it must be // parsed separately aLexer.Mark(); // curChar must be != KEqualChar at first comparison for ( TChar curChar( KSPChar ); curChar != KEqualChar; ) { curChar = aLexer.Peek(); // Syntax check if ( curChar == KEofChar || curChar == KLFChar || curChar == KCRChar ) { User::Leave( aErrCode ); } aLexer.Inc(); } // Append header to array User::LeaveIfError( lineArray.Append( aLexer.MarkedToken() ) ); // Whitespace MUST NOT be used after the "=" sign if (aLexer.Peek() == KSPChar) { User::Leave( aErrCode ); } // Get the other elements from the string to the array ChopElementsFromLineL( lineArray, aLexer, aDelimiter, aErrCode ); CleanupStack::Pop(); // lineArray return lineArray; }
void Lexer::skipWhitespace() { while (isspace(curChar())) { nextChar(); } }
char Lexer::eatChar() { char c = curChar(); nextChar(); return c; }