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