source: src/CodeGen/OperatorTable.cc@ 34ed17b

ADT ast-experimental
Last change on this file since 34ed17b was 60a8062, checked in by Peter A. Buhr <pabuhr@…>, 6 years ago

rewrite most of OperatorTable and change caller modules to use new interface

  • Property mode set to 100644
File size: 6.9 KB
Line 
1//
2// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
3//
4// The contents of this file are covered under the licence agreement in the
5// file "LICENCE" distributed with Cforall.
6//
7// OperatorTable.cc --
8//
9// Author : Richard C. Bilson
10// Created On : Mon May 18 07:44:20 2015
11// Last Modified By : Peter A. Buhr
12// Last Modified On : Tue Feb 18 15:55:01 2020
13// Update Count : 55
14//
15
16#include <algorithm> // for any_of
17#include <map> // for map, _Rb_tree_const_iterator, map<>::const_iterator
18#include <utility> // for pair
19using namespace std;
20
21#include "OperatorTable.h"
22#include "Common/utility.h"
23
24namespace CodeGen {
25 const OperatorInfo CodeGen::tableValues[] = {
26 // inputName symbol outputName friendlyName type
27 { "?[?]", "", "_operator_index", "Index", OT_INDEX },
28 { "?{}", "=", "_constructor", "Constructor", OT_CTOR },
29 { "^?{}", "", "_destructor", "Destructor", OT_DTOR },
30 { "?()", "", "_operator_call", "Call Operator", OT_CALL },
31 { "?++", "++", "_operator_postincr", "Postfix Increment", OT_POSTFIXASSIGN },
32 { "?--", "--", "_operator_postdecr", "Postfix Decrement", OT_POSTFIXASSIGN },
33 { "*?", "*", "_operator_deref", "Dereference", OT_PREFIX },
34 { "+?", "+", "_operator_unaryplus", "Plus", OT_PREFIX },
35 { "-?", "-", "_operator_unaryminus", "Minus", OT_PREFIX },
36 { "~?", "~", "_operator_bitnot", "Bitwise Not", OT_PREFIX },
37 { "!?", "!", "_operator_lognot", "Logical Not", OT_PREFIX },
38 { "++?", "++", "_operator_preincr", "Prefix Increment", OT_PREFIXASSIGN },
39 { "--?", "--", "_operator_predecr", "Prefix Decrement", OT_PREFIXASSIGN },
40 { "?\\?", "\\", "_operator_exponential", "Exponentiation", OT_INFIX },
41 { "?*?", "*", "_operator_multiply", "Multiplication", OT_INFIX },
42 { "?/?", "/", "_operator_divide", "Division", OT_INFIX },
43 { "?%?", "%", "_operator_modulus", "Modulo", OT_INFIX },
44 { "?+?", "+", "_operator_add", "Addition", OT_INFIX },
45 { "?-?", "-", "_operator_subtract", "Substraction", OT_INFIX },
46 { "?<<?", "<<", "_operator_shiftleft", "Shift Left", OT_INFIX },
47 { "?>>?", ">>", "_operator_shiftright", "Shift Right", OT_INFIX },
48 { "?<?", "<", "_operator_less", "Less-than", OT_INFIX },
49 { "?>?", ">", "_operator_greater", "Greater-than", OT_INFIX },
50 { "?<=?", "<=", "_operator_lessequal", "Less-than-or-Equal", OT_INFIX },
51 { "?>=?", ">=", "_operator_greaterequal", "Greater-than-or-Equal", OT_INFIX },
52 { "?==?", "==", "_operator_equal", "Equality", OT_INFIX },
53 { "?!=?", "!=", "_operator_notequal", "Not-Equal", OT_INFIX },
54 { "?&?", "&", "_operator_bitand", "Bitwise And", OT_INFIX },
55 { "?^?", "^", "_operator_bitxor", "Bitwise Xor", OT_INFIX },
56 { "?|?", "|", "_operator_bitor", "Bitwise Or", OT_INFIX },
57 { "?=?", "=", "_operator_assign", "Assignment", OT_INFIXASSIGN },
58 { "?\\=?", "\\=", "_operator_expassign", "Exponentiation Assignment", OT_INFIXASSIGN },
59 { "?*=?", "*=", "_operator_multassign", "Multiplication Assignment", OT_INFIXASSIGN },
60 { "?/=?", "/=", "_operator_divassign", "Division Assignment", OT_INFIXASSIGN },
61 { "?%=?", "%=", "_operator_modassign", "Modulo Assignment", OT_INFIXASSIGN },
62 { "?+=?", "+=", "_operator_addassign", "Addition Assignment", OT_INFIXASSIGN },
63 { "?-=?", "-=", "_operator_subassign", "Substrction Assignment", OT_INFIXASSIGN },
64 { "?<<=?", "<<=", "_operator_shiftleftassign", "Shift Left Assignment", OT_INFIXASSIGN },
65 { "?>>=?", ">>=", "_operator_shiftrightassign", "Shift Right Assignment", OT_INFIXASSIGN },
66 { "?&=?", "&=", "_operator_bitandassign", "Bitwise And Assignment", OT_INFIXASSIGN },
67 { "?^=?", "^=", "_operator_bitxorassign", "Bitwise Xor Assignment", OT_INFIXASSIGN },
68 { "?|=?", "|=", "_operator_bitorassign", "Bitwise Or Assignment", OT_INFIXASSIGN },
69 }; // tableValues
70
71 std::map< std::string, OperatorInfo > CodeGen::table;
72
73 CodeGen::CodeGen() {
74 enum { numOps = sizeof( tableValues ) / sizeof( OperatorInfo ) };
75 for ( int i = 0; i < numOps; i += 1 ) {
76 table[ tableValues[i].inputName ] = tableValues[i];
77 } // for
78 }
79
80 const OperatorInfo * operatorLookup( const string & funcName ) {
81 if ( funcName.find_first_of( "?^*+-!", 0, 1 ) == string::npos ) return nullptr; // prefilter
82 const OperatorInfo * ret = &CodeGen::table.find( funcName )->second; // must be in the table
83 assert( ret );
84 return ret;
85 }
86
87 bool isOperator( const string & funcName ) {
88 return operatorLookup( funcName ) != nullptr;
89 }
90
91 string operatorFriendlyName( const string & funcName ) {
92 const OperatorInfo * info = operatorLookup( funcName );
93 if ( info ) return info->friendlyName;
94 return "";
95 }
96
97 bool isConstructor( const string & funcName ) {
98 const OperatorInfo * info = operatorLookup( funcName );
99 if ( info ) return info->type == OT_CTOR;
100 return false;
101 }
102
103 bool isDestructor( const string & funcName ) {
104 const OperatorInfo * info = operatorLookup( funcName );
105 if ( info ) return info->type == OT_DTOR;
106 return false;
107 }
108
109 bool isCtorDtor( const string & funcName ) {
110 const OperatorInfo * info = operatorLookup( funcName );
111 if ( info ) return info->type <= OT_CONSTRUCTOR;
112 return false;
113 }
114
115 bool isAssignment( const string & funcName ) {
116 const OperatorInfo * info = operatorLookup( funcName );
117 if ( info ) return info->type > OT_CONSTRUCTOR && info->type <= OT_ASSIGNMENT;
118 return false;
119 }
120
121 bool isCtorDtorAssign( const string & funcName ) {
122 const OperatorInfo * info = operatorLookup( funcName );
123 if ( info ) return info->type <= OT_ASSIGNMENT;
124 return false;
125 }
126
127 CodeGen codegen; // initialize singleton package
128} // namespace CodeGen
129
130// Local Variables: //
131// tab-width: 4 //
132// End: //
Note: See TracBrowser for help on using the repository browser.