C-Breeze
C Compiler Infrastructure

[ Project home page]
Main Page   Modules   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members   Related Pages  

operators.cc

Go to the documentation of this file.
00001 // $Id: operators.cc,v 1.6 2003/08/07 23:13:10 pnav Exp $
00002 // ----------------------------------------------------------------------
00003 //
00004 //  C-Breeze
00005 //  C Compiler Framework
00006 // 
00007 //  Copyright (c) 2000 University of Texas at Austin
00008 // 
00009 //  Samuel Z. Guyer
00010 //  Daniel A. Jimenez
00011 //  Calvin Lin
00012 // 
00013 //  Permission is hereby granted, free of charge, to any person
00014 //  obtaining a copy of this software and associated documentation
00015 //  files (the "Software"), to deal in the Software without
00016 //  restriction, including without limitation the rights to use, copy,
00017 //  modify, merge, publish, distribute, sublicense, and/or sell copies
00018 //  of the Software, and to permit persons to whom the Software is
00019 //  furnished to do so, subject to the following conditions:
00020 //  
00021 //  The above copyright notice and this permission notice shall be
00022 //  included in all copies or substantial portions of the Software.
00023 //  
00024 //  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
00025 //  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
00026 //  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
00027 //  NONINFRINGEMENT.  IN NO EVENT SHALL THE UNIVERSITY OF TEXAS AT
00028 //  AUSTIN BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
00029 //  IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
00030 //  OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
00031 //  THE SOFTWARE.
00032 //
00033 //  We acknowledge the C-to-C Translator from MIT Laboratory for
00034 //  Computer Science for inspiring parts of the C-Breeze design.
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 }

Generated on August 27, 2003
Back to the C-Breeze home page