summaryrefslogtreecommitdiff
path: root/src/pim/Parser.h
diff options
context:
space:
mode:
authorSimon 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)
commit058a2edd75debbd0297f92572316daa704bd379f (patch)
treead303f091f9a08b209b91eb34a9fcad996a3de69 /src/pim/Parser.h
parente3594aba9e05c6865d396418c028049cda92c2f3 (diff)
parent7a21ae192fe19868539956f3fe28e62b2c7c4429 (diff)
downloadpowder-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.h79
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