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

📄 rpp.h

📁 qt-x11-opensource-src-4.1.4.tar.gz源码
💻 H
📖 第 1 页 / 共 2 页
字号:
};struct Expression: public Item{    enum Operator    {        LtEqOp = 300,        GtEqOp,        LtOp,        GtOp,        EqOp,        NotEqOp,        OrOp,        AndOp,        LShiftOp,        RShiftOp    };    inline Expression(Item *parent = 0)        : m_parent(parent) {}    inline Expression *parentExpression() const    { return m_parent ? m_parent->toExpression() : 0; }    virtual Item *parent() const    { return m_parent; }    virtual Expression *toExpression() const    { return const_cast<Expression *>(this); }    virtual UnaryExpression *toUnaryExpression() const    { return 0; }    virtual BinaryExpression *toBinaryExpression() const    { return 0; }    virtual StringLiteral *toStringLiteral() const    { return 0; }    virtual IntLiteral *toIntLiteral() const    { return 0; }    virtual MacroReference *toMacroReference() const    { return 0; }    virtual MacroFunctionReference *toMacroFunctionReference() const    { return 0; }    virtual ConditionalExpression *toConditionalExpression() const    { return 0; }    int evaluate(bool *ok = 0);private:    Item *m_parent;};struct StringLiteral: public Expression{    inline StringLiteral(const QByteArray &value, Item *parent)        : Expression(parent), m_value(value) {}    QByteArray value() const    { return m_value; }    virtual StringLiteral *toStringLiteral() const    { return const_cast<StringLiteral *>(this); }private:    QByteArray m_value;};struct IntLiteral: public Expression{    inline IntLiteral(int value, Item *parent = 0)        : Expression(parent), m_value(value) {}    inline int value() const    { return m_value; }    virtual IntLiteral *toIntLiteral() const    { return const_cast<IntLiteral *>(this); }private:    int m_value;};struct MacroReference: public Expression{    enum Type {        DefinedRef,    //#if defined(foo)        ValueRef    };    inline MacroReference(const TokenEngine::TokenList &name, Type type, Item *parent = 0)        : Expression(parent), m_type(type), m_name(name) {}    virtual MacroReference *toMacroReference() const    { return const_cast<MacroReference *>(this); }    inline TokenEngine::TokenList name() const    { return m_name; }    inline void setName(const TokenEngine::TokenList &name)    { m_name = name; }    inline int type() const    { return m_type; }private:    int m_type;    TokenEngine::TokenList m_name;};struct MacroFunctionReference: public Expression{    MacroFunctionReference(const QByteArray &name, Item *parent);    inline QByteArray name() const    { return m_name; }    inline void setName(const QByteArray &name)    { m_name = name; }    inline MacroArguments *arguments() const    { return m_arguments; }    virtual MacroFunctionReference *toMacroFunctionReference() const    { return const_cast<MacroFunctionReference *>(this); }private:    QByteArray m_name;    MacroArguments *m_arguments;};struct UnaryExpression: public Expression{     inline UnaryExpression(int op, Expression *e, Expression *parent = 0)        : Expression(parent), m_op(op), m_expression(e) {}    inline int op() const    { return m_op; }    inline Expression *expression() const    { return m_expression; }    virtual UnaryExpression *toUnaryExpression() const    { return const_cast<UnaryExpression *>(this); }private:    int m_op;    Expression *m_expression;};struct BinaryExpression: public Expression{   inline BinaryExpression(int op, Expression *left, Expression *right, Expression *parent = 0)        : Expression(parent),          m_op(op),          m_leftExpression(left),          m_rightExpression(right) {}    inline int op() const    { return m_op; }    inline Expression *leftExpression() const    { return m_leftExpression; }    inline Expression *rightExpression() const    { return m_rightExpression; }    virtual BinaryExpression *toBinaryExpression() const    { return const_cast<BinaryExpression *>(this); }private:    int m_op;    Expression *m_leftExpression;    Expression *m_rightExpression;};struct ConditionalExpression: public Expression{    inline ConditionalExpression(Expression *condition, Expression *left, Expression *right, Expression *parent = 0)        : Expression(parent),          m_condition(condition),          m_leftExpression(left),          m_rightExpression(right) {}    inline Expression *condition() const    { return m_condition; }    inline Expression *leftExpression() const    { return m_leftExpression; }    inline Expression *rightExpression() const    { return m_rightExpression; }    virtual ConditionalExpression *toConditionalExpression() const    { return const_cast<ConditionalExpression *>(this); }private:    Expression *m_condition;    Expression *m_leftExpression;    Expression *m_rightExpression;};struct IfLikeDirective: public ConditionalDirective{    inline IfLikeDirective(Item *parent = 0)        :ConditionalDirective(parent), m_expression(0) {}    void setExpression(Expression *expression)    { m_expression  = expression; }    Expression *expression() const    { return m_expression; }protected:    Expression *m_expression;};struct IfDirective: public IfLikeDirective{    inline IfDirective(Item *parent = 0)        :IfLikeDirective(parent) {}    virtual IfDirective *toIfDirective() const    { return const_cast<IfDirective *>(this); }};struct ElifDirective: public IfLikeDirective{    inline ElifDirective(Item *parent = 0)    :IfLikeDirective(parent) {}    virtual ElifDirective *toElifDirective() const    { return const_cast<ElifDirective *>(this); }};struct IfdefLikeDirective: public ConditionalDirective{    inline IfdefLikeDirective(Item *parent = 0)    :ConditionalDirective(parent) {}    inline TokenEngine::TokenList identifier() const    { return m_identifier; }    inline void setIdentifier(const TokenEngine::TokenList &identifier)    { m_identifier = identifier; }protected:    TokenEngine::TokenList m_identifier;};struct IfdefDirective: public IfdefLikeDirective{    IfdefDirective(Item *parent)    :IfdefLikeDirective(parent) {}    virtual IfdefDirective *toIfdefDirective() const    { return const_cast<IfdefDirective *>(this); }};struct IfndefDirective: public IfdefLikeDirective{    inline IfndefDirective(Item *parent)    :IfdefLikeDirective(parent) {}    virtual IfndefDirective *toIfndefDirective() const    { return const_cast<IfndefDirective *>(this); }};struct ElseDirective: public ConditionalDirective{    ElseDirective(Item *parent)    :ConditionalDirective(parent) {}    virtual ElseDirective *toElseDirective() const    { return const_cast<ElseDirective *>(this); }};struct EndifDirective : public Directive{    EndifDirective(Item *parent)    :Directive(parent) {}    EndifDirective *toEndifDirective() const    { return const_cast<EndifDirective *>(this); }};struct DefineDirective: public Directive{    DefineDirective(Item *parent)    : Directive(parent) {};    inline TokenEngine::TokenList identifier() const    { return m_identifier; }    inline void setIdentifier(TokenEngine::TokenList identifier)    { m_identifier = identifier; }    inline void setReplacementList(TokenEngine::TokenList replacementList)    { m_replacementList = replacementList; }    inline TokenEngine::TokenList replacementList() const    { return m_replacementList; }    virtual DefineDirective *toDefineDirective() const    { return const_cast<DefineDirective *>(this); }    virtual MacroDefinition *toMacroDefinition() const    { return 0; }    virtual MacroFunctionDefinition *toMacroFunctionDefinition() const    { return 0; }private:    TokenEngine::TokenList m_identifier;    TokenEngine::TokenList m_replacementList;};struct MacroDefinition: public DefineDirective{    MacroDefinition(Item *parent)    : DefineDirective(parent) {};    virtual MacroDefinition *toMacroDefinition() const    { return const_cast<MacroDefinition *>(this); }};struct MacroFunctionDefinition: public DefineDirective{    MacroFunctionDefinition(Item *parent)    : DefineDirective(parent) {}    virtual MacroFunctionDefinition *toMacroFunctionDefinition() const    { return const_cast<MacroFunctionDefinition *>(this); }    void setParameters(TokenEngine::TokenList macroParameters)    { m_parameters = macroParameters;}    inline TokenEngine::TokenList parameters() const    { return m_parameters; }private:    TokenEngine::TokenList m_parameters;};struct MacroParameter: public Item{    inline MacroParameter(Item *parent)        : m_parent(parent) {}    inline QByteArray name() const    { return m_name; }    inline void setName(const QByteArray &name)    { m_name = name; }    virtual Item *parent() const    { return m_parent; }private:    Item *m_parent;    QByteArray m_name;};struct MacroParameters: public Item, public ItemComposite{    MacroParameters(MacroFunctionDefinition *parent)        : m_parent(parent) {}    ItemComposite *toItemComposite() const    { return const_cast<MacroParameters *>(this); }    virtual Item *parent() const    { return m_parent; }    virtual int count() const    { return m_items.count(); }    virtual Item *item(int index) const    { return m_items.at(index); }    void addParameter(MacroParameter *param)    { Q_ASSERT(param->parent() == this); m_items.append(param); }    int indexOf(const QByteArray &param) const    {        for (int i=0; i<m_items.count(); ++i) {         //   cout <<"checking |" << param.constData() << "| against |" << m_items.at(i)->name().constData() <<"|" << endl;            if (m_items.at(i)->name() == param)                return i;        }        return -1;    }    inline bool contains(const QByteArray &param) const    { return indexOf(param) != -1; }/*    void add(const QByteArray &param)    {        MacroParameter *p = createNode<MacroParameter>(this);        p->setName(param);        addParameter(p);    }*/private:    MacroFunctionDefinition *m_parent;    QVector<MacroParameter*> m_items;};struct UndefDirective: public Directive{    UndefDirective(Item *parent)    :Directive(parent) {}    inline TokenEngine::TokenList identifier() const    { return m_identifier; }    inline void setIdentifier(const TokenEngine::TokenList &identifier)    { m_identifier = identifier; }    virtual UndefDirective *toUndefDirective() const    { return const_cast<UndefDirective *>(this); }private:    TokenEngine::TokenList m_identifier;};struct LineDirective: public Directive{    LineDirective(Item *parent)    :Directive(parent) {}    virtual LineDirective *toLineDirective() const    { return const_cast<LineDirective *>(this); }};struct NonDirective: public Directive{    NonDirective(Item *parent)    :Directive(parent) {}    virtual NonDirective *toNonDirective() const    { return const_cast<NonDirective *>(this); }};class Preprocessor : public QObject{Q_OBJECTpublic:    Preprocessor();    Source *parse(const TokenEngine::TokenContainer &tokenContainer,                  const QVector<Type> &tokenTypeList, TypedPool<Item> *memoryPool);signals:    void error(const QString type, const QString message);private:    bool parseGroup(Item *node);    bool parseGroupPart(Item *node);    bool parseIfSection(Item *node);    bool parseNonDirective(Item *node);    bool parseTextLine(Item *node);    bool parseIfGroup(IfSection *node);    bool parseElifGroups(IfSection *node);    bool parseElifGroup(IfSection *node);    bool parseElseGroup(IfSection *node);    bool parseEndifLine(IfSection *node);    bool parseIfdefLikeDirective(IfdefLikeDirective *node);    bool parseIfLikeDirective(IfLikeDirective *node);    bool parseDefineDirective(Item *node);    bool parseUndefDirective(Item *node);    bool parseIncludeDirective(Item *node);    bool parseErrorDirective(Item *node);    bool parsePragmaDirective(Item*node);    TokenEngine::TokenSection readLine();    inline bool isValidIndex(const int index) const;    inline bool isWhiteSpace(const int index) const;    Type lookAhead() const;    Type lookAheadSkipHash() const;    inline int skipWhiteSpaceAndComments() const;    inline int skipWhiteSpaceCommentsHash() const;    QVector<int> cleanEscapedNewLines(const TokenEngine::TokenSection &tokenSection) const;    QVector<int> cleanTokenRange(const TokenEngine::TokenSection &tokenSection) const;    Source *m_source;    TokenEngine::TokenContainer m_tokenContainer;    QVector<Type> m_tokenTypeList;    TypedPool<Item> *m_memoryPool;    int lexerTokenIndex;    int numTokens;};/*    T must be a subclass of Item, parent must implment    the ItemComposite interface*/template <typename T>T *createNode(TypedPool<Item> *memPool, Item *parent){    Q_ASSERT(parent);    T* node = new (memPool->allocate(sizeof(T))) T(parent);    Q_ASSERT(node);    return node;}template <typename T>T *createNode(TypedPool<Item> *memPool){    T* node = new (memPool->allocate(sizeof(T))) T(0);    Q_ASSERT(node);    return node;}QByteArray visitGetText(Item *item);} // namespace Rpp#endif

⌨️ 快捷键说明

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