2019-05-20 15:45:03 +00:00
|
|
|
#ifndef PORYGONLANG_PARSER_HPP
|
|
|
|
#define PORYGONLANG_PARSER_HPP
|
|
|
|
|
2019-06-01 19:38:39 +00:00
|
|
|
#include <utility>
|
|
|
|
#include <vector>
|
2019-05-20 15:45:03 +00:00
|
|
|
#include "ParsedStatements/ParsedStatement.hpp"
|
2019-05-21 12:00:14 +00:00
|
|
|
#include "../Script.hpp"
|
2019-05-20 15:45:03 +00:00
|
|
|
|
2019-06-17 16:35:12 +00:00
|
|
|
namespace Porygon::Parser {
|
|
|
|
enum class OperatorPrecedence {
|
|
|
|
No,
|
|
|
|
LogicalOr,
|
|
|
|
LogicalAnd,
|
|
|
|
Equality,
|
|
|
|
Additive,
|
|
|
|
Multiplication,
|
|
|
|
Unary,
|
|
|
|
};
|
2019-05-20 15:45:03 +00:00
|
|
|
|
2019-06-17 16:35:12 +00:00
|
|
|
class Parser {
|
2019-07-04 17:08:13 +00:00
|
|
|
vector<const Token *> _tokens;
|
2019-06-17 16:35:12 +00:00
|
|
|
unsigned int _position;
|
|
|
|
Porygon::Script *ScriptData;
|
|
|
|
|
2019-07-04 17:08:13 +00:00
|
|
|
const Token *Peek();
|
2019-06-17 16:35:12 +00:00
|
|
|
|
2019-07-04 17:08:13 +00:00
|
|
|
const Token *PeekAt(int offset);
|
2019-06-17 16:35:12 +00:00
|
|
|
|
2019-07-04 17:08:13 +00:00
|
|
|
const Token *Next();
|
2019-06-17 16:35:12 +00:00
|
|
|
|
2019-06-22 15:35:33 +00:00
|
|
|
// Statements
|
|
|
|
|
2019-07-04 17:08:13 +00:00
|
|
|
ParsedStatement *ParseStatement(const Token *current);
|
|
|
|
ParsedStatement *ParseVariableAssignment(const Token *current);
|
2019-06-17 16:35:12 +00:00
|
|
|
ParsedStatement *ParseIndexAssignment(ParsedExpression *indexer);
|
2019-07-04 16:24:49 +00:00
|
|
|
ParsedBlockStatement *ParseBlock(const vector<TokenKind> &endTokens, const vector<const ParsedStatement *> &openStatements = {});
|
2019-07-04 17:08:13 +00:00
|
|
|
ParsedStatement *ParseFunctionDeclaration(const Token *current);
|
|
|
|
ParsedStatement *ParseReturnStatement(const Token *current);
|
|
|
|
ParsedStatement *ParseIfStatement(const Token *current);
|
2019-06-27 13:55:46 +00:00
|
|
|
ParsedStatement *ParseForStatement();
|
2019-07-04 17:08:13 +00:00
|
|
|
ParsedStatement *ParseNumericForStatement(const Token *current);
|
|
|
|
ParsedStatement *ParseGenericForStatement(const Token *current);
|
|
|
|
ParsedStatement *ParseWhileStatement(const Token *current);
|
2019-06-22 15:35:33 +00:00
|
|
|
|
|
|
|
// Expressions
|
|
|
|
|
2019-07-04 17:08:13 +00:00
|
|
|
ParsedExpression *ParseExpression(const Token *current);
|
2019-08-18 13:44:55 +00:00
|
|
|
ParsedExpression *ParseComplexExpression(ParsedExpression* previous);
|
2019-07-04 17:08:13 +00:00
|
|
|
ParsedExpression *ParseBinaryExpression(const Token *current, OperatorPrecedence parentPrecedence);
|
|
|
|
ParsedExpression *ParsePrimaryExpression(const Token *current);
|
|
|
|
ParsedExpression *ParseParenthesizedExpression(const Token *current);
|
2019-06-17 16:35:12 +00:00
|
|
|
ParsedExpression *ParseFunctionCallExpression(ParsedExpression *functionExpression);
|
|
|
|
ParsedExpression *ParseIndexExpression(ParsedExpression *indexingExpression);
|
|
|
|
ParsedExpression *ParsePeriodIndexExpression(ParsedExpression *indexingExpression);
|
2019-07-04 17:08:13 +00:00
|
|
|
ParsedExpression *ParseTableExpression(const Token *current);
|
2019-06-17 16:35:12 +00:00
|
|
|
|
|
|
|
public:
|
|
|
|
ParsedScriptStatement *Parse();
|
|
|
|
|
2019-07-04 17:08:13 +00:00
|
|
|
explicit Parser(vector<const Token *> tokens, Porygon::Script *scriptData) : _tokens(std::move(tokens)), _position(0),
|
2019-07-04 16:24:49 +00:00
|
|
|
ScriptData(scriptData){
|
2019-06-17 16:35:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
};
|
|
|
|
}
|
2019-05-20 15:45:03 +00:00
|
|
|
|
|
|
|
#endif //PORYGONLANG_PARSER_HPP
|