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

📄 rppexpressionbuilder.cpp

📁 qt-x11-opensource-src-4.1.4.tar.gz源码
💻 CPP
字号:
/******************************************************************************** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved.**** This file is part of the qt3to4 porting application of the Qt Toolkit.**** This file may be used under the terms of the GNU General Public** License version 2.0 as published by the Free Software Foundation** and appearing in the file LICENSE.GPL included in the packaging of** this file.  Please review the following information to ensure GNU** General Public Licensing requirements will be met:** http://www.trolltech.com/products/qt/opensource.html**** If you are unsure which license is appropriate for your use, please** review the following information:** http://www.trolltech.com/products/qt/licensing.html or contact the** sales department at sales@trolltech.com.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#include "rppexpressionbuilder.h"#include "tokens.h"#include "rpp.h"using namespace TokenEngine;namespace Rpp {ExpressionBuilder::ExpressionBuilder(const TokenList &tokenList, const QVector<Type> &typeList, TypedPool<Item> *memoryPool):i(0),m_tokenList(tokenList),m_typeList(typeList),m_memoryPool(memoryPool){}Rpp::Expression *ExpressionBuilder::parse(){    if(unary_expression_lookup())        return conditional_expression();    else        return createIntLiteral(0);}Type ExpressionBuilder::next(){    if(!hasNext())        return Token_eof;    return typeAt(i++);}inline bool ExpressionBuilder::test(int token){    if (i < m_tokenList.count() && typeAt(i) == token) {        ++i;        return true;    }    return false;}inline bool ExpressionBuilder::moreTokens(int delta){    return (i + delta < m_tokenList.count());}inline Type ExpressionBuilder::lookup(int k){    const int l = i - 1 + k;    return l < m_tokenList.count() ? typeAt(l) : Token_eof;}Expression *ExpressionBuilder::conditional_expression(){    Expression *value = logical_OR_expression();    if (test('?')) {        Expression *leftExpression = conditional_expression();        Expression *rightExpression;        if(test(':'))            rightExpression = conditional_expression();        else            rightExpression = createIntLiteral(0);        return createConditionalExpression(value, leftExpression, rightExpression);    }    return value;}Expression *ExpressionBuilder::logical_OR_expression(){    Expression *value = logical_AND_expression();    if (test(Token_or))        return createBinaryExpression(Expression::OrOp, value, logical_OR_expression());    return value;}Expression *ExpressionBuilder::logical_AND_expression(){    Expression *value = inclusive_OR_expression();    if (test(Token_and))        return createBinaryExpression(Expression::AndOp, value, logical_AND_expression());    return value;}Expression *ExpressionBuilder::inclusive_OR_expression(){    Expression *value = exclusive_OR_expression();    if (test('|'))        return createBinaryExpression('|', value, inclusive_OR_expression());    return value;}Expression *ExpressionBuilder::exclusive_OR_expression(){    Expression *value = AND_expression();    if (test('^'))        return createBinaryExpression('^', value, exclusive_OR_expression());    return value;}Expression *ExpressionBuilder::AND_expression(){    Expression *value = equality_expression();    if (test('&'))        return createBinaryExpression('&', value, AND_expression());    return value;}Expression *ExpressionBuilder::equality_expression(){    Expression *value = relational_expression();    switch (next()) {    case Token_eq:        return createBinaryExpression(Expression::EqOp, value, equality_expression());    case Token_not_eq:        return createBinaryExpression(Expression::NotEqOp, value, equality_expression());    default:        prev();        return value;    }}Expression *ExpressionBuilder::relational_expression(){    Expression *value = shift_expression();    switch (next()) {    case '<':        return createBinaryExpression('<', value, relational_expression());    case '>':        return createBinaryExpression('>', value, relational_expression());    case Token_leq:        return createBinaryExpression(Expression::LtEqOp, value, relational_expression());    case Token_geq:        return createBinaryExpression(Expression::GtEqOp, value, relational_expression());    default:        prev();        return value;    }}Expression *ExpressionBuilder::shift_expression(){    Expression *value = additive_expression();    switch (next()) {    case Token_left_shift:        return createBinaryExpression(Expression::LShiftOp, value, shift_expression());    case Token_right_shift:        return createBinaryExpression(Expression::RShiftOp, value, shift_expression());    default:        prev();        return value;    }}Expression *ExpressionBuilder::additive_expression(){    Expression *value = multiplicative_expression();    switch (next()) {    case '+':        return createBinaryExpression('+', value, additive_expression());    case '-':        return createBinaryExpression('-', value, additive_expression());    default:        prev();        return value;    }}Expression *ExpressionBuilder::multiplicative_expression(){    Expression *value = unary_expression();    switch (next()) {    case '*':        return createBinaryExpression('*', value, multiplicative_expression());    case '%':        return createBinaryExpression('%', value, multiplicative_expression());    case '/':        return createBinaryExpression('/', value, multiplicative_expression());    default:        prev();        return value;    };}Expression *ExpressionBuilder::unary_expression(){    switch (next()) {    case '+':        return createUnaryExpression('+', unary_expression());    case '-':        return createUnaryExpression('-',  unary_expression());    case '!':        return createUnaryExpression('!',  unary_expression());    case '~':        return createUnaryExpression('~', unary_expression());    case Token_defined:    {        int identifierIndex  = 0;        if (test(Token_identifier)) {            identifierIndex = i - 1;        } else if (test('(')) {            if (test(Token_identifier))                identifierIndex = i -1;            test(')');        }        return createMacroReference(MacroReference::DefinedRef, createTokenList(identifierIndex));    }    default:        prev();        return primary_expression();    }}bool ExpressionBuilder::unary_expression_lookup(){    Type t = lookup();    return (primary_expression_lookup()            || t == '+'            || t == '-'            || t == '!'            || t == '~'            || t == Token_defined);}Expression *ExpressionBuilder::primary_expression(){    Expression *value;    if (test('(')) {        if (moreTokens(1))            value = conditional_expression();        else            value = createIntLiteral(0); // Syntax error.        test(')');    } else {        next();        bool ok;        int val  = QString(lexem()).toInt(&ok, 0);        if(ok)            value = createIntLiteral(val);        else            value = createMacroReference(MacroReference::ValueRef, createTokenList(i -1));    }    return value;}bool ExpressionBuilder::primary_expression_lookup(){    Type t = lookup();    return (t == Token_identifier            || t == Token_number_literal/*            || t == PP_FLOATING_LITERAL*/            || t == '(');}/*    Creates a tokenList containing one token*/TokenList ExpressionBuilder::createTokenList(int tokenIndex) const{    return TokenList(m_tokenList.tokenContainer(tokenIndex),        QVector<int>() << m_tokenList.containerIndex(tokenIndex));}/*    Node cration helper functions*/UnaryExpression *ExpressionBuilder::createUnaryExpression(int op, Expression *expression){    return new (m_memoryPool->allocate(sizeof(UnaryExpression))) UnaryExpression(op, expression);}BinaryExpression *ExpressionBuilder::createBinaryExpression(int op, Expression *leftExpresson, Expression *rightExpression){    return new (m_memoryPool->allocate(sizeof(BinaryExpression))) BinaryExpression(op, leftExpresson, rightExpression);}ConditionalExpression *ExpressionBuilder::createConditionalExpression(Expression *condition, Expression *leftExpression, Expression *rightExpression){    return new (m_memoryPool->allocate(sizeof(ConditionalExpression))) ConditionalExpression(condition, leftExpression, rightExpression);}MacroReference *ExpressionBuilder::createMacroReference(MacroReference::Type type, TokenEngine::TokenList token){    return new (m_memoryPool->allocate(sizeof(MacroReference))) MacroReference(token, type);}IntLiteral *ExpressionBuilder::createIntLiteral(const int arg){    return new (m_memoryPool->allocate(sizeof(IntLiteral))) IntLiteral(arg);}}

⌨️ 快捷键说明

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