Changeset 585
- Timestamp:
- 07/24/10 17:45:29 (14 years ago)
- Files:
-
- branches/dmd-1.x/src/expression.c (modified) (1 diff)
- branches/dmd-1.x/src/parse.c (modified) (1 diff)
- branches/dmd-1.x/src/parse.h (modified) (1 diff)
- trunk/src/expression.c (modified) (2 diffs)
- trunk/src/expression.h (modified) (1 diff)
- trunk/src/parse.c (modified) (6 diffs)
- trunk/src/parse.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/dmd-1.x/src/expression.c
r528 r585 32 32 #include "template.h" 33 33 #include "utf.h" 34 34 #include "enum.h" 35 35 #include "scope.h" 36 36 #include "statement.h" 37 37 #include "declaration.h" 38 38 #include "aggregate.h" 39 39 #include "import.h" 40 40 #include "id.h" 41 41 #include "dsymbol.h" 42 42 #include "module.h" 43 43 #include "attrib.h" 44 44 #include "hdrgen.h" 45 45 #include "parse.h" 46 46 47 47 48 48 Expression *createTypeInfoArray(Scope *sc, Expression *args[], int dim); 49 49 Expression *expandVar(int result, VarDeclaration *v); 50 50 51 51 #define LOGSEMANTIC 0 52 53 /**********************************54 * Set operator precedence for each operator.55 */56 57 // Operator precedence - greater values are higher precedence58 59 enum PREC60 {61 PREC_zero,62 PREC_expr,63 PREC_assign,64 PREC_cond,65 PREC_oror,66 PREC_andand,67 PREC_or,68 PREC_xor,69 PREC_and,70 PREC_equal,71 PREC_rel,72 PREC_shift,73 PREC_add,74 PREC_mul,75 PREC_unary,76 PREC_primary,77 };78 79 enum PREC precedence[TOKMAX];80 81 void initPrecedence()82 {83 precedence[TOKdotvar] = PREC_primary;84 precedence[TOKimport] = PREC_primary;85 precedence[TOKidentifier] = PREC_primary;86 precedence[TOKthis] = PREC_primary;87 precedence[TOKsuper] = PREC_primary;88 precedence[TOKint64] = PREC_primary;89 precedence[TOKfloat64] = PREC_primary;90 precedence[TOKnull] = PREC_primary;91 precedence[TOKstring] = PREC_primary;92 precedence[TOKarrayliteral] = PREC_primary;93 precedence[TOKtypeid] = PREC_primary;94 precedence[TOKis] = PREC_primary;95 precedence[TOKassert] = PREC_primary;96 precedence[TOKfunction] = PREC_primary;97 precedence[TOKvar] = PREC_primary;98 #if DMDV299 precedence[TOKdefault] = PREC_primary;100 #endif101 102 // post103 precedence[TOKdotti] = PREC_primary;104 precedence[TOKdot] = PREC_primary;105 // precedence[TOKarrow] = PREC_primary;106 precedence[TOKplusplus] = PREC_primary;107 precedence[TOKminusminus] = PREC_primary;108 precedence[TOKcall] = PREC_primary;109 precedence[TOKslice] = PREC_primary;110 precedence[TOKarray] = PREC_primary;111 112 precedence[TOKaddress] = PREC_unary;113 precedence[TOKstar] = PREC_unary;114 precedence[TOKneg] = PREC_unary;115 precedence[TOKuadd] = PREC_unary;116 precedence[TOKnot] = PREC_unary;117 precedence[TOKtobool] = PREC_add;118 precedence[TOKtilde] = PREC_unary;119 precedence[TOKdelete] = PREC_unary;120 precedence[TOKnew] = PREC_unary;121 precedence[TOKcast] = PREC_unary;122 123 precedence[TOKmul] = PREC_mul;124 precedence[TOKdiv] = PREC_mul;125 precedence[TOKmod] = PREC_mul;126 127 precedence[TOKadd] = PREC_add;128 precedence[TOKmin] = PREC_add;129 precedence[TOKcat] = PREC_add;130 131 precedence[TOKshl] = PREC_shift;132 precedence[TOKshr] = PREC_shift;133 precedence[TOKushr] = PREC_shift;134 135 precedence[TOKlt] = PREC_rel;136 precedence[TOKle] = PREC_rel;137 precedence[TOKgt] = PREC_rel;138 precedence[TOKge] = PREC_rel;139 precedence[TOKunord] = PREC_rel;140 precedence[TOKlg] = PREC_rel;141 precedence[TOKleg] = PREC_rel;142 precedence[TOKule] = PREC_rel;143 precedence[TOKul] = PREC_rel;144 precedence[TOKuge] = PREC_rel;145 precedence[TOKug] = PREC_rel;146 precedence[TOKue] = PREC_rel;147 precedence[TOKin] = PREC_rel;148 149 #if 0150 precedence[TOKequal] = PREC_equal;151 precedence[TOKnotequal] = PREC_equal;152 precedence[TOKidentity] = PREC_equal;153 precedence[TOKnotidentity] = PREC_equal;154 #else155 /* Note that we changed precedence, so that < and != have the same156 * precedence. This change is in the parser, too.157 */158 precedence[TOKequal] = PREC_rel;159 precedence[TOKnotequal] = PREC_rel;160 precedence[TOKidentity] = PREC_rel;161 precedence[TOKnotidentity] = PREC_rel;162 #endif163 164 precedence[TOKand] = PREC_and;165 166 precedence[TOKxor] = PREC_xor;167 168 precedence[TOKor] = PREC_or;169 170 precedence[TOKandand] = PREC_andand;171 172 precedence[TOKoror] = PREC_oror;173 174 precedence[TOKquestion] = PREC_cond;175 176 precedence[TOKassign] = PREC_assign;177 precedence[TOKconstruct] = PREC_assign;178 precedence[TOKblit] = PREC_assign;179 precedence[TOKaddass] = PREC_assign;180 precedence[TOKminass] = PREC_assign;181 precedence[TOKcatass] = PREC_assign;182 precedence[TOKmulass] = PREC_assign;183 precedence[TOKdivass] = PREC_assign;184 precedence[TOKmodass] = PREC_assign;185 precedence[TOKshlass] = PREC_assign;186 precedence[TOKshrass] = PREC_assign;187 precedence[TOKushrass] = PREC_assign;188 precedence[TOKandass] = PREC_assign;189 precedence[TOKorass] = PREC_assign;190 precedence[TOKxorass] = PREC_assign;191 192 precedence[TOKcomma] = PREC_expr;193 }194 52 195 53 /************************************************************* 196 54 * Given var, we need to get the 197 55 * right 'this' pointer if var is in an outer class, but our 198 56 * existing 'this' pointer is in an inner class. 199 57 * Input: 200 58 * e1 existing 'this' 201 59 * ad struct or class we need the correct 'this' for 202 60 * var the specific member of ad we're accessing 203 61 */ 204 62 205 63 Expression *getRightThis(Loc loc, Scope *sc, AggregateDeclaration *ad, 206 64 Expression *e1, Declaration *var) 207 65 { 208 66 //printf("\ngetRightThis(e1 = %s, ad = %s, var = %s)\n", e1->toChars(), ad->toChars(), var->toChars()); 209 67 L1: 210 68 Type *t = e1->type->toBasetype(); 211 69 //printf("e1->type = %s, var->type = %s\n", e1->type->toChars(), var->type->toChars()); 212 70 213 71 /* If e1 is not the 'this' pointer for ad branches/dmd-1.x/src/parse.c
r514 r585 5439 5439 check(TOKrbracket); 5440 5440 t = parseDeclarator(t, NULL); 5441 5441 t = new TypeDArray(t); 5442 5442 } 5443 5443 else if (token.value == TOKlparen) 5444 5444 arguments = parseArguments(); 5445 5445 #endif 5446 5446 e = new NewExp(loc, thisexp, newargs, t, arguments); 5447 5447 return e; 5448 5448 } 5449 5449 5450 5450 /********************************************** 5451 5451 */ 5452 5452 5453 5453 void Parser::addComment(Dsymbol *s, unsigned char *blockComment) 5454 5454 { 5455 5455 s->addComment(combineComments(blockComment, token.lineComment)); 5456 5456 token.lineComment = NULL; 5457 5457 } 5458 5458 5459 5460 /********************************* ***************************/ 5461 5459 /********************************** 5460 * Set operator precedence for each operator. 5461 */ 5462 5463 void initPrecedence() 5464 { 5465 precedence[TOKdotvar] = PREC_primary; 5466 precedence[TOKimport] = PREC_primary; 5467 precedence[TOKidentifier] = PREC_primary; 5468 precedence[TOKthis] = PREC_primary; 5469 precedence[TOKsuper] = PREC_primary; 5470 precedence[TOKint64] = PREC_primary; 5471 precedence[TOKfloat64] = PREC_primary; 5472 precedence[TOKnull] = PREC_primary; 5473 precedence[TOKstring] = PREC_primary; 5474 precedence[TOKarrayliteral] = PREC_primary; 5475 precedence[TOKtypeid] = PREC_primary; 5476 precedence[TOKis] = PREC_primary; 5477 precedence[TOKassert] = PREC_primary; 5478 precedence[TOKfunction] = PREC_primary; 5479 precedence[TOKvar] = PREC_primary; 5480 #if DMDV2 5481 precedence[TOKdefault] = PREC_primary; 5482 #endif 5483 5484 // post 5485 precedence[TOKdotti] = PREC_primary; 5486 precedence[TOKdot] = PREC_primary; 5487 // precedence[TOKarrow] = PREC_primary; 5488 precedence[TOKplusplus] = PREC_primary; 5489 precedence[TOKminusminus] = PREC_primary; 5490 precedence[TOKcall] = PREC_primary; 5491 precedence[TOKslice] = PREC_primary; 5492 precedence[TOKarray] = PREC_primary; 5493 5494 precedence[TOKaddress] = PREC_unary; 5495 precedence[TOKstar] = PREC_unary; 5496 precedence[TOKneg] = PREC_unary; 5497 precedence[TOKuadd] = PREC_unary; 5498 precedence[TOKnot] = PREC_unary; 5499 precedence[TOKtobool] = PREC_add; 5500 precedence[TOKtilde] = PREC_unary; 5501 precedence[TOKdelete] = PREC_unary; 5502 precedence[TOKnew] = PREC_unary; 5503 precedence[TOKcast] = PREC_unary; 5504 5505 precedence[TOKmul] = PREC_mul; 5506 precedence[TOKdiv] = PREC_mul; 5507 precedence[TOKmod] = PREC_mul; 5508 5509 precedence[TOKadd] = PREC_add; 5510 precedence[TOKmin] = PREC_add; 5511 precedence[TOKcat] = PREC_add; 5512 5513 precedence[TOKshl] = PREC_shift; 5514 precedence[TOKshr] = PREC_shift; 5515 precedence[TOKushr] = PREC_shift; 5516 5517 precedence[TOKlt] = PREC_rel; 5518 precedence[TOKle] = PREC_rel; 5519 precedence[TOKgt] = PREC_rel; 5520 precedence[TOKge] = PREC_rel; 5521 precedence[TOKunord] = PREC_rel; 5522 precedence[TOKlg] = PREC_rel; 5523 precedence[TOKleg] = PREC_rel; 5524 precedence[TOKule] = PREC_rel; 5525 precedence[TOKul] = PREC_rel; 5526 precedence[TOKuge] = PREC_rel; 5527 precedence[TOKug] = PREC_rel; 5528 precedence[TOKue] = PREC_rel; 5529 precedence[TOKin] = PREC_rel; 5530 5531 #if 0 5532 precedence[TOKequal] = PREC_equal; 5533 precedence[TOKnotequal] = PREC_equal; 5534 precedence[TOKidentity] = PREC_equal; 5535 precedence[TOKnotidentity] = PREC_equal; 5536 #else 5537 /* Note that we changed precedence, so that < and != have the same 5538 * precedence. This change is in the parser, too. 5539 */ 5540 precedence[TOKequal] = PREC_rel; 5541 precedence[TOKnotequal] = PREC_rel; 5542 precedence[TOKidentity] = PREC_rel; 5543 precedence[TOKnotidentity] = PREC_rel; 5544 #endif 5545 5546 precedence[TOKand] = PREC_and; 5547 5548 precedence[TOKxor] = PREC_xor; 5549 5550 precedence[TOKor] = PREC_or; 5551 5552 precedence[TOKandand] = PREC_andand; 5553 5554 precedence[TOKoror] = PREC_oror; 5555 5556 precedence[TOKquestion] = PREC_cond; 5557 5558 precedence[TOKassign] = PREC_assign; 5559 precedence[TOKconstruct] = PREC_assign; 5560 precedence[TOKblit] = PREC_assign; 5561 precedence[TOKaddass] = PREC_assign; 5562 precedence[TOKminass] = PREC_assign; 5563 precedence[TOKcatass] = PREC_assign; 5564 precedence[TOKmulass] = PREC_assign; 5565 precedence[TOKdivass] = PREC_assign; 5566 precedence[TOKmodass] = PREC_assign; 5567 precedence[TOKshlass] = PREC_assign; 5568 precedence[TOKshrass] = PREC_assign; 5569 precedence[TOKushrass] = PREC_assign; 5570 precedence[TOKandass] = PREC_assign; 5571 precedence[TOKorass] = PREC_assign; 5572 precedence[TOKxorass] = PREC_assign; 5573 5574 precedence[TOKcomma] = PREC_expr; 5575 } 5576 branches/dmd-1.x/src/parse.h
r428 r585 126 126 Expression *parseAddExp(); 127 127 Expression *parseShiftExp(); 128 128 Expression *parseRelExp(); 129 129 Expression *parseEqualExp(); 130 130 Expression *parseCmpExp(); 131 131 Expression *parseAndExp(); 132 132 Expression *parseXorExp(); 133 133 Expression *parseOrExp(); 134 134 Expression *parseAndAndExp(); 135 135 Expression *parseOrOrExp(); 136 136 Expression *parseCondExp(); 137 137 Expression *parseAssignExp(); 138 138 139 139 Expressions *parseArguments(); 140 140 141 141 Expression *parseNewExp(Expression *thisexp); 142 142 143 143 void addComment(Dsymbol *s, unsigned char *blockComment); 144 144 }; 145 145 146 // Operator precedence - greater values are higher precedence 147 148 enum PREC 149 { 150 PREC_zero, 151 PREC_expr, 152 PREC_assign, 153 PREC_cond, 154 PREC_oror, 155 PREC_andand, 156 PREC_or, 157 PREC_xor, 158 PREC_and, 159 PREC_equal, 160 PREC_rel, 161 PREC_shift, 162 PREC_add, 163 PREC_mul, 164 PREC_unary, 165 PREC_primary, 166 }; 167 168 enum PREC precedence[TOKMAX]; 169 170 void initPrecedence(); 171 146 172 #endif /* DMD_PARSE_H */ trunk/src/expression.c
r555 r585 32 32 #include "template.h" 33 33 #include "utf.h" 34 34 #include "enum.h" 35 35 #include "scope.h" 36 36 #include "statement.h" 37 37 #include "declaration.h" 38 38 #include "aggregate.h" 39 39 #include "import.h" 40 40 #include "id.h" 41 41 #include "dsymbol.h" 42 42 #include "module.h" 43 43 #include "attrib.h" 44 44 #include "hdrgen.h" 45 45 #include "parse.h" 46 46 47 47 48 48 Expression *createTypeInfoArray(Scope *sc, Expression *args[], int dim); 49 49 Expression *expandVar(int result, VarDeclaration *v); 50 50 51 51 #define LOGSEMANTIC 0 52 53 /**********************************54 * Set operator precedence for each operator.55 */56 57 // Operator precedence - greater values are higher precedence58 59 enum PREC60 {61 PREC_zero,62 PREC_expr,63 PREC_assign,64 PREC_cond,65 PREC_oror,66 PREC_andand,67 PREC_or,68 PREC_xor,69 PREC_and,70 PREC_equal,71 PREC_rel,72 PREC_shift,73 PREC_add,74 PREC_mul,75 PREC_pow,76 PREC_unary,77 PREC_primary,78 };79 80 enum PREC precedence[TOKMAX];81 82 void initPrecedence()83 {84 precedence[TOKdotvar] = PREC_primary;85 precedence[TOKimport] = PREC_primary;86 precedence[TOKidentifier] = PREC_primary;87 precedence[TOKthis] = PREC_primary;88 precedence[TOKsuper] = PREC_primary;89 precedence[TOKint64] = PREC_primary;90 precedence[TOKfloat64] = PREC_primary;91 precedence[TOKnull] = PREC_primary;92 precedence[TOKstring] = PREC_primary;93 precedence[TOKarrayliteral] = PREC_primary;94 precedence[TOKtypeid] = PREC_primary;95 precedence[TOKis] = PREC_primary;96 precedence[TOKassert] = PREC_primary;97 precedence[TOKfunction] = PREC_primary;98 precedence[TOKvar] = PREC_primary;99 #if DMDV2100 precedence[TOKdefault] = PREC_primary;101 #endif102 103 // post104 precedence[TOKdotti] = PREC_primary;105 precedence[TOKdot] = PREC_primary;106 // precedence[TOKarrow] = PREC_primary;107 precedence[TOKplusplus] = PREC_primary;108 precedence[TOKminusminus] = PREC_primary;109 precedence[TOKpreplusplus] = PREC_primary;110 precedence[TOKpreminusminus] = PREC_primary;111 precedence[TOKcall] = PREC_primary;112 precedence[TOKslice] = PREC_primary;113 precedence[TOKarray] = PREC_primary;114 115 precedence[TOKaddress] = PREC_unary;116 precedence[TOKstar] = PREC_unary;117 precedence[TOKneg] = PREC_unary;118 precedence[TOKuadd] = PREC_unary;119 precedence[TOKnot] = PREC_unary;120 precedence[TOKtobool] = PREC_add;121 precedence[TOKtilde] = PREC_unary;122 precedence[TOKdelete] = PREC_unary;123 precedence[TOKnew] = PREC_unary;124 precedence[TOKcast] = PREC_unary;125 126 precedence[TOKpow] = PREC_pow;127 128 precedence[TOKmul] = PREC_mul;129 precedence[TOKdiv] = PREC_mul;130 precedence[TOKmod] = PREC_mul;131 precedence[TOKpow] = PREC_mul;132 133 precedence[TOKadd] = PREC_add;134 precedence[TOKmin] = PREC_add;135 precedence[TOKcat] = PREC_add;136 137 precedence[TOKshl] = PREC_shift;138 precedence[TOKshr] = PREC_shift;139 precedence[TOKushr] = PREC_shift;140 141 precedence[TOKlt] = PREC_rel;142 precedence[TOKle] = PREC_rel;143 precedence[TOKgt] = PREC_rel;144 precedence[TOKge] = PREC_rel;145 precedence[TOKunord] = PREC_rel;146 precedence[TOKlg] = PREC_rel;147 precedence[TOKleg] = PREC_rel;148 precedence[TOKule] = PREC_rel;149 precedence[TOKul] = PREC_rel;150 precedence[TOKuge] = PREC_rel;151 precedence[TOKug] = PREC_rel;152 precedence[TOKue] = PREC_rel;153 precedence[TOKin] = PREC_rel;154 155 #if 0156 precedence[TOKequal] = PREC_equal;157 precedence[TOKnotequal] = PREC_equal;158 precedence[TOKidentity] = PREC_equal;159 precedence[TOKnotidentity] = PREC_equal;160 #else161 /* Note that we changed precedence, so that < and != have the same162 * precedence. This change is in the parser, too.163 */164 precedence[TOKequal] = PREC_rel;165 precedence[TOKnotequal] = PREC_rel;166 precedence[TOKidentity] = PREC_rel;167 precedence[TOKnotidentity] = PREC_rel;168 #endif169 170 precedence[TOKand] = PREC_and;171 172 precedence[TOKxor] = PREC_xor;173 174 precedence[TOKor] = PREC_or;175 176 precedence[TOKandand] = PREC_andand;177 178 precedence[TOKoror] = PREC_oror;179 180 precedence[TOKquestion] = PREC_cond;181 182 precedence[TOKassign] = PREC_assign;183 precedence[TOKconstruct] = PREC_assign;184 precedence[TOKblit] = PREC_assign;185 precedence[TOKaddass] = PREC_assign;186 precedence[TOKminass] = PREC_assign;187 precedence[TOKcatass] = PREC_assign;188 precedence[TOKmulass] = PREC_assign;189 precedence[TOKdivass] = PREC_assign;190 precedence[TOKmodass] = PREC_assign;191 precedence[TOKpowass] = PREC_assign;192 precedence[TOKshlass] = PREC_assign;193 precedence[TOKshrass] = PREC_assign;194 precedence[TOKushrass] = PREC_assign;195 precedence[TOKandass] = PREC_assign;196 precedence[TOKorass] = PREC_assign;197 precedence[TOKxorass] = PREC_assign;198 199 precedence[TOKcomma] = PREC_expr;200 }201 52 202 53 /************************************************************* 203 54 * Given var, we need to get the 204 55 * right 'this' pointer if var is in an outer class, but our 205 56 * existing 'this' pointer is in an inner class. 206 57 * Input: 207 58 * e1 existing 'this' 208 59 * ad struct or class we need the correct 'this' for 209 60 * var the specific member of ad we're accessing 210 61 */ 211 62 212 63 Expression *getRightThis(Loc loc, Scope *sc, AggregateDeclaration *ad, 213 64 Expression *e1, Declaration *var) 214 65 { 215 66 //printf("\ngetRightThis(e1 = %s, ad = %s, var = %s)\n", e1->toChars(), ad->toChars(), var->toChars()); 216 67 L1: 217 68 Type *t = e1->type->toBasetype(); 218 69 //printf("e1->type = %s, var->type = %s\n", e1->type->toChars(), var->type->toChars()); 219 70 220 71 /* If e1 is not the 'this' pointer for ad … … 1001 852 { Expression *arg = (Expression *)arguments->data[i]; 1002 853 1003 854 if (i) 1004 855 buf->writeByte(','); 1005 856 argbuf.reset(); 1006 857 arg->type->toCBuffer2(&argbuf, hgs, 0); 1007 858 buf->write(&argbuf); 1008 859 } 1009 860 } 1010 861 } 1011 862 1012 863 /******************************** Expression **************************/ 1013 864 1014 865 Expression::Expression(Loc loc, enum TOK op, int size) 1015 866 : loc(loc) 1016 867 { 1017 868 //printf("Expression::Expression(op = %d) this = %p\n", op, this); 1018 869 this->loc = loc; 1019 870 this->op = op; 1020 871 this->size = size; 872 this->parens = 0; 1021 873 type = NULL; 1022 874 } 1023 875 1024 876 Expression *Expression::syntaxCopy() 1025 877 { 1026 878 //printf("Expression::syntaxCopy()\n"); 1027 879 //dump(0); 1028 880 return copy(); 1029 881 } 1030 882 1031 883 /********************************* 1032 884 * Does *not* do a deep copy. 1033 885 */ 1034 886 1035 887 Expression *Expression::copy() 1036 888 { 1037 889 Expression *e; 1038 890 if (!size) 1039 891 { 1040 892 #ifdef DEBUG trunk/src/expression.h
r528 r585 64 64 Expression *build_overload(Loc loc, Scope *sc, Expression *ethis, Expression *earg, Identifier *id, Objects *targsi = NULL); 65 65 Dsymbol *search_function(ScopeDsymbol *ad, Identifier *funcid); 66 66 void inferApplyArgTypes(enum TOK op, Parameters *arguments, Expression *aggr); 67 67 void argExpTypesToCBuffer(OutBuffer *buf, Expressions *arguments, HdrGenState *hgs); 68 68 void argsToCBuffer(OutBuffer *buf, Expressions *arguments, HdrGenState *hgs); 69 69 void expandTuples(Expressions *exps); 70 70 FuncDeclaration *hasThis(Scope *sc); 71 71 Expression *fromConstInitializer(int result, Expression *e); 72 72 int arrayExpressionCanThrow(Expressions *exps); 73 73 74 74 struct IntRange 75 75 { uinteger_t imin; 76 76 uinteger_t imax; 77 77 }; 78 78 79 79 struct Expression : Object 80 80 { 81 81 Loc loc; // file location 82 82 enum TOK op; // handy to minimize use of dynamic_cast 83 83 Type *type; // !=NULL means that semantic() has been run 84 int size; // # of bytes in Expression so we can copy() it 84 unsigned char size; // # of bytes in Expression so we can copy() it 85 unsigned char parens; // if this is a parenthesized expression 85 86 86 87 Expression(Loc loc, enum TOK op, int size); 87 88 Expression *copy(); 88 89 virtual Expression *syntaxCopy(); 89 90 virtual Expression *semantic(Scope *sc); 90 91 Expression *trySemantic(Scope *sc); 91 92 92 93 int dyncast() { return DYNCAST_EXPRESSION; } // kludge for template.isExpression() 93 94 94 95 void print(); 95 96 char *toChars(); 96 97 virtual void dump(int indent); 97 98 void error(const char *format, ...); 98 99 void warning(const char *format, ...); 99 100 virtual void rvalue(); 100 101 101 102 static Expression *combine(Expression *e1, Expression *e2); 102 103 static Expressions *arraySyntaxCopy(Expressions *exps); 103 104 104 105 virtual dinteger_t toInteger(); trunk/src/parse.c
r514 r585 4229 4229 } 4230 4230 4231 4231 void Parser::check(enum TOK value) 4232 4232 { 4233 4233 check(loc, value); 4234 4234 } 4235 4235 4236 4236 void Parser::check(Loc loc, enum TOK value) 4237 4237 { 4238 4238 if (token.value != value) 4239 4239 error(loc, "found '%s' when expecting '%s'", token.toChars(), Token::toChars(value)); 4240 4240 nextToken(); 4241 4241 } 4242 4242 4243 4243 void Parser::check(enum TOK value, const char *string) 4244 4244 { 4245 4245 if (token.value != value) 4246 4246 error("found '%s' when expecting '%s' following %s", 4247 4247 token.toChars(), Token::toChars(value), string); 4248 4248 nextToken(); 4249 } 4250 4251 void Parser::checkParens(enum TOK value, Expression *e) 4252 { 4253 if (precedence[e->op] == PREC_rel && !e->parens) 4254 error(loc, "%s must be parenthesized when next to operator %s", e->toChars(), Token::toChars(value)); 4249 4255 } 4250 4256 4251 4257 /************************************ 4252 4258 * Determine if the scanner is sitting on the start of a declaration. 4253 4259 * Input: 4254 4260 * needId 0 no identifier 4255 4261 * 1 identifier optional 4256 4262 * 2 must have identifier 4257 4263 * Output: 4258 4264 * if *pt is not NULL, it is set to the ending token, which would be endtok 4259 4265 */ 4260 4266 4261 4267 int Parser::isDeclaration(Token *t, int needId, enum TOK endtok, Token **pt) 4262 4268 { 4263 4269 //printf("isDeclaration(needId = %d)\n", needId); 4264 4270 int haveId = 0; 4265 4271 4266 4272 #if DMDV2 4267 4273 if ((t->value == TOKconst || 4268 4274 t->value == TOKinvariant || … … 5229 5235 5230 5236 case TOKimport: 5231 5237 { 5232 5238 nextToken(); 5233 5239 check(TOKlparen, "import"); 5234 5240 e = parseAssignExp(); 5235 5241 check(TOKrparen); 5236 5242 e = new FileExp(loc, e); 5237 5243 break; 5238 5244 } 5239 5245 5240 5246 case TOKlparen: 5241 5247 if (peekPastParen(&token)->value == TOKlcurly) 5242 5248 { // (arguments) { statements... } 5243 5249 save = TOKdelegate; 5244 5250 goto case_delegate; 5245 5251 } 5246 5252 // ( expression ) 5247 5253 nextToken(); 5248 5254 e = parseExpression(); 5255 e->parens = 1; 5249 5256 check(loc, TOKrparen); 5250 5257 break; 5251 5258 5252 5259 case TOKlbracket: 5253 5260 { /* Parse array literals and associative array literals: 5254 5261 * [ value, value, value ... ] 5255 5262 * [ key:value, key:value, key:value ... ] 5256 5263 */ 5257 5264 Expressions *values = new Expressions(); 5258 5265 Expressions *keys = NULL; 5259 5266 5260 5267 nextToken(); 5261 5268 if (token.value != TOKrbracket) 5262 5269 { 5263 5270 while (token.value != TOKeof) 5264 5271 { 5265 5272 Expression *e = parseAssignExp(); 5266 5273 if (token.value == TOKcolon && (keys || values->dim == 0)) 5267 5274 { nextToken(); 5268 5275 if (!keys) … … 5761 5768 Expression *e2; 5762 5769 Loc loc = this->loc; 5763 5770 5764 5771 e = parseAddExp(); 5765 5772 while (1) 5766 5773 { 5767 5774 switch (token.value) 5768 5775 { 5769 5776 case TOKshl: nextToken(); e2 = parseAddExp(); e = new ShlExp(loc,e,e2); continue; 5770 5777 case TOKshr: nextToken(); e2 = parseAddExp(); e = new ShrExp(loc,e,e2); continue; 5771 5778 case TOKushr: nextToken(); e2 = parseAddExp(); e = new UshrExp(loc,e,e2); continue; 5772 5779 5773 5780 default: 5774 5781 break; 5775 5782 } 5776 5783 break; 5777 5784 } 5778 5785 return e; 5779 5786 } 5780 5787 5788 #if DMDV1 5781 5789 Expression *Parser::parseRelExp() 5782 5790 { Expression *e; 5783 5791 Expression *e2; 5784 5792 enum TOK op; 5785 5793 Loc loc = this->loc; 5786 5794 5787 5795 e = parseShiftExp(); 5788 5796 while (1) 5789 5797 { 5790 5798 switch (token.value) 5791 5799 { 5792 5800 case TOKlt: 5793 5801 case TOKle: 5794 5802 case TOKgt: 5795 5803 case TOKge: 5796 5804 case TOKunord: 5797 5805 case TOKlg: 5798 5806 case TOKleg: 5799 5807 case TOKule: 5800 5808 case TOKul: 5801 5809 case TOKuge: 5802 5810 case TOKug: 5803 5811 case TOKue: 5804 5812 op = token.value; 5805 5813 nextToken(); 5806 5814 e2 = parseShiftExp(); 5807 5815 e = new CmpExp(op, loc, e, e2); 5808 5816 continue; 5809 5817 5810 5818 case TOKnot: // could be !in 5811 printf("test1\n");5812 5819 if (peekNext() == TOKin) 5813 5820 { 5814 printf("test2\n");5815 5821 nextToken(); 5816 5822 nextToken(); 5817 5823 e2 = parseShiftExp(); 5818 5824 e = new InExp(loc, e, e2); 5819 5825 e = new NotExp(loc, e); 5820 5826 continue; 5821 5827 } 5822 5828 break; 5823 5829 5824 5830 case TOKin: 5825 5831 nextToken(); 5826 5832 e2 = parseShiftExp(); 5827 5833 e = new InExp(loc, e, e2); 5828 5834 continue; 5829 5835 5830 5836 default: 5831 5837 break; 5832 5838 } 5833 5839 break; 5834 5840 } 5835 5841 return e; 5836 5842 } 5837 5843 #endif 5844 5845 #if DMDV1 5838 5846 Expression *Parser::parseEqualExp() 5839 5847 { Expression *e; 5840 5848 Expression *e2; 5841 5849 Token *t; 5842 5850 Loc loc = this->loc; 5843 5851 5844 5852 e = parseRelExp(); 5845 5853 while (1) 5846 5854 { enum TOK value = token.value; 5847 5855 5848 5856 switch (value) 5849 5857 { 5850 5858 case TOKequal: 5851 5859 case TOKnotequal: 5852 5860 nextToken(); 5853 5861 e2 = parseRelExp(); 5854 5862 e = new EqualExp(value, loc, e, e2); 5855 5863 continue; 5856 5864 5857 5865 case TOKidentity: … … 5871 5879 t = peek(&token); 5872 5880 if (t->value != TOKis) 5873 5881 break; 5874 5882 nextToken(); 5875 5883 value = TOKnotidentity; 5876 5884 goto L1; 5877 5885 5878 5886 L1: 5879 5887 nextToken(); 5880 5888 e2 = parseRelExp(); 5881 5889 e = new IdentityExp(value, loc, e, e2); 5882 5890 continue; 5883 5891 5884 5892 default: 5885 5893 break; 5886 5894 } 5887 5895 break; 5888 5896 } 5889 5897 return e; 5890 5898 } 5899 #endif 5891 5900 5892 5901 Expression *Parser::parseCmpExp() 5893 5902 { Expression *e; 5894 5903 Expression *e2; 5895 5904 Token *t; 5896 5905 Loc loc = this->loc; 5897 5906 5898 5907 e = parseShiftExp(); 5899 5908 enum TOK op = token.value; 5900 5909 5901 5910 switch (op) 5902 5911 { 5903 5912 case TOKequal: 5904 5913 case TOKnotequal: 5905 5914 nextToken(); 5906 5915 e2 = parseShiftExp(); 5907 5916 e = new EqualExp(op, loc, e, e2); 5908 5917 break; 5909 5918 5910 5919 case TOKis: … … 5948 5957 case TOKug: 5949 5958 case TOKue: 5950 5959 nextToken(); 5951 5960 e2 = parseShiftExp(); 5952 5961 e = new CmpExp(op, loc, e, e2); 5953 5962 break; 5954 5963 5955 5964 case TOKin: 5956 5965 nextToken(); 5957 5966 e2 = parseShiftExp(); 5958 5967 e = new InExp(loc, e, e2); 5959 5968 break; 5960 5969 5961 5970 default: 5962 5971 break; 5963 5972 } 5964 5973 return e; 5965 5974 } 5966 5975 5967 5976 Expression *Parser::parseAndExp() 5968 { Expression *e; 5969 Expression *e2; 5977 { 5970 5978 Loc loc = this->loc; 5971 5979 5972 if (global.params.Dversion == 1) 5973 { 5974 e = parseEqualExp(); 5975 while (token.value == TOKand) 5976 { 5977 nextToken(); 5978 e2 = parseEqualExp(); 5979 e = new AndExp(loc,e,e2); 5980 loc = this->loc; 5981 } 5982 } 5983 else 5984 { 5985 e = parseCmpExp(); 5986 while (token.value == TOKand) 5987 { 5988 nextToken(); 5989 e2 = parseCmpExp(); 5990 e = new AndExp(loc,e,e2); 5991 loc = this->loc; 5992 } 5980 Expression *e = parseCmpExp(); 5981 while (token.value == TOKand) 5982 { 5983 checkParens(TOKand, e); 5984 nextToken(); 5985 Expression *e2 = parseCmpExp(); 5986 checkParens(TOKand, e2); 5987 e = new AndExp(loc,e,e2); 5988 loc = this->loc; 5993 5989 } 5994 5990 return e; 5995 5991 } 5996 5992 5997 5993 Expression *Parser::parseXorExp() 5998 { Expression *e; 5999 Expression *e2; 5994 { 6000 5995 Loc loc = this->loc; 6001 5996 6002 e = parseAndExp();5997 Expression *e = parseAndExp(); 6003 5998 while (token.value == TOKxor) 6004 5999 { 6000 checkParens(TOKxor, e); 6005 6001 nextToken(); 6006 e2 = parseAndExp(); 6002 Expression *e2 = parseAndExp(); 6003 checkParens(TOKxor, e2); 6007 6004 e = new XorExp(loc, e, e2); 6008 6005 } 6009 6006 return e; 6010 6007 } 6011 6008 6012 6009 Expression *Parser::parseOrExp() 6013 { Expression *e; 6014 Expression *e2; 6010 { 6015 6011 Loc loc = this->loc; 6016 6012 6017 e = parseXorExp();6013 Expression *e = parseXorExp(); 6018 6014 while (token.value == TOKor) 6019 6015 { 6016 checkParens(TOKor, e); 6020 6017 nextToken(); 6021 e2 = parseXorExp(); 6018 Expression *e2 = parseXorExp(); 6019 checkParens(TOKor, e2); 6022 6020 e = new OrExp(loc, e, e2); 6023 6021 } 6024 6022 return e; 6025 6023 } 6026 6024 6027 6025 Expression *Parser::parseAndAndExp() 6028 6026 { Expression *e; 6029 6027 Expression *e2; 6030 6028 Loc loc = this->loc; 6031 6029 6032 6030 e = parseOrExp(); 6033 6031 while (token.value == TOKandand) 6034 6032 { 6035 6033 nextToken(); 6036 6034 e2 = parseOrExp(); 6037 6035 e = new AndAndExp(loc, e, e2); 6038 6036 } 6039 6037 return e; 6040 6038 } 6041 6039 … … 6241 6239 t = new TypeDArray(tsa->next); 6242 6240 } 6243 6241 else if (token.value == TOKlparen) 6244 6242 { 6245 6243 arguments = parseArguments(); 6246 6244 } 6247 6245 e = new NewExp(loc, thisexp, newargs, t, arguments); 6248 6246 return e; 6249 6247 } 6250 6248 6251 6249 /********************************************** 6252 6250 */ 6253 6251 6254 6252 void Parser::addComment(Dsymbol *s, unsigned char *blockComment) 6255 6253 { 6256 6254 s->addComment(combineComments(blockComment, token.lineComment)); 6257 6255 token.lineComment = NULL; 6258 6256 } 6259 6257 6260 6258 6261 /********************************* ***************************/ 6262 6259 /********************************** 6260 * Set operator precedence for each operator. 6261 */ 6262 6263 enum PREC precedence[TOKMAX]; 6264 6265 void initPrecedence() 6266 { 6267 precedence[TOKdotvar] = PREC_primary; 6268 precedence[TOKimport] = PREC_primary; 6269 precedence[TOKidentifier] = PREC_primary; 6270 precedence[TOKthis] = PREC_primary; 6271 precedence[TOKsuper] = PREC_primary; 6272 precedence[TOKint64] = PREC_primary; 6273 precedence[TOKfloat64] = PREC_primary; 6274 precedence[TOKnull] = PREC_primary; 6275 precedence[TOKstring] = PREC_primary; 6276 precedence[TOKarrayliteral] = PREC_primary; 6277 precedence[TOKtypeid] = PREC_primary; 6278 precedence[TOKis] = PREC_primary; 6279 precedence[TOKassert] = PREC_primary; 6280 precedence[TOKfunction] = PREC_primary; 6281 precedence[TOKvar] = PREC_primary; 6282 #if DMDV2 6283 precedence[TOKdefault] = PREC_primary; 6284 #endif 6285 6286 // post 6287 precedence[TOKdotti] = PREC_primary; 6288 precedence[TOKdot] = PREC_primary; 6289 // precedence[TOKarrow] = PREC_primary; 6290 precedence[TOKplusplus] = PREC_primary; 6291 precedence[TOKminusminus] = PREC_primary; 6292 precedence[TOKpreplusplus] = PREC_primary; 6293 precedence[TOKpreminusminus] = PREC_primary; 6294 precedence[TOKcall] = PREC_primary; 6295 precedence[TOKslice] = PREC_primary; 6296 precedence[TOKarray] = PREC_primary; 6297 6298 precedence[TOKaddress] = PREC_unary; 6299 precedence[TOKstar] = PREC_unary; 6300 precedence[TOKneg] = PREC_unary; 6301 precedence[TOKuadd] = PREC_unary; 6302 precedence[TOKnot] = PREC_unary; 6303 precedence[TOKtobool] = PREC_add; 6304 precedence[TOKtilde] = PREC_unary; 6305 precedence[TOKdelete] = PREC_unary; 6306 precedence[TOKnew] = PREC_unary; 6307 precedence[TOKcast] = PREC_unary; 6308 6309 precedence[TOKpow] = PREC_pow; 6310 6311 precedence[TOKmul] = PREC_mul; 6312 precedence[TOKdiv] = PREC_mul; 6313 precedence[TOKmod] = PREC_mul; 6314 precedence[TOKpow] = PREC_mul; 6315 6316 precedence[TOKadd] = PREC_add; 6317 precedence[TOKmin] = PREC_add; 6318 precedence[TOKcat] = PREC_add; 6319 6320 precedence[TOKshl] = PREC_shift; 6321 precedence[TOKshr] = PREC_shift; 6322 precedence[TOKushr] = PREC_shift; 6323 6324 precedence[TOKlt] = PREC_rel; 6325 precedence[TOKle] = PREC_rel; 6326 precedence[TOKgt] = PREC_rel; 6327 precedence[TOKge] = PREC_rel; 6328 precedence[TOKunord] = PREC_rel; 6329 precedence[TOKlg] = PREC_rel; 6330 precedence[TOKleg] = PREC_rel; 6331 precedence[TOKule] = PREC_rel; 6332 precedence[TOKul] = PREC_rel; 6333 precedence[TOKuge] = PREC_rel; 6334 precedence[TOKug] = PREC_rel; 6335 precedence[TOKue] = PREC_rel; 6336 precedence[TOKin] = PREC_rel; 6337 6338 #if 0 6339 precedence[TOKequal] = PREC_equal; 6340 precedence[TOKnotequal] = PREC_equal; 6341 precedence[TOKidentity] = PREC_equal; 6342 precedence[TOKnotidentity] = PREC_equal; 6343 #else 6344 /* Note that we changed precedence, so that < and != have the same 6345 * precedence. This change is in the parser, too. 6346 */ 6347 precedence[TOKequal] = PREC_rel; 6348 precedence[TOKnotequal] = PREC_rel; 6349 precedence[TOKidentity] = PREC_rel; 6350 precedence[TOKnotidentity] = PREC_rel; 6351 #endif 6352 6353 precedence[TOKand] = PREC_and; 6354 6355 precedence[TOKxor] = PREC_xor; 6356 6357 precedence[TOKor] = PREC_or; 6358 6359 precedence[TOKandand] = PREC_andand; 6360 6361 precedence[TOKoror] = PREC_oror; 6362 6363 precedence[TOKquestion] = PREC_cond; 6364 6365 precedence[TOKassign] = PREC_assign; 6366 precedence[TOKconstruct] = PREC_assign; 6367 precedence[TOKblit] = PREC_assign; 6368 precedence[TOKaddass] = PREC_assign; 6369 precedence[TOKminass] = PREC_assign; 6370 precedence[TOKcatass] = PREC_assign; 6371 precedence[TOKmulass] = PREC_assign; 6372 precedence[TOKdivass] = PREC_assign; 6373 precedence[TOKmodass] = PREC_assign; 6374 precedence[TOKpowass] = PREC_assign; 6375 precedence[TOKshlass] = PREC_assign; 6376 precedence[TOKshrass] = PREC_assign; 6377 precedence[TOKushrass] = PREC_assign; 6378 precedence[TOKandass] = PREC_assign; 6379 precedence[TOKorass] = PREC_assign; 6380 precedence[TOKxorass] = PREC_assign; 6381 6382 precedence[TOKcomma] = PREC_expr; 6383 } 6384 6385 trunk/src/parse.h
r428 r585 99 99 UnitTestDeclaration *parseUnitTest(); 100 100 NewDeclaration *parseNew(); 101 101 DeleteDeclaration *parseDelete(); 102 102 Parameters *parseParameters(int *pvarargs); 103 103 EnumDeclaration *parseEnum(); 104 104 Dsymbol *parseAggregate(); 105 105 BaseClasses *parseBaseClasses(); 106 106 Import *parseImport(Dsymbols *decldefs, int isstatic); 107 107 Type *parseType(Identifier **pident = NULL, TemplateParameters **tpl = NULL); 108 108 Type *parseBasicType(); 109 109 Type *parseBasicType2(Type *t); 110 110 Type *parseDeclarator(Type *t, Identifier **pident, TemplateParameters **tpl = NULL); 111 111 Dsymbols *parseDeclarations(StorageClass storage_class); 112 112 void parseContracts(FuncDeclaration *f); 113 113 Statement *parseStatement(int flags); 114 114 Initializer *parseInitializer(); 115 115 Expression *parseDefaultInitExp(); 116 116 void check(Loc loc, enum TOK value); 117 117 void check(enum TOK value); 118 118 void check(enum TOK value, const char *string); 119 void checkParens(enum TOK value, Expression *e); 119 120 int isDeclaration(Token *t, int needId, enum TOK endtok, Token **pt); 120 121 int isBasicType(Token **pt); 121 122 int isDeclarator(Token **pt, int *haveId, enum TOK endtok); 122 123 int isParameters(Token **pt); 123 124 int isExpression(Token **pt); 124 125 int isTemplateInstance(Token *t, Token **pt); 125 126 int skipParens(Token *t, Token **pt); 126 127 127 128 Expression *parseExpression(); 128 129 Expression *parsePrimaryExp(); 129 130 Expression *parseUnaryExp(); 130 131 Expression *parsePostExp(Expression *e); 131 132 Expression *parseMulExp(); 132 133 Expression *parseAddExp(); 133 134 Expression *parseShiftExp(); 135 #if DMDV1 134 136 Expression *parseRelExp(); 135 137 Expression *parseEqualExp(); 138 #endif 136 139 Expression *parseCmpExp(); 137 140 Expression *parseAndExp(); 138 141 Expression *parseXorExp(); 139 142 Expression *parseOrExp(); 140 143 Expression *parseAndAndExp(); 141 144 Expression *parseOrOrExp(); 142 145 Expression *parseCondExp(); 143 146 Expression *parseAssignExp(); 144 147 145 148 Expressions *parseArguments(); 146 149 147 150 Expression *parseNewExp(Expression *thisexp); 148 151 149 152 void addComment(Dsymbol *s, unsigned char *blockComment); 150 153 }; 151 154 155 // Operator precedence - greater values are higher precedence 156 157 enum PREC 158 { 159 PREC_zero, 160 PREC_expr, 161 PREC_assign, 162 PREC_cond, 163 PREC_oror, 164 PREC_andand, 165 PREC_or, 166 PREC_xor, 167 PREC_and, 168 PREC_equal, 169 PREC_rel, 170 PREC_shift, 171 PREC_add, 172 PREC_mul, 173 PREC_pow, 174 PREC_unary, 175 PREC_primary, 176 }; 177 178 extern enum PREC precedence[TOKMAX]; 179 180 void initPrecedence(); 181 152 182 #endif /* DMD_PARSE_H */
