Implements assignment parsing
This commit is contained in:
@@ -19,15 +19,53 @@ ParsedScriptStatement* Parser::Parse() {
|
||||
return new ParsedScriptStatement(statements);
|
||||
}
|
||||
|
||||
IToken *Parser::Peek() {
|
||||
return this -> _tokens[_position];
|
||||
}
|
||||
|
||||
IToken *Parser::Next() {
|
||||
this -> _position++;
|
||||
return this -> _tokens[_position - 1];
|
||||
}
|
||||
|
||||
ParsedStatement* Parser::ParseStatement(IToken* current){
|
||||
if (current->GetKind() == TokenKind::LocalKeyword){
|
||||
return ParseAssignment(current);
|
||||
} else if (this->Peek()->GetKind() == TokenKind::AssignmentToken){
|
||||
return ParseAssignment(current);
|
||||
}
|
||||
return new ParsedExpressionStatement(this -> ParseExpression(current));
|
||||
}
|
||||
|
||||
ParsedStatement *Parser::ParseAssignment(IToken *current) {
|
||||
bool isLocal = false;
|
||||
IToken* identifier;
|
||||
if (current -> GetKind() == TokenKind::LocalKeyword){
|
||||
isLocal = true;
|
||||
identifier = this -> Next();
|
||||
} else{
|
||||
identifier = current;
|
||||
}
|
||||
auto assignmentToken = this->Next();
|
||||
auto expression = this -> ParseExpression(this -> Next());
|
||||
|
||||
if (identifier -> GetKind() != TokenKind::Identifier){
|
||||
this -> ScriptData -> Diagnostics -> LogError(DiagnosticCode::UnexpectedToken, identifier->GetStartPosition(), identifier->GetLength());
|
||||
return new ParsedBadStatement(identifier->GetStartPosition(), identifier->GetLength());
|
||||
}
|
||||
if (assignmentToken -> GetKind() != TokenKind::AssignmentToken){
|
||||
this -> ScriptData -> Diagnostics -> LogError(DiagnosticCode::UnexpectedToken, identifier->GetStartPosition(), identifier->GetLength());
|
||||
return new ParsedBadStatement(identifier->GetStartPosition(), identifier->GetLength());
|
||||
}
|
||||
|
||||
auto start = current -> GetStartPosition();
|
||||
return new ParsedAssignmentStatement(isLocal, ((IdentifierToken*)identifier) -> Value, expression, start, expression->GetEndPosition() - start);
|
||||
}
|
||||
|
||||
ParsedExpression* Parser::ParseExpression(IToken* current){
|
||||
return this -> ParseBinaryExpression(current, OperatorPrecedence::No);
|
||||
}
|
||||
|
||||
|
||||
OperatorPrecedence GetUnaryPrecedence(TokenKind kind){
|
||||
switch (kind){
|
||||
case TokenKind::PlusToken:
|
||||
@@ -135,12 +173,4 @@ ParsedExpression *Parser::ParseParenthesizedExpression(IToken *current) {
|
||||
}
|
||||
|
||||
|
||||
IToken *Parser::Peek() {
|
||||
return this -> _tokens[_position];
|
||||
}
|
||||
|
||||
IToken *Parser::Next() {
|
||||
this -> _position++;
|
||||
return this -> _tokens[_position - 1];
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user