1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski #ifndef _IDLC_ASTEXPRESSION_HXX_ 24*b1cdbd2cSJim Jagielski #define _IDLC_ASTEXPRESSION_HXX_ 25*b1cdbd2cSJim Jagielski 26*b1cdbd2cSJim Jagielski #include <idlc/idlc.hxx> 27*b1cdbd2cSJim Jagielski 28*b1cdbd2cSJim Jagielski // Enum to define all the different operators to combine expressions 29*b1cdbd2cSJim Jagielski enum ExprComb 30*b1cdbd2cSJim Jagielski { 31*b1cdbd2cSJim Jagielski EC_add, // '+' 32*b1cdbd2cSJim Jagielski EC_minus, // '-' 33*b1cdbd2cSJim Jagielski EC_mul, // '*' 34*b1cdbd2cSJim Jagielski EC_div, // '/' 35*b1cdbd2cSJim Jagielski EC_mod, // '%' 36*b1cdbd2cSJim Jagielski EC_or, // '|' 37*b1cdbd2cSJim Jagielski EC_xor, // '^' 38*b1cdbd2cSJim Jagielski EC_and, // '&' 39*b1cdbd2cSJim Jagielski EC_left, // '<<' 40*b1cdbd2cSJim Jagielski EC_right, // '>>' 41*b1cdbd2cSJim Jagielski EC_u_plus, // unary '+' 42*b1cdbd2cSJim Jagielski EC_u_minus, // unary '-' 43*b1cdbd2cSJim Jagielski EC_bit_neg, // '~' 44*b1cdbd2cSJim Jagielski EC_none, // No operator (missing) 45*b1cdbd2cSJim Jagielski EC_symbol // a symbol (function or constant name) 46*b1cdbd2cSJim Jagielski }; 47*b1cdbd2cSJim Jagielski 48*b1cdbd2cSJim Jagielski // Enum to define the different kinds of evaluation possible 49*b1cdbd2cSJim Jagielski enum EvalKind 50*b1cdbd2cSJim Jagielski { 51*b1cdbd2cSJim Jagielski EK_const, // Must evaluate to constant 52*b1cdbd2cSJim Jagielski EK_positive_int // Must evaluate to positive integer 53*b1cdbd2cSJim Jagielski }; 54*b1cdbd2cSJim Jagielski 55*b1cdbd2cSJim Jagielski // Enum to define expression type 56*b1cdbd2cSJim Jagielski enum ExprType 57*b1cdbd2cSJim Jagielski { 58*b1cdbd2cSJim Jagielski ET_short, // Expression value is short 59*b1cdbd2cSJim Jagielski ET_ushort, // Expression value is unsigned short 60*b1cdbd2cSJim Jagielski ET_long, // Expression value is long 61*b1cdbd2cSJim Jagielski ET_ulong, // Expression value is unsigned long 62*b1cdbd2cSJim Jagielski ET_hyper, // Expression value is hyper (64 bit) 63*b1cdbd2cSJim Jagielski ET_uhyper, // Expression value is unsigned hyper 64*b1cdbd2cSJim Jagielski ET_float, // Expression value is 32-bit float 65*b1cdbd2cSJim Jagielski ET_double, // Expression value is 64-bit float 66*b1cdbd2cSJim Jagielski ET_char, // Expression value is char 67*b1cdbd2cSJim Jagielski ET_byte, // Expression value is byte 68*b1cdbd2cSJim Jagielski ET_boolean, // Expression value is boolean 69*b1cdbd2cSJim Jagielski ET_string, // Expression value is char * 70*b1cdbd2cSJim Jagielski ET_any, // Expression value is any of above 71*b1cdbd2cSJim Jagielski ET_void, // Expression value is void (absent) 72*b1cdbd2cSJim Jagielski ET_type, // Expression value is type 73*b1cdbd2cSJim Jagielski ET_none // Expression value is missing 74*b1cdbd2cSJim Jagielski }; 75*b1cdbd2cSJim Jagielski 76*b1cdbd2cSJim Jagielski // Structure to describe value of constant expression and its type 77*b1cdbd2cSJim Jagielski struct AstExprValue 78*b1cdbd2cSJim Jagielski { 79*b1cdbd2cSJim Jagielski union 80*b1cdbd2cSJim Jagielski { 81*b1cdbd2cSJim Jagielski sal_uInt8 byval; // Contains byte expression value 82*b1cdbd2cSJim Jagielski sal_Int16 sval; // Contains short expression value 83*b1cdbd2cSJim Jagielski sal_uInt16 usval; // Contains unsigned short expr value 84*b1cdbd2cSJim Jagielski sal_Int32 lval; // Contains long expression value 85*b1cdbd2cSJim Jagielski sal_uInt32 ulval; // Contains unsigned long expr value 86*b1cdbd2cSJim Jagielski sal_Int64 hval; // Contains hyper expression value 87*b1cdbd2cSJim Jagielski sal_uInt64 uhval; // Contains unsigned hyper expr value 88*b1cdbd2cSJim Jagielski sal_Bool bval; // Contains boolean expression value 89*b1cdbd2cSJim Jagielski float fval; // Contains 32-bit float expr value 90*b1cdbd2cSJim Jagielski double dval; // Contains 64-bit float expr value 91*b1cdbd2cSJim Jagielski sal_uInt32 eval; // Contains enumeration value 92*b1cdbd2cSJim Jagielski } u; 93*b1cdbd2cSJim Jagielski ExprType et; 94*b1cdbd2cSJim Jagielski }; 95*b1cdbd2cSJim Jagielski 96*b1cdbd2cSJim Jagielski const sal_Char* SAL_CALL exprTypeToString(ExprType t); 97*b1cdbd2cSJim Jagielski 98*b1cdbd2cSJim Jagielski class AstExpression 99*b1cdbd2cSJim Jagielski { 100*b1cdbd2cSJim Jagielski public: 101*b1cdbd2cSJim Jagielski // Constructor(s) 102*b1cdbd2cSJim Jagielski AstExpression(ExprComb c, AstExpression *pExpr1, AstExpression *pExpr2); 103*b1cdbd2cSJim Jagielski 104*b1cdbd2cSJim Jagielski AstExpression(sal_Int32 l); 105*b1cdbd2cSJim Jagielski AstExpression(sal_Int32 l, ExprType et); 106*b1cdbd2cSJim Jagielski AstExpression(sal_Int64 h); 107*b1cdbd2cSJim Jagielski AstExpression(sal_uInt64 uh); 108*b1cdbd2cSJim Jagielski AstExpression(double d); 109*b1cdbd2cSJim Jagielski AstExpression(::rtl::OString* scopedName); 110*b1cdbd2cSJim Jagielski 111*b1cdbd2cSJim Jagielski virtual ~AstExpression(); 112*b1cdbd2cSJim Jagielski 113*b1cdbd2cSJim Jagielski // Data Accessors getScope()114*b1cdbd2cSJim Jagielski AstScope* getScope() 115*b1cdbd2cSJim Jagielski { return m_pScope; } setScope(AstScope * pScope)116*b1cdbd2cSJim Jagielski void setScope(AstScope* pScope) 117*b1cdbd2cSJim Jagielski { m_pScope = pScope; } getLine()118*b1cdbd2cSJim Jagielski sal_Int32 getLine() 119*b1cdbd2cSJim Jagielski { return m_lineNo; } setLine(sal_Int32 l)120*b1cdbd2cSJim Jagielski void setLine(sal_Int32 l) 121*b1cdbd2cSJim Jagielski { m_lineNo = l; } getFileName()122*b1cdbd2cSJim Jagielski const ::rtl::OString& getFileName() 123*b1cdbd2cSJim Jagielski { return m_fileName; } setFileName(const::rtl::OString & fileName)124*b1cdbd2cSJim Jagielski void setFileName(const ::rtl::OString& fileName) 125*b1cdbd2cSJim Jagielski { m_fileName = fileName; } getCombOperator()126*b1cdbd2cSJim Jagielski ExprComb getCombOperator() 127*b1cdbd2cSJim Jagielski { return m_combOperator; } setCombOperator(ExprComb new_ec)128*b1cdbd2cSJim Jagielski void setCombOperator(ExprComb new_ec) 129*b1cdbd2cSJim Jagielski { m_combOperator = new_ec; } getExprValue()130*b1cdbd2cSJim Jagielski AstExprValue* getExprValue() 131*b1cdbd2cSJim Jagielski { return m_exprValue; } setExprValue(AstExprValue * pEv)132*b1cdbd2cSJim Jagielski void setExprValue(AstExprValue *pEv) 133*b1cdbd2cSJim Jagielski { m_exprValue = pEv; } getExpr1()134*b1cdbd2cSJim Jagielski AstExpression* getExpr1() 135*b1cdbd2cSJim Jagielski { return m_subExpr1; } setExpr1(AstExpression * pExpr)136*b1cdbd2cSJim Jagielski void setExpr1(AstExpression *pExpr) 137*b1cdbd2cSJim Jagielski { m_subExpr1 = pExpr; } getExpr2()138*b1cdbd2cSJim Jagielski AstExpression* getExpr2() 139*b1cdbd2cSJim Jagielski { return m_subExpr2; } setExpr2(AstExpression * pExpr)140*b1cdbd2cSJim Jagielski void setExpr2(AstExpression *pExpr) 141*b1cdbd2cSJim Jagielski { m_subExpr2 = pExpr; } getSymbolicName()142*b1cdbd2cSJim Jagielski ::rtl::OString* getSymbolicName() 143*b1cdbd2cSJim Jagielski { return m_pSymbolicName; } setSymbolicName(::rtl::OString * pSymbolicName)144*b1cdbd2cSJim Jagielski void setSymbolicName(::rtl::OString* pSymbolicName) 145*b1cdbd2cSJim Jagielski { m_pSymbolicName = pSymbolicName; } 146*b1cdbd2cSJim Jagielski 147*b1cdbd2cSJim Jagielski // Evaluation and value coercion 148*b1cdbd2cSJim Jagielski AstExprValue* coerce(ExprType type, sal_Bool bAssign=sal_True); 149*b1cdbd2cSJim Jagielski 150*b1cdbd2cSJim Jagielski // Evaluate then store value inside this AstExpression 151*b1cdbd2cSJim Jagielski void evaluate(EvalKind ek); 152*b1cdbd2cSJim Jagielski 153*b1cdbd2cSJim Jagielski // Compare to AstExpressions 154*b1cdbd2cSJim Jagielski sal_Bool operator==(AstExpression *pExpr); 155*b1cdbd2cSJim Jagielski sal_Bool compare(AstExpression *pExpr); 156*b1cdbd2cSJim Jagielski 157*b1cdbd2cSJim Jagielski ::rtl::OString toString(); dump()158*b1cdbd2cSJim Jagielski void dump() {} 159*b1cdbd2cSJim Jagielski private: 160*b1cdbd2cSJim Jagielski // Fill out the lineno, filename and definition scope details 161*b1cdbd2cSJim Jagielski void fillDefinitionDetails(); 162*b1cdbd2cSJim Jagielski // Internal evaluation 163*b1cdbd2cSJim Jagielski AstExprValue* eval_internal(EvalKind ek); 164*b1cdbd2cSJim Jagielski // Evaluate different sets of operators 165*b1cdbd2cSJim Jagielski AstExprValue* eval_bin_op(EvalKind ek); 166*b1cdbd2cSJim Jagielski AstExprValue* eval_bit_op(EvalKind ek); 167*b1cdbd2cSJim Jagielski AstExprValue* eval_un_op(EvalKind ek); 168*b1cdbd2cSJim Jagielski AstExprValue* eval_symbol(EvalKind ek); 169*b1cdbd2cSJim Jagielski 170*b1cdbd2cSJim Jagielski AstScope* m_pScope; // scope defined in 171*b1cdbd2cSJim Jagielski sal_Int32 m_lineNo; // line number defined in 172*b1cdbd2cSJim Jagielski ::rtl::OString m_fileName; // fileName defined in 173*b1cdbd2cSJim Jagielski 174*b1cdbd2cSJim Jagielski ExprComb m_combOperator; 175*b1cdbd2cSJim Jagielski AstExpression* m_subExpr1; 176*b1cdbd2cSJim Jagielski AstExpression* m_subExpr2; 177*b1cdbd2cSJim Jagielski AstExprValue* m_exprValue; 178*b1cdbd2cSJim Jagielski ::rtl::OString* m_pSymbolicName; 179*b1cdbd2cSJim Jagielski }; 180*b1cdbd2cSJim Jagielski 181*b1cdbd2cSJim Jagielski #endif // _IDLC_ASTEXPRESSION_HXX_ 182*b1cdbd2cSJim Jagielski 183