Parse function call
This commit is contained in:
@@ -246,6 +246,34 @@ string ExpressionVar::toString(int indent) {
|
|||||||
return "VAR(" + name + ")";
|
return "VAR(" + name + ")";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Expression Call
|
||||||
|
ExpressionCall::ExpressionCall(string name, vector<shared_ptr<Expression>> argumentExpressions):
|
||||||
|
Expression(ExpressionKind::CALL, ValueType::NONE), name(name), argumentExpressions(argumentExpressions) {
|
||||||
|
}
|
||||||
|
|
||||||
|
string ExpressionCall::getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<shared_ptr<Expression>> ExpressionCall::getArgumentExpressions() {
|
||||||
|
return argumentExpressions;
|
||||||
|
}
|
||||||
|
|
||||||
|
string ExpressionCall::toString(int indent) {
|
||||||
|
string value;
|
||||||
|
|
||||||
|
value += "CALL(" + name + "):";
|
||||||
|
for (shared_ptr<Expression> &argumentExpression : argumentExpressions) {
|
||||||
|
value += "\n";
|
||||||
|
for (int ind=0; ind<indent+1; ind++)
|
||||||
|
value += " ";
|
||||||
|
value += argumentExpression->toString(indent+1) + ",";
|
||||||
|
}
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// ExpressionInvalid
|
// ExpressionInvalid
|
||||||
ExpressionInvalid::ExpressionInvalid(shared_ptr<Token> token):
|
ExpressionInvalid::ExpressionInvalid(shared_ptr<Token> token):
|
||||||
|
|||||||
@@ -114,6 +114,20 @@ public:
|
|||||||
string toString(int indent) override;
|
string toString(int indent) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// Expression Call
|
||||||
|
class ExpressionCall: public Expression {
|
||||||
|
private:
|
||||||
|
string name;
|
||||||
|
vector<shared_ptr<Expression>> argumentExpressions;
|
||||||
|
|
||||||
|
public:
|
||||||
|
ExpressionCall(string name, vector<shared_ptr<Expression>> argumentExpressions);
|
||||||
|
string getName();
|
||||||
|
vector<shared_ptr<Expression>> getArgumentExpressions();
|
||||||
|
string toString(int indent) override;
|
||||||
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// ExpressionInvalid
|
// ExpressionInvalid
|
||||||
class ExpressionInvalid: public Expression {
|
class ExpressionInvalid: public Expression {
|
||||||
|
|||||||
@@ -264,6 +264,10 @@ shared_ptr<Expression> Parser::matchPrimary() {
|
|||||||
expression = matchExpressionLiteral();
|
expression = matchExpressionLiteral();
|
||||||
if (expression != nullptr)
|
if (expression != nullptr)
|
||||||
return expression;
|
return expression;
|
||||||
|
|
||||||
|
expression = matchExpressionCall();
|
||||||
|
if (expression != nullptr)
|
||||||
|
return expression;
|
||||||
|
|
||||||
expression = matchExpressionVar();
|
expression = matchExpressionVar();
|
||||||
if (expression != nullptr)
|
if (expression != nullptr)
|
||||||
@@ -359,7 +363,7 @@ shared_ptr<Expression> Parser::matchExpressionIfElse() {
|
|||||||
shared_ptr<Statement> elseBlock;
|
shared_ptr<Statement> elseBlock;
|
||||||
if (tryMatchingTokenKinds({TokenKind::COLON}, true, true)) {
|
if (tryMatchingTokenKinds({TokenKind::COLON}, true, true)) {
|
||||||
bool isSingleLine = !tryMatchingTokenKinds({TokenKind::NEW_LINE}, true, true);
|
bool isSingleLine = !tryMatchingTokenKinds({TokenKind::NEW_LINE}, true, true);
|
||||||
vector<TokenKind> terminalTokens = {TokenKind::SEMICOLON};
|
vector<TokenKind> terminalTokens = {TokenKind::SEMICOLON, TokenKind::COMMA, TokenKind::RIGHT_PAREN};
|
||||||
if (isSingleLine)
|
if (isSingleLine)
|
||||||
terminalTokens.push_back(TokenKind::NEW_LINE);
|
terminalTokens.push_back(TokenKind::NEW_LINE);
|
||||||
|
|
||||||
@@ -383,6 +387,31 @@ shared_ptr<Expression> Parser::matchExpressionVar() {
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
shared_ptr<Expression> Parser::matchExpressionCall() {
|
||||||
|
if (!tryMatchingTokenKinds({TokenKind::IDENTIFIER, TokenKind::LEFT_PAREN}, true, false))
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
shared_ptr<Token> identifierToken = tokens.at(currentIndex);
|
||||||
|
currentIndex++; // identifier
|
||||||
|
currentIndex++; // left parenthesis
|
||||||
|
|
||||||
|
vector<shared_ptr<Expression>> argumentExpressions;
|
||||||
|
do {
|
||||||
|
tryMatchingTokenKinds({TokenKind::NEW_LINE}, true, true); // optional new line
|
||||||
|
|
||||||
|
shared_ptr<Expression> argumentExpression = nextExpression();
|
||||||
|
if (argumentExpression == nullptr || !argumentExpression->isValid())
|
||||||
|
return argumentExpression;
|
||||||
|
argumentExpressions.push_back(argumentExpression);
|
||||||
|
} while (tryMatchingTokenKinds({TokenKind::COMMA}, true, true));
|
||||||
|
|
||||||
|
tryMatchingTokenKinds({TokenKind::NEW_LINE}, true, true); // optional new line
|
||||||
|
if (!tryMatchingTokenKinds({TokenKind::RIGHT_PAREN}, true, true))
|
||||||
|
return matchExpressionInvalid();
|
||||||
|
|
||||||
|
return make_shared<ExpressionCall>(identifierToken->getLexme(), argumentExpressions);
|
||||||
|
}
|
||||||
|
|
||||||
shared_ptr<ExpressionInvalid> Parser::matchExpressionInvalid() {
|
shared_ptr<ExpressionInvalid> Parser::matchExpressionInvalid() {
|
||||||
return make_shared<ExpressionInvalid>(tokens.at(currentIndex));
|
return make_shared<ExpressionInvalid>(tokens.at(currentIndex));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ private:
|
|||||||
shared_ptr<Expression> matchExpressionBinary(shared_ptr<Expression> left);
|
shared_ptr<Expression> matchExpressionBinary(shared_ptr<Expression> left);
|
||||||
shared_ptr<Expression> matchExpressionIfElse();
|
shared_ptr<Expression> matchExpressionIfElse();
|
||||||
shared_ptr<Expression> matchExpressionVar();
|
shared_ptr<Expression> matchExpressionVar();
|
||||||
|
shared_ptr<Expression> matchExpressionCall();
|
||||||
shared_ptr<ExpressionInvalid> matchExpressionInvalid();
|
shared_ptr<ExpressionInvalid> matchExpressionInvalid();
|
||||||
|
|
||||||
bool tryMatchingTokenKinds(vector<TokenKind> kinds, bool shouldMatchAll, bool shouldAdvance);
|
bool tryMatchingTokenKinds(vector<TokenKind> kinds, bool shouldMatchAll, bool shouldAdvance);
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ enum class ExpressionKind {
|
|||||||
BINARY,
|
BINARY,
|
||||||
IF_ELSE,
|
IF_ELSE,
|
||||||
VAR,
|
VAR,
|
||||||
|
CALL,
|
||||||
INVALID
|
INVALID
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user