📄 rpp.h
字号:
};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 ¶m) 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 ¶m) const { return indexOf(param) != -1; }/* void add(const QByteArray ¶m) { 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 + -