summaryrefslogtreecommitdiffstats
path: root/source/slang/parser.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2017-10-30 19:31:52 -0400
committerGitHub <noreply@github.com>2017-10-30 19:31:52 -0400
commit832d9c708891b10145c6648d893b04ca4a0b879a (patch)
treee1f44fc27bf80d94de5ac0e866c7409b2adcec22 /source/slang/parser.cpp
parentc24c173101c2c124401af77d8c513a23efac3b7e (diff)
parent3ffdf610d05a9318731bd7237da530c3d312a9a9 (diff)
Merge pull request #235 from tfoleyNV/explicit-this-expr
Support `this` expressions (explicit and implicit)
Diffstat (limited to 'source/slang/parser.cpp')
-rw-r--r--source/slang/parser.cpp57
1 files changed, 46 insertions, 11 deletions
diff --git a/source/slang/parser.cpp b/source/slang/parser.cpp
index 3a8c5b362..322f403e6 100644
--- a/source/slang/parser.cpp
+++ b/source/slang/parser.cpp
@@ -3334,6 +3334,32 @@ namespace Slang
static RefPtr<Expr> parsePrefixExpr(Parser* parser);
+ // Parse OOP `this` expression syntax
+ static RefPtr<RefObject> parseThisExpr(Parser* parser, void* /*userData*/)
+ {
+ RefPtr<ThisExpr> expr = new ThisExpr();
+ expr->scope = parser->currentScope;
+ return expr;
+ }
+
+ static RefPtr<Expr> parseBoolLitExpr(Parser* parser, bool value)
+ {
+ RefPtr<ConstantExpr> constExpr = new ConstantExpr();
+ constExpr->ConstType = ConstantExpr::ConstantType::Bool;
+ constExpr->integerValue = value ? 1 : 0;
+ return constExpr;
+ }
+
+ static RefPtr<RefObject> parseTrueExpr(Parser* parser, void* /*userData*/)
+ {
+ return parseBoolLitExpr(parser, true);
+ }
+
+ static RefPtr<RefObject> parseFalseExpr(Parser* parser, void* /*userData*/)
+ {
+ return parseBoolLitExpr(parser, false);
+ }
+
static RefPtr<Expr> parseAtomicExpr(Parser* parser)
{
switch( peekTokenType(parser) )
@@ -3577,19 +3603,18 @@ namespace Slang
case TokenType::Identifier:
{
- // TODO(tfoley): Need a name-lookup step here to resolve
- // syntactic keywords in expression context.
+ // We will perform name lookup here so that we can find syntax
+ // keywords registered for use as expressions.
+ Token nameToken = peekToken(parser);
- if (parser->LookAheadToken("true") || parser->LookAheadToken("false"))
+ RefPtr<Expr> parsedExpr;
+ if (tryParseUsingSyntaxDecl<Expr>(parser, &parsedExpr))
{
- RefPtr<ConstantExpr> constExpr = new ConstantExpr();
- auto token = parser->tokenReader.AdvanceToken();
- constExpr->token = token;
- parser->FillPosition(constExpr.Ptr());
- constExpr->ConstType = ConstantExpr::ConstantType::Bool;
- constExpr->integerValue = token.Content == "true" ? 1 : 0;
-
- return constExpr;
+ if (!parsedExpr->loc.isValid())
+ {
+ parsedExpr->loc = nameToken.loc;
+ }
+ return parsedExpr;
}
// Default behavior is just to create a name expression
@@ -4090,6 +4115,16 @@ namespace Slang
#undef MODIFIER
+ // Add syntax for expression keywords
+ #define EXPR(KEYWORD, CALLBACK) \
+ addBuiltinSyntax<Expr>(session, scope, #KEYWORD, &CALLBACK)
+
+ EXPR(this, parseThisExpr);
+ EXPR(true, parseTrueExpr);
+ EXPR(false, parseFalseExpr);
+
+ #undef EXPR
+
return moduleDecl;
}