This machine mirrors various open-source projects.
20 Gbit/s uplink.
If there are any issues or you want another project mirrored, please contact
mirror-service -=AT=- netcologne DOT de !
00001 //===-- parser/ParseExpr.cpp ---------------------------------- -*- C++ -*-===// 00002 // 00003 // This file is distributed under the MIT license. See LICENSE.txt for details. 00004 // 00005 // Copyright (C) 2009-2010, Stephen Wilson 00006 // 00007 //===----------------------------------------------------------------------===// 00008 00009 #include "comma/parser/Parser.h" 00010 00011 #include "llvm/ADT/APInt.h" 00012 00013 #include <cassert> 00014 00015 using namespace comma; 00016 00017 Node Parser::parseExpr() 00018 { 00019 return parseOperatorExpr(); 00020 } 00021 00022 Node Parser::parseOperatorExpr() 00023 { 00024 Node lhs = parseRelationalOperator(); 00025 00026 if (lhs.isInvalid()) 00027 return getInvalidNode(); 00028 00029 Lexer::Code currentKind = currentTokenCode(); 00030 if (currentKind == Lexer::TKN_AND || 00031 currentKind == Lexer::TKN_OR || 00032 currentKind == Lexer::TKN_XOR) 00033 return parseLogicalOperator(currentKind, lhs); 00034 00035 return lhs; 00036 } 00037 00038 Node Parser::parseLogicalOperator(Lexer::Code expectedKind, Node lhs) 00039 { 00040 if (currentTokenCode() == expectedKind) { 00041 Location loc = currentLocation(); 00042 IdentifierInfo *opInfo = parseFunctionIdentifier(); 00043 00044 Node rhs = parseRelationalOperator(); 00045 00046 if (rhs.isValid()) { 00047 Node prefix = client.acceptDirectName(opInfo, loc, false); 00048 if (prefix.isValid()) { 00049 NodeVector args; 00050 args.push_back(lhs); 00051 args.push_back(rhs); 00052 00053 Node op = client.acceptApplication(prefix, args); 00054 if (op.isValid()) 00055 return parseLogicalOperator(expectedKind, op); 00056 } 00057 } 00058 return getInvalidNode(); 00059 } 00060 00061 // If the current token is a logical operator diagnose that we have a 00062 // mismatch. 00063 Lexer::Code currentKind = currentTokenCode(); 00064 if (currentKind == Lexer::TKN_AND || 00065 currentKind == Lexer::TKN_OR || 00066 currentKind == Lexer::TKN_XOR) { 00067 report(diag::MIXED_LOGICAL_OPERATORS); 00068 return getInvalidNode(); 00069 } 00070 else 00071 return lhs; 00072 } 00073 00074 Node Parser::parseExponentialOperator() 00075 { 00076 IdentifierInfo *opInfo; 00077 Location loc; 00078 00079 if (currentTokenIs(Lexer::TKN_NOT)) { 00080 loc = currentLocation(); 00081 opInfo = parseFunctionIdentifier(); 00082 00083 Node operand = parsePrimaryExpr(); 00084 00085 if (operand.isValid()) { 00086 Node prefix = client.acceptDirectName(opInfo, loc, false); 00087 if (prefix.isValid()) { 00088 NodeVector args; 00089 args.push_back(operand); 00090 return client.acceptApplication(prefix, args); 00091 } 00092 } 00093 return getInvalidNode(); 00094 } 00095 00096 Node lhs = parsePrimaryExpr(); 00097 00098 if (lhs.isInvalid()) 00099 return getInvalidNode(); 00100 00101 switch (currentTokenCode()) { 00102 00103 default: 00104 return lhs; 00105 00106 case Lexer::TKN_POW: 00107 loc = currentLocation(); 00108 opInfo = parseFunctionIdentifier(); 00109 break; 00110 } 00111 00112 // Right associativity for the exponential operator, hense the recursive 00113 // call. 00114 Node rhs = parseExponentialOperator(); 00115 00116 if (rhs.isValid()) { 00117 Node prefix = client.acceptDirectName(opInfo, loc, false); 00118 if (prefix.isValid()) { 00119 NodeVector args; 00120 args.push_back(lhs); 00121 args.push_back(rhs); 00122 return client.acceptApplication(prefix, args); 00123 } 00124 } 00125 return getInvalidNode(); 00126 } 00127 00128 Node Parser::parseMultiplicativeOperator() 00129 { 00130 IdentifierInfo *opInfo; 00131 Location loc; 00132 Node lhs = parseExponentialOperator(); 00133 00134 while (lhs.isValid()) { 00135 switch (currentTokenCode()) { 00136 00137 default: 00138 return lhs; 00139 00140 case Lexer::TKN_STAR: 00141 case Lexer::TKN_FSLASH: 00142 case Lexer::TKN_MOD: 00143 case Lexer::TKN_REM: 00144 loc = currentLocation(); 00145 opInfo = parseFunctionIdentifier(); 00146 break; 00147 } 00148 00149 Node rhs = parseExponentialOperator(); 00150 00151 if (rhs.isValid()) { 00152 Node prefix = client.acceptDirectName(opInfo, loc, false); 00153 if (prefix.isValid()) { 00154 NodeVector args; 00155 args.push_back(lhs); 00156 args.push_back(rhs); 00157 lhs = client.acceptApplication(prefix, args); 00158 continue; 00159 } 00160 } 00161 return getInvalidNode(); 00162 } 00163 return lhs; 00164 } 00165 00166 Node Parser::parseAdditiveOperator() 00167 { 00168 Node lhs = getNullNode(); 00169 00170 if (currentTokenIs(Lexer::TKN_PLUS) || currentTokenIs(Lexer::TKN_MINUS)) { 00171 Location loc = currentLocation(); 00172 IdentifierInfo *opInfo = parseFunctionIdentifier(); 00173 00174 lhs = parseMultiplicativeOperator(); 00175 00176 if (!lhs.isValid()) 00177 return getInvalidNode(); 00178 00179 Node prefix = client.acceptDirectName(opInfo, loc, false); 00180 if (prefix.isValid()) { 00181 NodeVector args; 00182 args.push_back(lhs); 00183 lhs = client.acceptApplication(prefix, args); 00184 } 00185 } 00186 else 00187 lhs = parseMultiplicativeOperator(); 00188 00189 return parseBinaryAdditiveOperator(lhs); 00190 } 00191 00192 Node Parser::parseBinaryAdditiveOperator(Node lhs) 00193 { 00194 IdentifierInfo *opInfo; 00195 Location loc; 00196 00197 while (lhs.isValid()) { 00198 switch (currentTokenCode()) { 00199 00200 default: 00201 return lhs; 00202 00203 case Lexer::TKN_PLUS: 00204 case Lexer::TKN_MINUS: 00205 loc = currentLocation(); 00206 opInfo = parseFunctionIdentifier(); 00207 break; 00208 } 00209 00210 Node rhs = parseMultiplicativeOperator(); 00211 00212 if (rhs.isValid()) { 00213 Node prefix = client.acceptDirectName(opInfo, loc, false); 00214 if (prefix.isValid()) { 00215 NodeVector args; 00216 args.push_back(lhs); 00217 args.push_back(rhs); 00218 lhs = client.acceptApplication(prefix, args); 00219 continue; 00220 } 00221 } 00222 return getInvalidNode(); 00223 } 00224 return lhs; 00225 } 00226 00227 Node Parser::parseRelationalOperator() 00228 { 00229 IdentifierInfo *opInfo; 00230 Location loc; 00231 Node lhs = parseAdditiveOperator(); 00232 00233 while (lhs.isValid()) { 00234 switch (currentTokenCode()) { 00235 00236 default: 00237 return lhs; 00238 00239 case Lexer::TKN_EQUAL: 00240 case Lexer::TKN_NEQUAL: 00241 case Lexer::TKN_LESS: 00242 case Lexer::TKN_GREAT: 00243 case Lexer::TKN_LEQ: 00244 case Lexer::TKN_GEQ: 00245 loc = currentLocation(); 00246 opInfo = parseFunctionIdentifier(); 00247 break; 00248 } 00249 00250 Node rhs = parseAdditiveOperator(); 00251 00252 if (rhs.isValid()) { 00253 Node prefix = client.acceptDirectName(opInfo, loc, false); 00254 if (prefix.isValid()) { 00255 NodeVector args; 00256 args.push_back(lhs); 00257 args.push_back(rhs); 00258 lhs = client.acceptApplication(prefix, args); 00259 continue; 00260 } 00261 } 00262 return getInvalidNode(); 00263 } 00264 return lhs; 00265 } 00266 00267 Node Parser::parseParenExpr() 00268 { 00269 assert(currentTokenIs(Lexer::TKN_LPAREN)); 00270 00271 if (aggregateFollows()) 00272 return parseAggregate(); 00273 else { 00274 ignoreToken(); // Consume the opening paren. 00275 Node result = parseExpr(); 00276 if (!reduceToken(Lexer::TKN_RPAREN)) 00277 report(diag::UNEXPECTED_TOKEN_WANTED) << 00278 currentTokenString() << ")"; 00279 return result; 00280 } 00281 } 00282 00283 Node Parser::parsePrimaryExpr() 00284 { 00285 switch (currentTokenCode()) { 00286 00287 default: { 00288 Node name = parseName(); 00289 if (qualificationFollows()) { 00290 if (name.isInvalid()) { 00291 ignoreToken(); // Ignore the quote. 00292 ignoreToken(); // Ignore the left paren. 00293 seekCloseParen(); 00294 return getInvalidNode(); 00295 } 00296 else 00297 return parseQualifiedExpr(name); 00298 } 00299 else 00300 return name; 00301 } 00302 00303 case Lexer::TKN_LPAREN: 00304 return parseParenExpr(); 00305 00306 case Lexer::TKN_INTEGER: 00307 return parseIntegerLiteral(); 00308 00309 case Lexer::TKN_STRING: 00310 return parseStringLiteral(); 00311 00312 case Lexer::TKN_NULL: 00313 return client.acceptNullExpr(ignoreToken()); 00314 00315 case Lexer::TKN_NEW: 00316 return parseAllocatorExpr(); 00317 } 00318 } 00319 00320 Node Parser::parseIntegerLiteral() 00321 { 00322 assert(currentTokenIs(Lexer::TKN_INTEGER)); 00323 00324 const char *rep = currentToken().getRep(); 00325 unsigned repLen = currentToken().getLength(); 00326 Location loc = ignoreToken(); 00327 00328 llvm::APInt value; 00329 decimalLiteralToAPInt(rep, repLen, value); 00330 return client.acceptIntegerLiteral(value, loc); 00331 } 00332 00333 Node Parser::parseStringLiteral() 00334 { 00335 assert(currentTokenIs(Lexer::TKN_STRING)); 00336 00337 const char *rep = currentToken().getRep(); 00338 unsigned repLen = currentToken().getLength(); 00339 Location loc = ignoreToken(); 00340 00341 return client.acceptStringLiteral(rep, repLen, loc); 00342 } 00343 00344 Node Parser::parseQualifiedExpr(Node qualifier) 00345 { 00346 assert(qualificationFollows()); 00347 00348 ignoreToken(); // Ignore the quote. 00349 Node operand = parseParenExpr(); 00350 00351 if (operand.isValid()) 00352 return client.acceptQualifiedExpr(qualifier, operand); 00353 return getInvalidNode(); 00354 } 00355 00356 Node Parser::parseAllocatorExpr() 00357 { 00358 assert(currentTokenIs(Lexer::TKN_NEW)); 00359 00360 Location loc = ignoreToken(); // Ignore the "new" token. 00361 00362 // FIXME: We should be parsing a general subtype indication as opposed to a 00363 // simple name. 00364 Node operand = parseName(); 00365 00366 if (operand.isInvalid()) { 00367 // Consume a qualified expression if possible. 00368 if (qualificationFollows()) { 00369 ignoreToken(); // Ignore the quote. 00370 ignoreToken(); // Ignore the left paren. 00371 seekCloseParen(); 00372 } 00373 return getInvalidNode(); 00374 } 00375 00376 if (qualificationFollows()) { 00377 operand = parseQualifiedExpr(operand); 00378 if (operand.isInvalid()) 00379 return getInvalidNode(); 00380 } 00381 00382 return client.acceptAllocatorExpr(operand, loc); 00383 } 00384 00385 Node Parser::parseOthersExpr() 00386 { 00387 assert(currentTokenIs(Lexer::TKN_OTHERS)); 00388 Location loc = ignoreToken(); 00389 00390 if (!requireToken(Lexer::TKN_RDARROW)) 00391 return getInvalidNode(); 00392 00393 // Return a null node when we hit a TKN_DIAMOND, otherwise parse the 00394 // expression. 00395 Node result = getNullNode(); 00396 if (!reduceToken(Lexer::TKN_DIAMOND)) 00397 result = parseExpr(); 00398 00399 // Diagnose that an others expression must come last if anything but a 00400 // closing paren is next on the stream. 00401 if (!currentTokenIs(Lexer::TKN_RPAREN)) { 00402 report(loc, diag::OTHERS_COMPONENT_NOT_FINAL); 00403 return getInvalidNode(); 00404 } 00405 00406 return result; 00407 } 00408 00409 bool Parser::parseAggregateComponent(bool &seenKeyedComponent) 00410 { 00411 NodeVector keys; 00412 00413 do { 00414 Location loc = currentLocation(); 00415 00416 // Check for the special case of an identifier followed by a `=>' or 00417 // `|'. 00418 if (currentTokenIs(Lexer::TKN_IDENTIFIER) && 00419 (nextTokenIs(Lexer::TKN_RDARROW) || nextTokenIs(Lexer::TKN_BAR))) { 00420 IdentifierInfo *name = parseIdentifier(); 00421 Node key = client.acceptAggregateKey(name, loc); 00422 if (key.isValid()) 00423 keys.push_back(key); 00424 continue; 00425 } 00426 00427 Node lower = parseExpr(); 00428 if (lower.isInvalid()) { 00429 seekTokens(Lexer::TKN_BAR, Lexer::TKN_COMMA, Lexer::TKN_RPAREN); 00430 continue; 00431 } 00432 00433 if (currentTokenIs(Lexer::TKN_COMMA) || 00434 currentTokenIs(Lexer::TKN_RPAREN)) { 00435 if (seenKeyedComponent) { 00436 report(loc, diag::POSITIONAL_FOLLOWING_KEYED_COMPONENT); 00437 seekCloseParen(); 00438 return false; 00439 } 00440 client.acceptPositionalAggregateComponent(lower); 00441 return true; 00442 } 00443 00444 if (reduceToken(Lexer::TKN_DDOT)) { 00445 Node upper = parseExpr(); 00446 if (upper.isInvalid()) 00447 seekTokens(Lexer::TKN_BAR, Lexer::TKN_COMMA, Lexer::TKN_RPAREN); 00448 else { 00449 Node key = client.acceptAggregateKey(lower, upper); 00450 if (key.isValid()) 00451 keys.push_back(key); 00452 } 00453 } 00454 else { 00455 Node key = client.acceptAggregateKey(lower); 00456 if (key.isValid()) 00457 keys.push_back(key); 00458 } 00459 } while (reduceToken(Lexer::TKN_BAR)); 00460 00461 seenKeyedComponent = true; 00462 if (requireToken(Lexer::TKN_RDARROW)) { 00463 Node expr = getNullNode(); 00464 Location loc = currentLocation(); 00465 if (!reduceToken(Lexer::TKN_DIAMOND)) 00466 expr = parseExpr(); 00467 if (expr.isValid()) 00468 client.acceptKeyedAggregateComponent(keys, expr, loc); 00469 } 00470 return true; 00471 } 00472 00473 Node Parser::parseAggregate() 00474 { 00475 assert(currentTokenIs(Lexer::TKN_LPAREN)); 00476 00477 client.beginAggregate(ignoreToken()); 00478 bool seenKeyedComponent = false; 00479 00480 // Parse each component. 00481 do { 00482 if (currentTokenIs(Lexer::TKN_OTHERS)) { 00483 Location loc = currentLocation(); 00484 Node others = parseOthersExpr(); 00485 00486 if (others.isValid()) { 00487 client.acceptAggregateOthers(loc, others); 00488 requireToken(Lexer::TKN_RPAREN); 00489 } 00490 else 00491 seekCloseParen(); 00492 return client.endAggregate(); 00493 } 00494 00495 if (!parseAggregateComponent(seenKeyedComponent)) 00496 return getInvalidNode(); 00497 00498 } while (reduceToken(Lexer::TKN_COMMA)); 00499 00500 requireToken(Lexer::TKN_RPAREN); 00501 return client.endAggregate(); 00502 } 00503