Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members

parser.cpp

Go to the documentation of this file.
00001 // parser.cpp
00002 //
00003 // Copyright (C) 2002 Chris Laurel <claurel@shatters.net>
00004 //
00005 // This program is free software; you can redistribute it and/or
00006 // modify it under the terms of the GNU General Public License
00007 // as published by the Free Software Foundation; either version 2
00008 // of the License, or (at your option) any later version.
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     // TODO: Should check to see if we have something like a number
00106     // or string constant that can't possibly be a function call.  As it
00107     // is now, we treat all expressions equally.
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         // Assignment operator is right associative
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     // TODO: Verify that there are no duplicate names in the argument list
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 }

Generated on Sat Jan 14 22:30:28 2006 for Celestia by  doxygen 1.4.1