PorygonLang/src/Parser/Parser.hpp

70 lines
2.4 KiB
C++
Raw Normal View History

2019-05-20 15:45:03 +00:00
#ifndef PORYGONLANG_PARSER_HPP
#define PORYGONLANG_PARSER_HPP
#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
namespace Porygon::Parser {
enum class OperatorPrecedence {
No,
LogicalOr,
LogicalAnd,
Equality,
Additive,
Multiplication,
Unary,
};
2019-05-20 15:45:03 +00:00
class Parser {
vector<const IToken *> _tokens;
unsigned int _position;
Porygon::Script *ScriptData;
const IToken *Peek();
const IToken *PeekAt(int offset);
const IToken *Next();
2019-06-22 15:35:33 +00:00
// Statements
ParsedStatement *ParseStatement(const IToken *current);
ParsedStatement *ParseVariableAssignment(const IToken *current);
ParsedStatement *ParseIndexAssignment(ParsedExpression *indexer);
2019-06-22 15:35:33 +00:00
ParsedStatement *ParseBlock(const vector<TokenKind> &endTokens, const vector<const ParsedStatement *> &openStatements = {});
ParsedStatement *ParseFunctionDeclaration(const IToken *current);
ParsedStatement *ParseReturnStatement(const IToken *current);
ParsedStatement *ParseIfStatement(const IToken *current);
2019-06-27 13:55:46 +00:00
ParsedStatement *ParseForStatement();
2019-06-22 15:35:33 +00:00
ParsedStatement *ParseNumericForStatement(const IToken *current);
ParsedStatement *ParseGenericForStatement(const IToken *current);
2019-06-28 11:28:39 +00:00
ParsedStatement *ParseWhileStatement(const IToken *current);
2019-06-22 15:35:33 +00:00
// Expressions
ParsedExpression *ParseExpression(const IToken *current);
ParsedExpression *ParseBinaryExpression(const IToken *current, OperatorPrecedence parentPrecedence);
ParsedExpression *ParsePrimaryExpression(const IToken *current);
ParsedExpression *ParseParenthesizedExpression(const IToken *current);
ParsedExpression *ParseFunctionCallExpression(ParsedExpression *functionExpression);
ParsedExpression *ParseIndexExpression(ParsedExpression *indexingExpression);
ParsedExpression *ParsePeriodIndexExpression(ParsedExpression *indexingExpression);
ParsedExpression *ParseTableExpression(const IToken *current);
public:
ParsedScriptStatement *Parse();
explicit Parser(const vector<const IToken *> &tokens, Porygon::Script *scriptData) {
_tokens = tokens;
_position = 0;
ScriptData = scriptData;
}
};
}
2019-05-20 15:45:03 +00:00
#endif //PORYGONLANG_PARSER_HPP