X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/c2c9f509581b8c8e78b5745498c782ef1affd51a..26ef7a82c9367b813682af1bea19e8e788efed64:/Parser.hpp diff --git a/Parser.hpp b/Parser.hpp index ebcbb7f..24b3564 100644 --- a/Parser.hpp +++ b/Parser.hpp @@ -19,8 +19,8 @@ **/ /* }}} */ -#ifndef CYPARSER_HPP -#define CYPARSER_HPP +#ifndef CYCRIPT_PARSER_HPP +#define CYCRIPT_PARSER_HPP #include @@ -33,33 +33,13 @@ #include #include "location.hh" + +#include "List.hpp" #include "Pooling.hpp" #include "Options.hpp" class CYContext; -template -struct CYNext { - Type_ *next_; - - CYNext() : - next_(NULL) - { - } - - CYNext(Type_ *next) : - next_(next) - { - } - - void SetNext(Type_ *next) { - next_ = next; - } -}; - -#define CYForEach(value, list) \ - for (__typeof__(*list) *value(list); value != NULL; value = value->next_) - struct CYThing { virtual ~CYThing() { } @@ -137,6 +117,34 @@ enum CYFlags { CYNoBF = (CYNoBrace | CYNoFunction), }; +_finline CYFlags operator ~(CYFlags rhs) { + return static_cast(~static_cast(rhs)); +} + +_finline CYFlags operator &(CYFlags lhs, CYFlags rhs) { + return static_cast(static_cast(lhs) & static_cast(rhs)); +} + +_finline CYFlags operator |(CYFlags lhs, CYFlags rhs) { + return static_cast(static_cast(lhs) | static_cast(rhs)); +} + +_finline CYFlags &operator |=(CYFlags &lhs, CYFlags rhs) { + return lhs = lhs | rhs; +} + +_finline CYFlags CYLeft(CYFlags flags) { + return flags & ~(CYNoDangle | CYNoInteger); +} + +_finline CYFlags CYRight(CYFlags flags) { + return flags & ~CYNoBF; +} + +_finline CYFlags CYCenter(CYFlags flags) { + return CYLeft(CYRight(flags)); +} + struct CYStatement : CYNext { @@ -323,6 +331,7 @@ struct CYScope { CYIdentifierValueSet identifiers_; CYScope(CYScopeType type, CYContext &context, CYStatement *&statements); + virtual ~CYScope(); void Close(); @@ -374,7 +383,7 @@ struct CYContext { void ReplaceAll(Type_ *&values) { Type_ **last(&values); CYForEach (next, values) { - Replace(*last); + Replace(*last = next); last = &(*last)->next_; } } @@ -426,10 +435,7 @@ struct CYBlock : } void AddPrev(CYStatement *statement) { - CYStatement *last(statement); - while (last->next_ != NULL) - last = last->next_; - last->SetNext(statements_); + CYSetLast(statement, statements_); statements_ = statement; } @@ -614,10 +620,7 @@ struct CYCompound : } void AddPrev(CYExpression *expression) { - CYExpression *last(expression); - while (last->next_ != NULL) - last = last->next_; - last->SetNext(expressions_); + CYSetLast(expression, expressions_); expressions_ = expression; } @@ -1867,4 +1870,4 @@ CYAssignment_("&=", BitwiseAnd) CYAssignment_("^=", BitwiseXOr) CYAssignment_("|=", BitwiseOr) -#endif/*CYPARSER_HPP*/ +#endif/*CYCRIPT_PARSER_HPP*/