示例#1
0
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);
    }
}
示例#2
0
文件: lexer.cpp 项目: citiral/Ola
    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;
    }
示例#3
0
文件: lexer.cpp 项目: citiral/Ola
    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()];
 }
示例#6
0
文件: lexer.cpp 项目: citiral/Ola
    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;

                }
示例#8
0
// -----------------------------------------------------------------------------
// 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;
    }
示例#9
0
文件: lexer.cpp 项目: citiral/Ola
 void Lexer::skipWhitespace() {
     while (isspace(curChar())) {
         nextChar();
     }
 }
示例#10
0
文件: lexer.cpp 项目: citiral/Ola
 char Lexer::eatChar() {
     char c = curChar();
     nextChar();
     return c;
 }