00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #include "c_breeze.h"
00039
00040 operator_map Operators::table;
00041
00042 void Operators::init()
00043 {
00044 table[Operator::ARROW] = new Operator(Operator::ARROW, "->", "ARROW", 0, 15);
00045 table['.'] = new Operator('.', ".", "DOT", 0, 15);
00046
00047 table['!'] = new Operator('!', "!", "not", 14, 0);
00048 table['~'] = new Operator('~', "~", "bitnot", 14, 0);
00049 table[Operator::ICR] = new Operator(Operator::ICR, "++", "ICR", 14, 0);
00050 table[Operator::POSTINC] = new Operator(Operator::POSTINC, "++", "postinc", 14, 0);
00051 table[Operator::PREINC] = new Operator(Operator::PREINC, "++", "preinc", 14, 0);
00052 table[Operator::DECR] = new Operator(Operator::DECR, "--", "DECR", 14, 0);
00053 table[Operator::POSTDEC] = new Operator(Operator::POSTDEC, "--", "postdec", 14, 0);
00054 table[Operator::PREDEC] = new Operator(Operator::PREDEC, "--", "predec", 14, 0);
00055
00056 table[Operator::SIZEOF] = new Operator(Operator::SIZEOF, "sizeof", "sizeof", 14, 0);
00057
00058 table[Operator::ADDRESS] = new Operator(Operator::ADDRESS, "&", "addrof", 14, 0);
00059 table[Operator::INDIR] = new Operator(Operator::INDIR, "*", "indir", 14, 0);
00060 table[Operator::UPLUS] = new Operator(Operator::UPLUS, "+", "UPLUS", 14, 0);
00061 table[Operator::UMINUS] = new Operator(Operator::UMINUS, "-", "neg", 14, 0);
00062
00063 table['*'] = new Operator('*', "*", "mul", 0, 13);
00064 table['/'] = new Operator('/', "/", "div", 0, 13);
00065 table['%'] = new Operator('%', "%", "mod", 0, 13);
00066
00067 table['+'] = new Operator('+', "+", "add", 0, 12);
00068 table['-'] = new Operator('-', "-", "sub", 0, 12);
00069
00070 table[Operator::LS] = new Operator(Operator::LS, "<<", "lsh", 0, 11);
00071 table[Operator::RS] = new Operator(Operator::RS, ">>", "rsh", 0, 11);
00072
00073 table['<'] = new Operator('<', "<", "lt", 0, 10);
00074 table['>'] = new Operator('>', ">", "gt", 0, 10);
00075 table[Operator::LE] = new Operator(Operator::LE, "<=", "le", 0, 10);
00076 table[Operator::GE] = new Operator(Operator::GE, ">=", "ge", 0, 10);
00077
00078 table[Operator::EQ] = new Operator(Operator::EQ, "==", "eq", 0, 9);
00079 table[Operator::NE] = new Operator(Operator::NE, "!=", "ne", 0, 9);
00080
00081 table['&'] = new Operator('&', "&", "band", 0, 8);
00082
00083 table['^'] = new Operator('^', "^", "bxor", 0, 7);
00084
00085 table['|'] = new Operator('|', "|", "bor", 0, 6);
00086
00087 table[Operator::ANDAND] = new Operator(Operator::ANDAND, "&&", "and", 0, 5);
00088 table[Operator::OROR] = new Operator(Operator::OROR, "||", "or", 0, 4);
00089
00090 table['='] = new Operator('=', "=", "asgn" , 0, 2, false);
00091 table[Operator::MULTassign] = new Operator(Operator::MULTassign, "*=", "*=", 0, 2, false);
00092 table[Operator::DIVassign] = new Operator(Operator::DIVassign, "/=", "/=", 0, 2, false);
00093 table[Operator::MODassign] = new Operator(Operator::MODassign, "%=", "%=", 0, 2, false);
00094 table[Operator::PLUSassign] = new Operator(Operator::PLUSassign, "+=", "+=", 0, 2, false);
00095 table[Operator::MINUSassign] = new Operator(Operator::MINUSassign, "-=", "-=", 0, 2, false);
00096 table[Operator::LSassign] = new Operator(Operator::LSassign, "<<=", "<<=", 0, 2, false);
00097 table[Operator::RSassign] = new Operator(Operator::RSassign, ">>=", ">>=", 0, 2, false);
00098 table[Operator::ANDassign] = new Operator(Operator::ANDassign, "&=", "&=", 0, 2, false);
00099 table[Operator::ERassign] = new Operator(Operator::ERassign, "^=", "^=", 0, 2, false);
00100 table[Operator::ORassign] = new Operator(Operator::ORassign, "|=", "|=", 0, 2, false);
00101
00102 table[Operator::Index] = new Operator(Operator::Index, "[]", "index", 0, 14 );
00103 table[Operator::FUNC_CALL] = new Operator(Operator::FUNC_CALL, "()", "call", 0, 14);
00104 }
00105
00106
00107 bool Operator::is_assignment() const
00108 {
00109 switch (_id) {
00110 case '=':
00111 case Operator::MULTassign:
00112 case Operator::DIVassign:
00113 case Operator::MODassign:
00114 case Operator::PLUSassign:
00115 case Operator::MINUSassign:
00116 case Operator::LSassign:
00117 case Operator::RSassign:
00118 case Operator::ANDassign:
00119 case Operator::ERassign:
00120 case Operator::ORassign:
00121 return true;
00122 default:
00123 return false;
00124 }
00125 }
00126
00127 bool Operator::is_comparison() const
00128 {
00129 switch (_id) {
00130 case Operator::EQ:
00131 case Operator::NE:
00132 case '<':
00133 case Operator::LE:
00134 case '>':
00135 case Operator::GE:
00136 return true;
00137 default:
00138 return false;
00139 }
00140 }
00141
00142 bool Operator::is_unary() const
00143 {
00144 switch ( _id ) {
00145 case Operator::SIZEOF:
00146 case Operator::UPLUS:
00147 case Operator::UMINUS:
00148 case Operator::INDIR:
00149 case Operator::ADDRESS:
00150 case Operator::POSTINC:
00151 case Operator::POSTDEC:
00152 case Operator::PREINC:
00153 case Operator::PREDEC:
00154 case '!':
00155 case '~':
00156 return true;
00157 default:
00158 return false;
00159 }
00160 }
00161
00162 bool Operator::is_arithmetic() const
00163 {
00164 switch (_id) {
00165 case '+':
00166 case '-':
00167 case '*':
00168 case '/':
00169 case '%':
00170 case '|':
00171 case '&':
00172 case '^':
00173 case Operator::ANDAND:
00174 case Operator::OROR:
00175 case Operator::LS:
00176 case Operator::RS:
00177 return true;
00178 default:
00179 return false;
00180 }
00181 }
00182
00183 bool Operator::is_binary() const
00184 {
00185 switch (_id) {
00186 case Operator::ARROW:
00187 case '.':
00188 case '*':
00189 case '/':
00190 case '%':
00191 case '+':
00192 case '-':
00193 case Operator::LS:
00194 case Operator::RS:
00195 case '<':
00196 case '>':
00197 case Operator::LE:
00198 case Operator::GE:
00199 case Operator::EQ:
00200 case Operator::NE:
00201 case '&':
00202 case '^':
00203 case '|':
00204 case Operator::ANDAND:
00205 case Operator::OROR:
00206 case '=':
00207 case Operator::MULTassign:
00208 case Operator::DIVassign:
00209 case Operator::MODassign:
00210 case Operator::PLUSassign:
00211 case Operator::MINUSassign:
00212 case Operator::LSassign:
00213 case Operator::RSassign:
00214 case Operator::ANDassign:
00215 case Operator::ERassign:
00216 case Operator::ORassign:
00217 case Operator::Index:
00218 return true;
00219 default:
00220 return false;
00221 }
00222 }
00223
00224 bool Operator::is_dismantled_binary() const {
00225 switch (_id) {
00226 case '*':
00227 case '/':
00228 case '%':
00229 case '+':
00230 case '-':
00231 case Operator::LS:
00232 case Operator::RS:
00233 case '<':
00234 case '>':
00235 case Operator::LE:
00236 case Operator::GE:
00237 case Operator::EQ:
00238 case Operator::NE:
00239 case '&':
00240 case '^':
00241 case '|':
00242 return true;
00243 default:
00244 return false;
00245 }
00246 }