Make a lot of one-liner functions inline
Some checks failed
continuous-integration/drone/push Build is failing
Some checks failed
continuous-integration/drone/push Build is failing
This commit is contained in:
@@ -14,10 +14,10 @@ namespace Porygon::Parser {
|
||||
}
|
||||
|
||||
|
||||
vector<const IToken *> Lexer::Lex() {
|
||||
vector<const IToken *> tokens;
|
||||
vector<const Token *> Lexer::Lex() {
|
||||
vector<const Token *> tokens;
|
||||
while (true) {
|
||||
IToken *next = this->LexNext(this->Next());
|
||||
Token *next = this->LexNext(this->Next());
|
||||
auto nextKind = next->GetKind();
|
||||
if (nextKind != TokenKind::WhiteSpace)
|
||||
tokens.push_back(next);
|
||||
@@ -41,7 +41,7 @@ namespace Porygon::Parser {
|
||||
return next;
|
||||
}
|
||||
|
||||
IToken *Lexer::LexNext(char16_t c) {
|
||||
Token *Lexer::LexNext(char16_t c) {
|
||||
switch (c) {
|
||||
case '\0':
|
||||
return new SimpleToken(TokenKind::EndOfFile, this->_position - 1, 1);
|
||||
@@ -154,7 +154,7 @@ namespace Porygon::Parser {
|
||||
}
|
||||
}
|
||||
|
||||
IToken *Lexer::LexNumber(char16_t c) {
|
||||
Token *Lexer::LexNumber(char16_t c) {
|
||||
long int_value = CharToInt(c);
|
||||
double float_value = 0;
|
||||
short decimal_index = 0;
|
||||
@@ -201,7 +201,7 @@ namespace Porygon::Parser {
|
||||
}
|
||||
}
|
||||
|
||||
IToken *Lexer::LexIdentifierOrKeyword() {
|
||||
Token *Lexer::LexIdentifierOrKeyword() {
|
||||
auto start = this->_position - 1;
|
||||
auto end = start;
|
||||
while (true) {
|
||||
@@ -275,7 +275,7 @@ namespace Porygon::Parser {
|
||||
{'\\', '\\'},
|
||||
};
|
||||
|
||||
IToken *Lexer::LexString(char16_t c) {
|
||||
Token *Lexer::LexString(char16_t c) {
|
||||
auto start = this->_position - 1;
|
||||
auto end = start;
|
||||
char16_t last = c;
|
||||
|
||||
@@ -17,14 +17,14 @@ namespace Porygon::Parser{
|
||||
unsigned int _scriptSize;
|
||||
char16_t Peek();
|
||||
char16_t Next();
|
||||
IToken* LexNext(char16_t c);
|
||||
IToken* LexNumber(char16_t c);
|
||||
IToken* LexIdentifierOrKeyword();
|
||||
IToken* LexString(char16_t c);
|
||||
Token* LexNext(char16_t c);
|
||||
Token* LexNumber(char16_t c);
|
||||
Token* LexIdentifierOrKeyword();
|
||||
Token* LexString(char16_t c);
|
||||
public:
|
||||
Porygon::Script* ScriptData;
|
||||
|
||||
vector<const IToken*> Lex();
|
||||
vector<const Token*> Lex();
|
||||
explicit Lexer(const u16string& scriptString, Porygon::Script* script);
|
||||
|
||||
};
|
||||
|
||||
@@ -43,15 +43,15 @@ namespace Porygon::Parser {
|
||||
|
||||
virtual const ParsedExpressionKind GetKind() const = 0;
|
||||
|
||||
const unsigned int GetStartPosition() const {
|
||||
inline const unsigned int GetStartPosition() const {
|
||||
return _position;
|
||||
}
|
||||
|
||||
const unsigned int GetEndPosition() const {
|
||||
inline const unsigned int GetEndPosition() const {
|
||||
return _position + _length - 1;
|
||||
}
|
||||
|
||||
const unsigned int GetLength() const {
|
||||
inline const unsigned int GetLength() const {
|
||||
return _length;
|
||||
}
|
||||
};
|
||||
@@ -60,7 +60,7 @@ namespace Porygon::Parser {
|
||||
public:
|
||||
BadExpression(unsigned int position, unsigned int length) : ParsedExpression(position, length) {}
|
||||
|
||||
const ParsedExpressionKind GetKind() const final {
|
||||
inline const ParsedExpressionKind GetKind() const final {
|
||||
return ParsedExpressionKind::Bad;
|
||||
}
|
||||
};
|
||||
@@ -68,7 +68,7 @@ namespace Porygon::Parser {
|
||||
class LiteralIntegerExpression : public ParsedExpression {
|
||||
const long _value;
|
||||
public:
|
||||
const ParsedExpressionKind GetKind() const final {
|
||||
inline const ParsedExpressionKind GetKind() const final {
|
||||
return ParsedExpressionKind::LiteralInteger;
|
||||
}
|
||||
|
||||
@@ -77,7 +77,7 @@ namespace Porygon::Parser {
|
||||
_value(token->GetValue()) {
|
||||
}
|
||||
|
||||
const long GetValue() const {
|
||||
inline const long GetValue() const {
|
||||
return _value;
|
||||
}
|
||||
};
|
||||
@@ -85,7 +85,7 @@ namespace Porygon::Parser {
|
||||
class LiteralFloatExpression : public ParsedExpression {
|
||||
const double _value;
|
||||
public:
|
||||
const ParsedExpressionKind GetKind() const final {
|
||||
inline const ParsedExpressionKind GetKind() const final {
|
||||
return ParsedExpressionKind::LiteralFloat;
|
||||
}
|
||||
|
||||
@@ -94,7 +94,7 @@ namespace Porygon::Parser {
|
||||
_value(token->GetValue()) {
|
||||
}
|
||||
|
||||
const double GetValue() const {
|
||||
inline const double GetValue() const {
|
||||
return _value;
|
||||
}
|
||||
};
|
||||
@@ -102,16 +102,16 @@ namespace Porygon::Parser {
|
||||
class LiteralStringExpression : public ParsedExpression {
|
||||
const u16string _value;
|
||||
public:
|
||||
const ParsedExpressionKind GetKind() const final {
|
||||
inline const ParsedExpressionKind GetKind() const final {
|
||||
return ParsedExpressionKind::LiteralString;
|
||||
}
|
||||
|
||||
explicit LiteralStringExpression(const StringToken *token)
|
||||
: ParsedExpression(token->GetStartPosition(), token->GetLength()),
|
||||
_value(std::move(token->GetValue())) {
|
||||
_value(token->GetValue()) {
|
||||
}
|
||||
|
||||
const u16string &GetValue() const {
|
||||
inline const u16string &GetValue() const {
|
||||
return _value;
|
||||
}
|
||||
};
|
||||
@@ -119,16 +119,16 @@ namespace Porygon::Parser {
|
||||
class LiteralBoolExpression : public ParsedExpression {
|
||||
const bool _value;
|
||||
public:
|
||||
const ParsedExpressionKind GetKind() const final {
|
||||
inline const ParsedExpressionKind GetKind() const final {
|
||||
return ParsedExpressionKind::LiteralBool;
|
||||
}
|
||||
|
||||
explicit LiteralBoolExpression(const IToken *token)
|
||||
explicit LiteralBoolExpression(const Token *token)
|
||||
: ParsedExpression(token->GetStartPosition(), token->GetLength()),
|
||||
_value(token->GetKind() == TokenKind::TrueKeyword) {
|
||||
}
|
||||
|
||||
const bool GetValue() const {
|
||||
inline const bool GetValue() const {
|
||||
return _value;
|
||||
}
|
||||
};
|
||||
@@ -136,7 +136,7 @@ namespace Porygon::Parser {
|
||||
class VariableExpression : public ParsedExpression {
|
||||
const HashedString _value;
|
||||
public:
|
||||
const ParsedExpressionKind GetKind() const final {
|
||||
inline const ParsedExpressionKind GetKind() const final {
|
||||
return ParsedExpressionKind::Variable;
|
||||
}
|
||||
|
||||
@@ -145,7 +145,7 @@ namespace Porygon::Parser {
|
||||
_value(HashedString(token->GetValue())) {
|
||||
}
|
||||
|
||||
const HashedString GetValue() const {
|
||||
inline const HashedString GetValue() const {
|
||||
return _value;
|
||||
}
|
||||
};
|
||||
@@ -158,7 +158,7 @@ namespace Porygon::Parser {
|
||||
delete _expression;
|
||||
}
|
||||
|
||||
const ParsedExpressionKind GetKind() const final {
|
||||
inline const ParsedExpressionKind GetKind() const final {
|
||||
return ParsedExpressionKind::Parenthesized;
|
||||
}
|
||||
|
||||
@@ -166,7 +166,7 @@ namespace Porygon::Parser {
|
||||
: ParsedExpression(start, length), _expression(innerExpression) {
|
||||
}
|
||||
|
||||
const ParsedExpression *GetInnerExpression() const {
|
||||
inline const ParsedExpression *GetInnerExpression() const {
|
||||
return _expression;
|
||||
}
|
||||
};
|
||||
@@ -179,7 +179,7 @@ namespace Porygon::Parser {
|
||||
delete _operand;
|
||||
}
|
||||
|
||||
const ParsedExpressionKind GetKind() const final {
|
||||
inline const ParsedExpressionKind GetKind() const final {
|
||||
return ParsedExpressionKind::Unary;
|
||||
}
|
||||
|
||||
@@ -188,11 +188,11 @@ namespace Porygon::Parser {
|
||||
_kind(kind), _operand(operand) {
|
||||
}
|
||||
|
||||
const UnaryOperatorKind GetOperatorKind() const {
|
||||
inline const UnaryOperatorKind GetOperatorKind() const {
|
||||
return _kind;
|
||||
}
|
||||
|
||||
const ParsedExpression *GetOperand() const {
|
||||
inline const ParsedExpression *GetOperand() const {
|
||||
return _operand;
|
||||
}
|
||||
};
|
||||
@@ -207,7 +207,7 @@ namespace Porygon::Parser {
|
||||
delete _right;
|
||||
}
|
||||
|
||||
const ParsedExpressionKind GetKind() const final {
|
||||
inline const ParsedExpressionKind GetKind() const final {
|
||||
return ParsedExpressionKind::Binary;
|
||||
}
|
||||
|
||||
@@ -217,15 +217,15 @@ namespace Porygon::Parser {
|
||||
_kind(kind), _left(left), _right(right) {
|
||||
}
|
||||
|
||||
const BinaryOperatorKind GetOperatorKind() const {
|
||||
inline const BinaryOperatorKind GetOperatorKind() const {
|
||||
return _kind;
|
||||
}
|
||||
|
||||
const ParsedExpression *GetLeft() const {
|
||||
inline const ParsedExpression *GetLeft() const {
|
||||
return _left;
|
||||
}
|
||||
|
||||
const ParsedExpression *GetRight() const {
|
||||
inline const ParsedExpression *GetRight() const {
|
||||
return _right;
|
||||
}
|
||||
};
|
||||
@@ -246,15 +246,15 @@ namespace Porygon::Parser {
|
||||
}
|
||||
}
|
||||
|
||||
const ParsedExpressionKind GetKind() const final {
|
||||
inline const ParsedExpressionKind GetKind() const final {
|
||||
return ParsedExpressionKind::FunctionCall;
|
||||
}
|
||||
|
||||
const ParsedExpression *GetFunction() const {
|
||||
inline const ParsedExpression *GetFunction() const {
|
||||
return _function.get();
|
||||
}
|
||||
|
||||
const vector<const ParsedExpression *> *GetParameters() const {
|
||||
inline const vector<const ParsedExpression *> *GetParameters() const {
|
||||
return &_parameters;
|
||||
}
|
||||
};
|
||||
@@ -273,15 +273,15 @@ namespace Porygon::Parser {
|
||||
delete _indexExpression;
|
||||
}
|
||||
|
||||
const ParsedExpressionKind GetKind() const final {
|
||||
inline const ParsedExpressionKind GetKind() const final {
|
||||
return ParsedExpressionKind::Indexer;
|
||||
}
|
||||
|
||||
const ParsedExpression *GetIndexer() const {
|
||||
inline const ParsedExpression *GetIndexer() const {
|
||||
return _indexerExpression;
|
||||
}
|
||||
|
||||
const ParsedExpression *GetIndex() const {
|
||||
inline const ParsedExpression *GetIndex() const {
|
||||
return _indexExpression;
|
||||
}
|
||||
};
|
||||
@@ -299,15 +299,15 @@ namespace Porygon::Parser {
|
||||
delete _indexerExpression;
|
||||
}
|
||||
|
||||
const ParsedExpressionKind GetKind() const final {
|
||||
inline const ParsedExpressionKind GetKind() const final {
|
||||
return ParsedExpressionKind::PeriodIndexer;
|
||||
}
|
||||
|
||||
const ParsedExpression *GetIndexer() const {
|
||||
inline const ParsedExpression *GetIndexer() const {
|
||||
return _indexerExpression;
|
||||
}
|
||||
|
||||
const HashedString &GetIndex() const {
|
||||
inline const HashedString &GetIndex() const {
|
||||
return _index;
|
||||
}
|
||||
};
|
||||
@@ -327,11 +327,11 @@ namespace Porygon::Parser {
|
||||
}
|
||||
}
|
||||
|
||||
const vector<const ParsedExpression *> *GetExpressions() const {
|
||||
inline const vector<const ParsedExpression *> *GetExpressions() const {
|
||||
return &_expressions;
|
||||
}
|
||||
|
||||
const ParsedExpressionKind GetKind() const final {
|
||||
inline const ParsedExpressionKind GetKind() const final {
|
||||
return ParsedExpressionKind::NumericalTable;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -56,7 +56,7 @@ namespace Porygon::Parser {
|
||||
public:
|
||||
ParsedBadStatement(unsigned int start, unsigned int length) : ParsedStatement(start, length) {};
|
||||
|
||||
const ParsedStatementKind GetKind() const final {
|
||||
inline const ParsedStatementKind GetKind() const final {
|
||||
return ParsedStatementKind::Bad;
|
||||
}
|
||||
};
|
||||
@@ -65,7 +65,7 @@ namespace Porygon::Parser {
|
||||
public:
|
||||
ParsedBreakStatement(unsigned int start, unsigned int length) : ParsedStatement(start, length) {};
|
||||
|
||||
const ParsedStatementKind GetKind() const final {
|
||||
inline const ParsedStatementKind GetKind() const final {
|
||||
return ParsedStatementKind::Break;
|
||||
}
|
||||
};
|
||||
@@ -89,11 +89,11 @@ namespace Porygon::Parser {
|
||||
}
|
||||
}
|
||||
|
||||
const ParsedStatementKind GetKind() const override {
|
||||
inline const ParsedStatementKind GetKind() const override {
|
||||
return ParsedStatementKind::Block;
|
||||
}
|
||||
|
||||
const std::vector<const ParsedStatement *> *GetStatements() const {
|
||||
inline const std::vector<const ParsedStatement *> *GetStatements() const {
|
||||
return &_statements;
|
||||
}
|
||||
};
|
||||
@@ -103,7 +103,7 @@ namespace Porygon::Parser {
|
||||
explicit ParsedScriptStatement(vector<const ParsedStatement *> statements) : ParsedBlockStatement(
|
||||
move(statements)) {}
|
||||
|
||||
const ParsedStatementKind GetKind() const final {
|
||||
inline const ParsedStatementKind GetKind() const final {
|
||||
return ParsedStatementKind::Script;
|
||||
}
|
||||
};
|
||||
@@ -120,15 +120,15 @@ namespace Porygon::Parser {
|
||||
delete _expression;
|
||||
}
|
||||
|
||||
void NullifyExpression(){
|
||||
inline void NullifyExpression(){
|
||||
_expression = nullptr;
|
||||
}
|
||||
|
||||
const ParsedStatementKind GetKind() const final {
|
||||
inline const ParsedStatementKind GetKind() const final {
|
||||
return ParsedStatementKind::Expression;
|
||||
}
|
||||
|
||||
const ParsedExpression *GetExpression() const {
|
||||
inline const ParsedExpression *GetExpression() const {
|
||||
return _expression;
|
||||
}
|
||||
};
|
||||
@@ -151,19 +151,19 @@ namespace Porygon::Parser {
|
||||
delete _block;
|
||||
}
|
||||
|
||||
const ParsedStatementKind GetKind() const final {
|
||||
inline const ParsedStatementKind GetKind() const final {
|
||||
return ParsedStatementKind::FunctionDeclaration;
|
||||
}
|
||||
|
||||
const HashedString GetIdentifier() const {
|
||||
inline const HashedString GetIdentifier() const {
|
||||
return _identifier;
|
||||
}
|
||||
|
||||
const vector<TypedVariableIdentifier *> *GetParameters() const {
|
||||
inline const vector<TypedVariableIdentifier *> *GetParameters() const {
|
||||
return &_parameters;
|
||||
}
|
||||
|
||||
const ParsedBlockStatement *GetBlock() const {
|
||||
inline const ParsedBlockStatement *GetBlock() const {
|
||||
return _block;
|
||||
}
|
||||
};
|
||||
@@ -182,19 +182,19 @@ namespace Porygon::Parser {
|
||||
delete _expression;
|
||||
}
|
||||
|
||||
const ParsedStatementKind GetKind() const final {
|
||||
inline const ParsedStatementKind GetKind() const final {
|
||||
return ParsedStatementKind::Assignment;
|
||||
}
|
||||
|
||||
const bool IsLocal() const {
|
||||
inline const bool IsLocal() const {
|
||||
return _local;
|
||||
}
|
||||
|
||||
const HashedString GetIdentifier() const {
|
||||
inline const HashedString GetIdentifier() const {
|
||||
return _identifier;
|
||||
}
|
||||
|
||||
const ParsedExpression *GetExpression() const {
|
||||
inline const ParsedExpression *GetExpression() const {
|
||||
return _expression;
|
||||
}
|
||||
};
|
||||
@@ -214,15 +214,15 @@ namespace Porygon::Parser {
|
||||
delete _valueExpression;
|
||||
}
|
||||
|
||||
const ParsedStatementKind GetKind() const final {
|
||||
inline const ParsedStatementKind GetKind() const final {
|
||||
return ParsedStatementKind::IndexAssignment;
|
||||
}
|
||||
|
||||
const ParsedExpression *GetIndexExpression() const {
|
||||
inline const ParsedExpression *GetIndexExpression() const {
|
||||
return _indexExpression;
|
||||
}
|
||||
|
||||
const ParsedExpression *GetValueExpression() const {
|
||||
inline const ParsedExpression *GetValueExpression() const {
|
||||
return _valueExpression;
|
||||
}
|
||||
};
|
||||
@@ -239,11 +239,11 @@ namespace Porygon::Parser {
|
||||
delete _expression;
|
||||
}
|
||||
|
||||
const ParsedStatementKind GetKind() const final {
|
||||
inline const ParsedStatementKind GetKind() const final {
|
||||
return ParsedStatementKind::Return;
|
||||
}
|
||||
|
||||
const ParsedExpression *GetExpression() const {
|
||||
inline const ParsedExpression *GetExpression() const {
|
||||
return _expression;
|
||||
}
|
||||
};
|
||||
@@ -273,19 +273,19 @@ namespace Porygon::Parser {
|
||||
delete _elseStatement;
|
||||
}
|
||||
|
||||
const ParsedStatementKind GetKind() const final {
|
||||
inline const ParsedStatementKind GetKind() const final {
|
||||
return ParsedStatementKind::Conditional;
|
||||
}
|
||||
|
||||
const ParsedExpression *GetCondition() const {
|
||||
inline const ParsedExpression *GetCondition() const {
|
||||
return _condition;
|
||||
}
|
||||
|
||||
const ParsedStatement *GetBlock() const {
|
||||
inline const ParsedStatement *GetBlock() const {
|
||||
return _block;
|
||||
}
|
||||
|
||||
const ParsedStatement *GetElseStatement() const {
|
||||
inline const ParsedStatement *GetElseStatement() const {
|
||||
return _elseStatement;
|
||||
}
|
||||
};
|
||||
@@ -310,27 +310,27 @@ namespace Porygon::Parser {
|
||||
delete _block;
|
||||
}
|
||||
|
||||
const ParsedStatementKind GetKind() const final {
|
||||
inline const ParsedStatementKind GetKind() const final {
|
||||
return ParsedStatementKind::NumericalFor;
|
||||
}
|
||||
|
||||
const HashedString GetIdentifier() const{
|
||||
inline const HashedString GetIdentifier() const{
|
||||
return _identifier;
|
||||
}
|
||||
|
||||
const ParsedExpression *GetStart() const{
|
||||
inline const ParsedExpression *GetStart() const{
|
||||
return _start;
|
||||
}
|
||||
|
||||
const ParsedExpression *GetEnd() const{
|
||||
inline const ParsedExpression *GetEnd() const{
|
||||
return _end;
|
||||
}
|
||||
|
||||
const ParsedExpression *GetStep() const{
|
||||
inline const ParsedExpression *GetStep() const{
|
||||
return _step;
|
||||
}
|
||||
|
||||
const ParsedStatement *GetBlock() const{
|
||||
inline const ParsedStatement *GetBlock() const{
|
||||
return _block;
|
||||
}
|
||||
};
|
||||
@@ -352,23 +352,23 @@ namespace Porygon::Parser {
|
||||
delete _block;
|
||||
}
|
||||
|
||||
const ParsedStatementKind GetKind() const final {
|
||||
inline const ParsedStatementKind GetKind() const final {
|
||||
return ParsedStatementKind::GenericFor;
|
||||
}
|
||||
|
||||
const HashedString GetKeyIdentifier() const{
|
||||
inline const HashedString GetKeyIdentifier() const{
|
||||
return _keyIdentifier;
|
||||
}
|
||||
|
||||
const HashedString GetValueIdentifier() const{
|
||||
inline const HashedString GetValueIdentifier() const{
|
||||
return _valueIdentifier;
|
||||
}
|
||||
|
||||
const ParsedExpression* GetIteratorExpression() const{
|
||||
inline const ParsedExpression* GetIteratorExpression() const{
|
||||
return _iteratorExpression;
|
||||
}
|
||||
|
||||
const ParsedStatement* GetBlock() const{
|
||||
inline const ParsedStatement* GetBlock() const{
|
||||
return _block;
|
||||
}
|
||||
};
|
||||
@@ -386,15 +386,15 @@ namespace Porygon::Parser {
|
||||
delete _block;
|
||||
}
|
||||
|
||||
const ParsedStatementKind GetKind() const final {
|
||||
inline const ParsedStatementKind GetKind() const final {
|
||||
return ParsedStatementKind::While;
|
||||
}
|
||||
|
||||
const ParsedExpression* GetCondition(){
|
||||
inline const ParsedExpression* GetCondition(){
|
||||
return _condition;
|
||||
}
|
||||
|
||||
const ParsedStatement* GetBlock(){
|
||||
inline const ParsedStatement* GetBlock(){
|
||||
return _block;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -20,20 +20,20 @@ namespace Porygon::Parser {
|
||||
return new ParsedScriptStatement(statements);
|
||||
}
|
||||
|
||||
const IToken *Parser::Peek() {
|
||||
inline const Token *Parser::Peek() {
|
||||
return this->_tokens[_position];
|
||||
}
|
||||
|
||||
const IToken *Parser::PeekAt(int offset) {
|
||||
inline const Token *Parser::PeekAt(int offset) {
|
||||
return this->_tokens[_position + offset];
|
||||
}
|
||||
|
||||
const IToken *Parser::Next() {
|
||||
inline const Token *Parser::Next() {
|
||||
this->_position++;
|
||||
return this->_tokens[_position - 1];
|
||||
}
|
||||
|
||||
ParsedStatement *Parser::ParseStatement(const IToken *current) {
|
||||
ParsedStatement *Parser::ParseStatement(const Token *current) {
|
||||
auto currentKind = current->GetKind();
|
||||
switch (currentKind) {
|
||||
case TokenKind::LocalKeyword:
|
||||
@@ -65,9 +65,9 @@ namespace Porygon::Parser {
|
||||
return new ParsedExpressionStatement(expression);
|
||||
}
|
||||
|
||||
ParsedStatement *Parser::ParseVariableAssignment(const IToken *current) {
|
||||
ParsedStatement *Parser::ParseVariableAssignment(const Token *current) {
|
||||
bool isLocal = false;
|
||||
const IToken *identifier;
|
||||
const Token *identifier;
|
||||
if (current->GetKind() == TokenKind::LocalKeyword) {
|
||||
isLocal = true;
|
||||
identifier = this->Next();
|
||||
@@ -125,7 +125,7 @@ namespace Porygon::Parser {
|
||||
return new ParsedBlockStatement(statements);
|
||||
}
|
||||
|
||||
ParsedStatement *Parser::ParseFunctionDeclaration(const IToken *current) {
|
||||
ParsedStatement *Parser::ParseFunctionDeclaration(const Token *current) {
|
||||
auto functionIdentifierToken = this->Next();
|
||||
auto openParenthesis = this->Next();
|
||||
vector<TypedVariableIdentifier *> parameters;
|
||||
@@ -196,7 +196,7 @@ namespace Porygon::Parser {
|
||||
block->GetEndPosition() - start);
|
||||
}
|
||||
|
||||
ParsedStatement *Parser::ParseReturnStatement(const IToken *current) {
|
||||
ParsedStatement *Parser::ParseReturnStatement(const Token *current) {
|
||||
auto start = current->GetStartPosition();
|
||||
auto startLine = this -> ScriptData -> Diagnostics ->GetLineFromPosition(start);
|
||||
if (startLine != this -> ScriptData -> Diagnostics -> GetLineFromPosition(this -> Peek() -> GetStartPosition())){
|
||||
@@ -206,7 +206,7 @@ namespace Porygon::Parser {
|
||||
return new ParsedReturnStatement(expression, start, expression->GetEndPosition() - start);
|
||||
}
|
||||
|
||||
ParsedStatement *Parser::ParseIfStatement(const IToken *current) {
|
||||
ParsedStatement *Parser::ParseIfStatement(const Token *current) {
|
||||
auto condition = this->ParseExpression(this->Next());
|
||||
auto next = this->Next();
|
||||
if (next->GetKind() != TokenKind::ThenKeyword) {
|
||||
@@ -238,7 +238,7 @@ namespace Porygon::Parser {
|
||||
}
|
||||
}
|
||||
|
||||
ParsedStatement *Parser::ParseNumericForStatement(const IToken *current) {
|
||||
ParsedStatement *Parser::ParseNumericForStatement(const Token *current) {
|
||||
auto identifier = dynamic_cast<const IdentifierToken*>(current);
|
||||
this->Next(); // consume assignment token
|
||||
bool hasErrors = false;
|
||||
@@ -270,7 +270,7 @@ namespace Porygon::Parser {
|
||||
|
||||
}
|
||||
|
||||
ParsedStatement *Parser::ParseGenericForStatement(const IToken *current) {
|
||||
ParsedStatement *Parser::ParseGenericForStatement(const Token *current) {
|
||||
auto keyIdentifier = dynamic_cast<const IdentifierToken*>(current)->GetValue();
|
||||
const IdentifierToken* valueIdentifierToken = nullptr;
|
||||
bool hasErrors = false;
|
||||
@@ -314,7 +314,7 @@ namespace Porygon::Parser {
|
||||
}
|
||||
}
|
||||
|
||||
ParsedStatement *Parser::ParseWhileStatement(const IToken *current) {
|
||||
ParsedStatement *Parser::ParseWhileStatement(const Token *current) {
|
||||
auto condition = this -> ParseExpression(this -> Next());
|
||||
auto doKeyword = this -> Next();
|
||||
if (doKeyword -> GetKind() != TokenKind::DoKeyword){
|
||||
@@ -331,7 +331,7 @@ namespace Porygon::Parser {
|
||||
// Expressions //
|
||||
/////////////////
|
||||
|
||||
ParsedExpression *Parser::ParseExpression(const IToken *current) {
|
||||
ParsedExpression *Parser::ParseExpression(const Token *current) {
|
||||
auto expression = this->ParseBinaryExpression(current, OperatorPrecedence::No);
|
||||
auto peekKind = this->Peek()->GetKind();
|
||||
while (peekKind == TokenKind::OpenParenthesis ||
|
||||
@@ -447,7 +447,7 @@ namespace Porygon::Parser {
|
||||
}
|
||||
}
|
||||
|
||||
ParsedExpression *Parser::ParseBinaryExpression(const IToken *current, OperatorPrecedence parentPrecedence) {
|
||||
ParsedExpression *Parser::ParseBinaryExpression(const Token *current, OperatorPrecedence parentPrecedence) {
|
||||
OperatorPrecedence unaryPrecedence = GetUnaryPrecedence(current->GetKind());
|
||||
ParsedExpression *left;
|
||||
if (unaryPrecedence != OperatorPrecedence::No && unaryPrecedence >= parentPrecedence) {
|
||||
@@ -474,7 +474,7 @@ namespace Porygon::Parser {
|
||||
return left;
|
||||
}
|
||||
|
||||
ParsedExpression *Parser::ParsePrimaryExpression(const IToken *current) {
|
||||
ParsedExpression *Parser::ParsePrimaryExpression(const Token *current) {
|
||||
switch (current->GetKind()) {
|
||||
case TokenKind::Integer:
|
||||
return new LiteralIntegerExpression(dynamic_cast<const IntegerToken*>(current));
|
||||
@@ -502,7 +502,7 @@ namespace Porygon::Parser {
|
||||
}
|
||||
}
|
||||
|
||||
ParsedExpression *Parser::ParseParenthesizedExpression(const IToken *current) {
|
||||
ParsedExpression *Parser::ParseParenthesizedExpression(const Token *current) {
|
||||
auto next = this->Next();
|
||||
auto expression = this->ParseExpression(next);
|
||||
auto closeToken = this->Next();
|
||||
@@ -571,7 +571,7 @@ namespace Porygon::Parser {
|
||||
}
|
||||
|
||||
|
||||
ParsedExpression *Parser::ParseTableExpression(const IToken *current) {
|
||||
ParsedExpression *Parser::ParseTableExpression(const Token *current) {
|
||||
if (this->Peek()->GetKind() == TokenKind::CloseCurlyBracket) {
|
||||
this->Next();
|
||||
auto start = current->GetStartPosition();
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
#include <utility>
|
||||
|
||||
|
||||
#ifndef PORYGONLANG_PARSER_HPP
|
||||
#define PORYGONLANG_PARSER_HPP
|
||||
@@ -19,45 +21,45 @@ namespace Porygon::Parser {
|
||||
};
|
||||
|
||||
class Parser {
|
||||
vector<const IToken *> _tokens;
|
||||
vector<const Token *> _tokens;
|
||||
unsigned int _position;
|
||||
Porygon::Script *ScriptData;
|
||||
|
||||
const IToken *Peek();
|
||||
const Token *Peek();
|
||||
|
||||
const IToken *PeekAt(int offset);
|
||||
const Token *PeekAt(int offset);
|
||||
|
||||
const IToken *Next();
|
||||
const Token *Next();
|
||||
|
||||
// Statements
|
||||
|
||||
ParsedStatement *ParseStatement(const IToken *current);
|
||||
ParsedStatement *ParseVariableAssignment(const IToken *current);
|
||||
ParsedStatement *ParseStatement(const Token *current);
|
||||
ParsedStatement *ParseVariableAssignment(const Token *current);
|
||||
ParsedStatement *ParseIndexAssignment(ParsedExpression *indexer);
|
||||
ParsedBlockStatement *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);
|
||||
ParsedStatement *ParseFunctionDeclaration(const Token *current);
|
||||
ParsedStatement *ParseReturnStatement(const Token *current);
|
||||
ParsedStatement *ParseIfStatement(const Token *current);
|
||||
ParsedStatement *ParseForStatement();
|
||||
ParsedStatement *ParseNumericForStatement(const IToken *current);
|
||||
ParsedStatement *ParseGenericForStatement(const IToken *current);
|
||||
ParsedStatement *ParseWhileStatement(const IToken *current);
|
||||
ParsedStatement *ParseNumericForStatement(const Token *current);
|
||||
ParsedStatement *ParseGenericForStatement(const Token *current);
|
||||
ParsedStatement *ParseWhileStatement(const Token *current);
|
||||
|
||||
// Expressions
|
||||
|
||||
ParsedExpression *ParseExpression(const IToken *current);
|
||||
ParsedExpression *ParseBinaryExpression(const IToken *current, OperatorPrecedence parentPrecedence);
|
||||
ParsedExpression *ParsePrimaryExpression(const IToken *current);
|
||||
ParsedExpression *ParseParenthesizedExpression(const IToken *current);
|
||||
ParsedExpression *ParseExpression(const Token *current);
|
||||
ParsedExpression *ParseBinaryExpression(const Token *current, OperatorPrecedence parentPrecedence);
|
||||
ParsedExpression *ParsePrimaryExpression(const Token *current);
|
||||
ParsedExpression *ParseParenthesizedExpression(const Token *current);
|
||||
ParsedExpression *ParseFunctionCallExpression(ParsedExpression *functionExpression);
|
||||
ParsedExpression *ParseIndexExpression(ParsedExpression *indexingExpression);
|
||||
ParsedExpression *ParsePeriodIndexExpression(ParsedExpression *indexingExpression);
|
||||
ParsedExpression *ParseTableExpression(const IToken *current);
|
||||
ParsedExpression *ParseTableExpression(const Token *current);
|
||||
|
||||
public:
|
||||
ParsedScriptStatement *Parse();
|
||||
|
||||
explicit Parser(const vector<const IToken *> &tokens, Porygon::Script *scriptData) : _tokens(tokens), _position(0),
|
||||
explicit Parser(vector<const Token *> tokens, Porygon::Script *scriptData) : _tokens(std::move(tokens)), _position(0),
|
||||
ScriptData(scriptData){
|
||||
}
|
||||
|
||||
|
||||
@@ -13,113 +13,113 @@ using namespace std;
|
||||
using namespace Porygon::Utilities;
|
||||
|
||||
namespace Porygon::Parser {
|
||||
class IToken {
|
||||
class Token {
|
||||
const unsigned int _position;
|
||||
const unsigned int _length;
|
||||
public:
|
||||
virtual const TokenKind GetKind() const = 0;
|
||||
|
||||
IToken(unsigned int position, unsigned int length)
|
||||
Token(unsigned int position, unsigned int length)
|
||||
: _position(position), _length(length) {
|
||||
}
|
||||
|
||||
const unsigned int GetStartPosition() const {
|
||||
inline const unsigned int GetStartPosition() const {
|
||||
return _position;
|
||||
}
|
||||
|
||||
const unsigned int GetEndPosition() const {
|
||||
inline const unsigned int GetEndPosition() const {
|
||||
return _position + _length - 1;
|
||||
}
|
||||
|
||||
const unsigned int GetLength() const {
|
||||
inline const unsigned int GetLength() const {
|
||||
return _length;
|
||||
}
|
||||
|
||||
virtual ~IToken() = default;
|
||||
virtual ~Token() = default;
|
||||
};
|
||||
|
||||
class SimpleToken : public IToken {
|
||||
class SimpleToken : public Token {
|
||||
const TokenKind _kind;
|
||||
public:
|
||||
|
||||
explicit SimpleToken(TokenKind kind, unsigned int position, unsigned int length)
|
||||
: IToken(position, length),
|
||||
: Token(position, length),
|
||||
_kind(kind) {
|
||||
}
|
||||
|
||||
const TokenKind GetKind() const final {
|
||||
inline const TokenKind GetKind() const final {
|
||||
return _kind;
|
||||
}
|
||||
};
|
||||
|
||||
class IntegerToken : public IToken {
|
||||
class IntegerToken : public Token {
|
||||
const long _value;
|
||||
public:
|
||||
|
||||
explicit IntegerToken(long value, unsigned int position, unsigned int length)
|
||||
: IToken(position, length),
|
||||
: Token(position, length),
|
||||
_value(value) {
|
||||
}
|
||||
|
||||
const TokenKind GetKind() const final {
|
||||
inline const TokenKind GetKind() const final {
|
||||
return TokenKind::Integer;
|
||||
}
|
||||
|
||||
const long GetValue() const {
|
||||
inline const long GetValue() const {
|
||||
return _value;
|
||||
}
|
||||
};
|
||||
|
||||
class FloatToken : public IToken {
|
||||
class FloatToken : public Token {
|
||||
const double _value;
|
||||
public:
|
||||
|
||||
explicit FloatToken(double value, unsigned int position, unsigned int length)
|
||||
: IToken(position, length),
|
||||
: Token(position, length),
|
||||
_value(value) {
|
||||
}
|
||||
|
||||
const TokenKind GetKind() const final {
|
||||
inline const TokenKind GetKind() const final {
|
||||
return TokenKind::Float;
|
||||
}
|
||||
|
||||
const double GetValue() const {
|
||||
inline const double GetValue() const {
|
||||
return _value;
|
||||
}
|
||||
};
|
||||
|
||||
class StringToken : public IToken {
|
||||
class StringToken : public Token {
|
||||
const u16string _value;
|
||||
public:
|
||||
|
||||
explicit StringToken(u16string value, unsigned int position, unsigned int length)
|
||||
: IToken(position, length),
|
||||
: Token(position, length),
|
||||
_value(std::move(value)) {
|
||||
}
|
||||
|
||||
const TokenKind GetKind() const final {
|
||||
inline const TokenKind GetKind() const final {
|
||||
return TokenKind::String;
|
||||
}
|
||||
|
||||
const u16string &GetValue() const {
|
||||
inline const u16string &GetValue() const {
|
||||
return _value;
|
||||
}
|
||||
};
|
||||
|
||||
class IdentifierToken : public IToken {
|
||||
class IdentifierToken : public Token {
|
||||
const Utilities::HashedString _value;
|
||||
public:
|
||||
|
||||
explicit IdentifierToken(const HashedString value, unsigned int position, unsigned int length)
|
||||
: IToken(position, length),
|
||||
: Token(position, length),
|
||||
_value(value) {
|
||||
}
|
||||
|
||||
const TokenKind GetKind() const final {
|
||||
inline const TokenKind GetKind() const final {
|
||||
return TokenKind::Identifier;
|
||||
}
|
||||
|
||||
const HashedString GetValue() const {
|
||||
inline const HashedString GetValue() const {
|
||||
return _value;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -9,15 +9,15 @@ namespace Porygon::Parser {
|
||||
HashedString _type;
|
||||
HashedString _identifier;
|
||||
public:
|
||||
TypedVariableIdentifier(HashedString type, HashedString identifier)
|
||||
TypedVariableIdentifier(const HashedString& type, const HashedString& identifier)
|
||||
: _type(type), _identifier(identifier) {
|
||||
}
|
||||
|
||||
HashedString GetType() {
|
||||
inline HashedString GetType() {
|
||||
return _type;
|
||||
}
|
||||
|
||||
HashedString GetIdentifier() {
|
||||
inline HashedString GetIdentifier() {
|
||||
return _identifier;
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user