diff options
| author | Simon Robertshaw <simon@hardwired.org.uk> | 2012-11-17 19:44:09 (GMT) |
|---|---|---|
| committer | Simon Robertshaw <simon@hardwired.org.uk> | 2012-11-17 19:44:09 (GMT) |
| commit | 058a2edd75debbd0297f92572316daa704bd379f (patch) | |
| tree | ad303f091f9a08b209b91eb34a9fcad996a3de69 /src/pim/Parser.h | |
| parent | e3594aba9e05c6865d396418c028049cda92c2f3 (diff) | |
| parent | 7a21ae192fe19868539956f3fe28e62b2c7c4429 (diff) | |
| download | powder-058a2edd75debbd0297f92572316daa704bd379f.zip powder-058a2edd75debbd0297f92572316daa704bd379f.tar.gz | |
Merge branch 'master' of github.com:FacialTurd/PowderToypp
Diffstat (limited to 'src/pim/Parser.h')
| -rw-r--r-- | src/pim/Parser.h | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/src/pim/Parser.h b/src/pim/Parser.h new file mode 100644 index 0000000..9a4f736 --- /dev/null +++ b/src/pim/Parser.h @@ -0,0 +1,79 @@ +#pragma once + +#include <string> +#include <cstring> +#include <sstream> +#include "Scanner.h" +#include "Generator.h" +#include "Token.h" +namespace pim +{ + namespace compiler + { + class ParserExpectException: public std::exception + { + char * error; + public: + ParserExpectException(Token token, int expectingSymbol) { + error = strdup(std::string("Expecting " + Token::SymbolNames[expectingSymbol] + " got " + token.Source).c_str()); + } + ParserExpectException(Token token, std::string expectingString) { + error = strdup(std::string("Expecting " + expectingString + " got " + token.Source).c_str()); + } + const char * what() const throw() + { + return error; + } + ~ParserExpectException() throw() {}; + }; + class Parser + { + std::stringstream & source; + Generator * generator; + Scanner * scanner; + Token token; + Token lastToken; + std::string breakLabel; + std::string continueLabel; + std::stack<Token> previousTokens; + + void program(); + void functionList(); + void function(); + void functionCall(); + void block(); + void argumentList(); + void argument(); + void declarationList(); + void declaration(); + void identifierList(); + void statementList(); + void statement(); + void neighbourStatement(); + void ifStatement(); + void condition(std::string jumpLabel); + void assigmentStatement(); + void particleAction(); + void killStatement(); + void getStatement(); + void createStatement(); + void transformStatement(); + void expressionList(); + + void expression(); + void term(); + void factor(); + void variableValue(); + + Token forward(); + bool accept(int symbol); + bool look(int symbol); + void back(); + void expect(int symbol); + public: + Parser(std::stringstream & source_); + + std::vector<unsigned char> Compile(); + }; + } +}
\ No newline at end of file |
