00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include <cassert>
00011 #include <celscript/parser.h>
00012 #include <celscript/function.h>
00013
00014 using namespace std;
00015 using namespace celx;
00016
00017
00018 Parser::Parser(Scanner& _scanner) :
00019 scanner(_scanner),
00020 loopDepth(0),
00021 funcDepth(0)
00022 {
00023 }
00024
00025
00026 Parser::~Parser()
00027 {
00028 }
00029
00030
00031 Expression* Parser::parseFinalExpression()
00032 {
00033 Scanner::TokenType tok = scanner.nextToken();
00034 if (tok == Scanner::TokenString)
00035 {
00036 return new ConstantExpression(Value(scanner.getStringValue()));
00037 }
00038 else if (tok == Scanner::TokenNumber)
00039 {
00040 return new ConstantExpression(Value(scanner.getNumberValue()));
00041 }
00042 else if (tok == Scanner::KeywordNull)
00043 {
00044 return new ConstantExpression(Value());
00045 }
00046 else if (tok == Scanner::KeywordTrue)
00047 {
00048 return new ConstantExpression(Value(true));
00049 }
00050 else if (tok == Scanner::KeywordFalse)
00051 {
00052 return new ConstantExpression(Value(false));
00053 }
00054 else if (tok == Scanner::KeywordLambda)
00055 {
00056 Function* func = parseFunction();
00057 if (func == NULL)
00058 return NULL;
00059 else
00060 return new ConstantExpression(Value(func));
00061 }
00062 else if (tok == Scanner::TokenName)
00063 {
00064 return new IdentifierExpression(scanner.getNameValue());
00065 }
00066 else
00067 {
00068 syntaxError("constant expression expected.");
00069 return NULL;
00070 }
00071 }
00072
00073 Expression* Parser::parseSubexpression()
00074 {
00075 Scanner::TokenType tok = scanner.nextToken();
00076 if (tok == Scanner::TokenOpen)
00077 {
00078 Expression* expr = parseExpression();
00079 if (expr == NULL)
00080 return NULL;
00081
00082 tok = scanner.nextToken();
00083 if (tok != Scanner::TokenClose)
00084 {
00085 syntaxError("')' expected");
00086 delete expr;
00087 return NULL;
00088 }
00089
00090 return expr;
00091 }
00092 else
00093 {
00094 scanner.pushBack();
00095 return parseFinalExpression();
00096 }
00097 }
00098
00099 Expression* Parser::parseFunctionCallExpression()
00100 {
00101 Expression* expr = parseSubexpression();
00102 if (expr == NULL)
00103 return NULL;
00104
00105
00106
00107
00108
00109 if (scanner.nextToken() != Scanner::TokenOpen)
00110 {
00111 scanner.pushBack();
00112 return expr;
00113 }
00114
00115 FunctionCallExpression* func = new FunctionCallExpression(expr);
00116
00117 Scanner::TokenType tok;
00118 for (;;)
00119 {
00120 tok = scanner.nextToken();
00121 if (tok == Scanner::TokenClose)
00122 break;
00123 scanner.pushBack();
00124
00125 Expression* arg = parseExpression();
00126 if (arg == NULL)
00127 {
00128 delete func;
00129 return NULL;
00130 }
00131
00132 func->addArgument(arg);
00133 if (scanner.nextToken() != Scanner::TokenComma)
00134 scanner.pushBack();
00135 }
00136
00137 if (tok != Scanner::TokenClose)
00138 {
00139 syntaxError(") expected in function call");
00140 delete func;
00141 return NULL;
00142 }
00143
00144 return func;
00145 }
00146
00147 Expression* Parser::parseUnaryExpression()
00148 {
00149 UnaryExpression::Operator op;
00150 Scanner::TokenType tok = scanner.nextToken();
00151 switch (tok)
00152 {
00153 case Scanner::TokenNot:
00154 op = UnaryExpression::LogicalNot;
00155 break;
00156 case Scanner::TokenMinus:
00157 op = UnaryExpression::Negate;
00158 break;
00159 default:
00160 op = UnaryExpression::InvalidOp;
00161 break;
00162 }
00163
00164 if (op == UnaryExpression::InvalidOp)
00165 {
00166 scanner.pushBack();
00167 return parseFunctionCallExpression();
00168 }
00169 else
00170 {
00171 Expression* expr = parseUnaryExpression();
00172 if (expr == NULL)
00173 return NULL;
00174 else
00175 return new UnaryExpression(op, expr);
00176 }
00177 }
00178
00179 Expression* Parser::parseMultiplyExpression()
00180 {
00181 Expression* left = parseUnaryExpression();
00182 if (left == NULL)
00183 return NULL;
00184
00185 for (;;)
00186 {
00187 Scanner::TokenType tok = scanner.nextToken();
00188 if (tok == Scanner::TokenMultiply || tok == Scanner::TokenDivide)
00189 {
00190 BinaryExpression::Operator op = BinaryExpression::Multiply;
00191 if (tok == Scanner::TokenDivide)
00192 op = BinaryExpression::Divide;
00193 Expression* right = parseUnaryExpression();
00194 if (right == NULL)
00195 {
00196 delete left;
00197 return NULL;
00198 }
00199 left = new BinaryExpression(op, left, right);
00200 }
00201 else
00202 {
00203 scanner.pushBack();
00204 return left;
00205 }
00206 }
00207 }
00208
00209 Expression* Parser::parseAddExpression()
00210 {
00211 Expression* left = parseMultiplyExpression();
00212 if (left == NULL)
00213 return NULL;
00214
00215 for (;;)
00216 {
00217 Scanner::TokenType tok = scanner.nextToken();
00218 if (tok == Scanner::TokenPlus || tok == Scanner::TokenMinus)
00219 {
00220 BinaryExpression::Operator op = BinaryExpression::Add;
00221 if (tok == Scanner::TokenMinus)
00222 op = BinaryExpression::Subtract;
00223 Expression* right = parseMultiplyExpression();
00224 if (right == NULL)
00225 {
00226 delete left;
00227 return NULL;
00228 }
00229 left = new BinaryExpression(op, left, right);
00230 }
00231 else
00232 {
00233 scanner.pushBack();
00234 return left;
00235 }
00236 }
00237 }
00238
00239 Expression* Parser::parseEqualityExpression()
00240 {
00241 Expression* left = parseAddExpression();
00242 if (left == NULL)
00243 return NULL;
00244
00245 for (;;)
00246 {
00247 Scanner::TokenType tok = scanner.nextToken();
00248 if (tok == Scanner::TokenEqual || tok == Scanner::TokenNotEqual)
00249 {
00250 BinaryExpression::Operator op = BinaryExpression::Equal;
00251 if (tok == Scanner::TokenNotEqual)
00252 op = BinaryExpression::NotEqual;
00253 Expression* right = parseAddExpression();
00254 if (right == NULL)
00255 {
00256 delete left;
00257 return NULL;
00258 }
00259 left = new BinaryExpression(op, left, right);
00260 }
00261 else
00262 {
00263 scanner.pushBack();
00264 return left;
00265 }
00266 }
00267 }
00268
00269 Expression* Parser::parseRelationalExpression()
00270 {
00271 Expression* left = parseEqualityExpression();
00272 if (left == NULL)
00273 return NULL;
00274
00275 for (;;)
00276 {
00277 Scanner::TokenType tok = scanner.nextToken();
00278 BinaryExpression::Operator op;
00279 switch (tok)
00280 {
00281 case Scanner::TokenLesser:
00282 op = BinaryExpression::Lesser;
00283 break;
00284 case Scanner::TokenGreater:
00285 op = BinaryExpression::Greater;
00286 break;
00287 case Scanner::TokenLesserEqual:
00288 op = BinaryExpression::LesserEqual;
00289 break;
00290 case Scanner::TokenGreaterEqual:
00291 op = BinaryExpression::GreaterEqual;
00292 break;
00293 default:
00294 op = BinaryExpression::InvalidOp;
00295 break;
00296 }
00297
00298 if (op != BinaryExpression::InvalidOp)
00299 {
00300 Expression* right = parseEqualityExpression();
00301 if (right == NULL)
00302 {
00303 delete left;
00304 return NULL;
00305 }
00306 left = new BinaryExpression(op, left, right);
00307 }
00308 else
00309 {
00310 scanner.pushBack();
00311 return left;
00312 }
00313 }
00314 }
00315
00316 Expression* Parser::parseAssignmentExpression()
00317 {
00318 Expression* left = parseRelationalExpression();
00319 if (left == NULL)
00320 return NULL;
00321
00322 Scanner::TokenType tok = scanner.nextToken();
00323 if (tok == Scanner::TokenAssign)
00324 {
00325
00326 Expression* right = parseAssignmentExpression();
00327 if (right == NULL)
00328 {
00329 delete left;
00330 return NULL;
00331 }
00332
00333 if (!left->isLValue())
00334 {
00335 syntaxError("lvalue expected for assignment");
00336 delete left;
00337 delete right;
00338 return NULL;
00339 }
00340
00341 return new AssignmentExpression(left, right);
00342 }
00343 else
00344 {
00345 scanner.pushBack();
00346 return left;
00347 }
00348 }
00349
00350
00351 Expression* Parser::parseExpression()
00352 {
00353 return parseAssignmentExpression();
00354 }
00355
00356
00357 Function* Parser::parseFunction()
00358 {
00359 if (scanner.nextToken() != Scanner::TokenOpen)
00360 {
00361 syntaxError("Argument list expected for function");
00362 return NULL;
00363 }
00364
00365 vector<string>* args = new vector<string>;
00366
00367 Scanner::TokenType tok;
00368 for (;;)
00369 {
00370 tok = scanner.nextToken();
00371 if (tok == Scanner::TokenClose)
00372 break;
00373
00374 if (tok != Scanner::TokenName)
00375 {
00376 delete args;
00377 return NULL;
00378 }
00379
00380 args->insert(args->end(), scanner.getNameValue());
00381 if (scanner.nextToken() != Scanner::TokenComma)
00382 scanner.pushBack();
00383 }
00384
00385 if (tok != Scanner::TokenClose)
00386 {
00387 syntaxError(") expected in function definition");
00388 delete args;
00389 return NULL;
00390 }
00391
00392
00393
00394 if (scanner.nextToken() != Scanner::TokenBeginGroup)
00395 {
00396 syntaxError("function body expected");
00397 delete args;
00398 return NULL;
00399 }
00400 scanner.pushBack();
00401
00402 funcDepth++;
00403 Statement* body = parseCompoundStatement();
00404 funcDepth--;
00405 assert(funcDepth >= 0);
00406
00407 if (body == NULL)
00408 {
00409 delete args;
00410 return NULL;
00411 }
00412 else
00413 {
00414 return new Function(args, body);
00415 }
00416 }
00417
00418
00419 Statement* Parser::parseExpressionStatement()
00420 {
00421 Expression* expr = parseExpression();
00422 if (expr == NULL)
00423 {
00424 syntaxError("Expression expected");
00425 return NULL;
00426 }
00427
00428 if (scanner.nextToken() != Scanner::TokenEndStatement)
00429 {
00430 syntaxError("; expected");
00431 delete expr;
00432 return NULL;
00433 }
00434
00435 return new ExpressionStatement(expr);
00436 }
00437
00438
00439 Statement* Parser::parseIfStatement()
00440 {
00441 Expression* condition = NULL;
00442 Statement* ifClause = NULL;
00443 Statement* elseClause = NULL;
00444
00445 if (scanner.nextToken() != Scanner::KeywordIf)
00446 {
00447 syntaxError("if statement expected");
00448 return NULL;
00449 }
00450
00451 if (scanner.nextToken() != Scanner::TokenOpen)
00452 {
00453 syntaxError("( expected");
00454 return NULL;
00455 }
00456
00457 condition = parseExpression();
00458 if (condition == NULL)
00459 return NULL;
00460
00461 if (scanner.nextToken() != Scanner::TokenClose)
00462 {
00463 syntaxError(") expected");
00464 delete condition;
00465 return NULL;
00466 }
00467
00468 ifClause = parseStatement();
00469 if (ifClause == NULL)
00470 {
00471 delete condition;
00472 return NULL;
00473 }
00474
00475 if (scanner.nextToken() != Scanner::KeywordElse)
00476 {
00477 scanner.pushBack();
00478 return new IfStatement(condition, ifClause, new EmptyStatement());
00479 }
00480
00481 elseClause = parseStatement();
00482 if (elseClause == NULL)
00483 {
00484 delete condition;
00485 delete ifClause;
00486 return NULL;
00487 }
00488
00489 return new IfStatement(condition, ifClause, elseClause);
00490 }
00491
00492
00493 Statement* Parser::parseVarStatement()
00494 {
00495 if (scanner.nextToken() != Scanner::KeywordVar)
00496 {
00497 syntaxError("var expected");
00498 return NULL;
00499 }
00500
00501 if (scanner.nextToken() != Scanner::TokenName)
00502 {
00503 syntaxError("identifier expected");
00504 return NULL;
00505 }
00506
00507 string name = scanner.getNameValue();
00508 Expression* initializer;
00509
00510 if (scanner.nextToken() != Scanner::TokenEndStatement)
00511 {
00512 if (scanner.getTokenType() != Scanner::TokenAssign)
00513 {
00514 syntaxError("variable initialiazer expected");
00515 return NULL;
00516 }
00517
00518 initializer = parseExpression();
00519 if (initializer == NULL)
00520 {
00521 return NULL;
00522 }
00523
00524 scanner.nextToken();
00525 }
00526 else
00527 {
00528 initializer = new ConstantExpression(Value());
00529 }
00530
00531 if (scanner.getTokenType() != Scanner::TokenEndStatement)
00532 {
00533 delete initializer;
00534 return NULL;
00535 }
00536 else
00537 {
00538 defineLocal(name);
00539 return new VarStatement(name, initializer);
00540 }
00541 }
00542
00543
00544 Statement* Parser::parseCompoundStatement()
00545 {
00546 if (scanner.nextToken() != Scanner::TokenBeginGroup)
00547 {
00548 syntaxError("{ expected");
00549 return NULL;
00550 }
00551
00552 beginFrame();
00553 CompoundStatement* compound = new CompoundStatement();
00554 while (scanner.nextToken() != Scanner::TokenEndGroup)
00555 {
00556 scanner.pushBack();
00557 Statement* statement = parseStatement();
00558 if (statement == NULL)
00559 {
00560 delete compound;
00561 endFrame();
00562 return NULL;
00563 }
00564
00565 compound->addStatement(statement);
00566 }
00567 endFrame();
00568
00569 return compound;
00570 }
00571
00572
00573 Statement* Parser::parseWhileStatement()
00574 {
00575 Expression* condition = NULL;
00576 Statement* body = NULL;
00577
00578 if (scanner.nextToken() != Scanner::KeywordWhile)
00579 {
00580 syntaxError("while statement expected");
00581 return NULL;
00582 }
00583
00584 if (scanner.nextToken() != Scanner::TokenOpen)
00585 {
00586 syntaxError("( expected");
00587 return NULL;
00588 }
00589
00590 condition = parseExpression();
00591 if (condition == NULL)
00592 return NULL;
00593
00594 if (scanner.nextToken() != Scanner::TokenClose)
00595 {
00596 syntaxError(") expected");
00597 delete condition;
00598 return NULL;
00599 }
00600
00601 loopDepth++;
00602 body = parseStatement();
00603 loopDepth--;
00604 assert(loopDepth >= 0);
00605
00606 if (body == NULL)
00607 {
00608 delete condition;
00609 return NULL;
00610 }
00611
00612 return new WhileStatement(condition, body);
00613 }
00614
00615 Statement* Parser::parseReturnStatement()
00616 {
00617 if (scanner.nextToken() != Scanner::KeywordReturn)
00618 {
00619 syntaxError("return statement expected");
00620 return NULL;
00621 }
00622
00623 Expression* expr = NULL;
00624 if (scanner.nextToken() == Scanner::TokenEndStatement)
00625 {
00626 expr = new ConstantExpression(Value());
00627 }
00628 else
00629 {
00630 scanner.pushBack();
00631 expr = parseExpression();
00632 if (expr == NULL)
00633 return NULL;
00634 if (scanner.nextToken() != Scanner::TokenEndStatement)
00635 {
00636 syntaxError("missing ;");
00637 delete expr;
00638 return NULL;
00639 }
00640 }
00641
00642 if (funcDepth == 0)
00643 {
00644 syntaxError("return appears outside a function");
00645 delete expr;
00646 return NULL;
00647 }
00648
00649 return new ReturnStatement(expr);
00650 }
00651
00652
00653 Statement* Parser::parseStatement()
00654 {
00655 Scanner::TokenType tok = scanner.nextToken();
00656 if (tok == Scanner::TokenEndStatement)
00657 return new EmptyStatement();
00658
00659 scanner.pushBack();
00660
00661 switch (tok)
00662 {
00663 case Scanner::KeywordIf:
00664 return parseIfStatement();
00665
00666 case Scanner::KeywordVar:
00667 return parseVarStatement();
00668
00669 case Scanner::TokenBeginGroup:
00670 return parseCompoundStatement();
00671
00672 case Scanner::KeywordWhile:
00673 return parseWhileStatement();
00674
00675 case Scanner::KeywordReturn:
00676 return parseReturnStatement();
00677
00678 default:
00679 return parseExpressionStatement();
00680 }
00681 }
00682
00683
00684 int Parser::resolveName(const std::string& name)
00685 {
00686 int i = scope.size();
00687 int stackDepth = 0;
00688 while (i-- > 0)
00689 {
00690 if (!scope[i].empty())
00691 {
00692 if (scope[i] == name)
00693 return stackDepth;
00694 stackDepth++;
00695 }
00696 }
00697
00698 return -1;
00699 }
00700
00701
00702 void Parser::defineLocal(const std::string& name)
00703 {
00704 scope.push_back(name);
00705 }
00706
00707
00708 void Parser::beginFrame()
00709 {
00710 scope.push_back("");
00711 }
00712
00713 void Parser::endFrame()
00714 {
00715 assert(!scope.empty());
00716 while (!scope.back().empty())
00717 {
00718 scope.pop_back();
00719 assert(!scope.empty());
00720 }
00721 scope.pop_back();
00722 }
00723
00724
00725 void Parser::syntaxError(const string& s)
00726 {
00727 cout << s << '\n';
00728 }