summaryrefslogtreecommitdiffstats
path: root/source/slang/parser.cpp
diff options
context:
space:
mode:
authorTim Foley <tfoleyNV@users.noreply.github.com>2017-06-13 14:10:10 -0700
committerGitHub <noreply@github.com>2017-06-13 14:10:10 -0700
commit5a11b47b34845874e1d8bfa28181661863645920 (patch)
treeed48ba12c7db141d517b29343b9127692e72ad8c /source/slang/parser.cpp
parent7fc4c40b17f340800d6616e0bae111606cef18cc (diff)
parentd81c347e0edcbbf181885baf2b13978c28dfc9a8 (diff)
Merge pull request #5 from tfoleyNV/cross-compile
Cross compilation
Diffstat (limited to 'source/slang/parser.cpp')
-rw-r--r--source/slang/parser.cpp74
1 files changed, 48 insertions, 26 deletions
diff --git a/source/slang/parser.cpp b/source/slang/parser.cpp
index 773e3b74b..edd77c9ae 100644
--- a/source/slang/parser.cpp
+++ b/source/slang/parser.cpp
@@ -616,26 +616,51 @@ namespace Slang
#undef CASE
- else if (AdvanceIf(parser, "__intrinsic"))
+ else if (AdvanceIf(parser, "__intrinsic_op"))
{
- auto modifier = new IntrinsicModifier();
+ auto modifier = new IntrinsicOpModifier();
modifier->Position = loc;
- if (AdvanceIf(parser, TokenType::LParent))
+ parser->ReadToken(TokenType::LParent);
+ if (parser->LookAheadToken(TokenType::IntLiterial))
+ {
+ modifier->op = (IntrinsicOp)StringToInt(parser->ReadToken().Content);
+ }
+ else
{
- if (parser->LookAheadToken(TokenType::IntLiterial))
+ modifier->opToken = parser->ReadToken(TokenType::Identifier);
+
+ modifier->op = findIntrinsicOp(modifier->opToken.Content.Buffer());
+
+ if (modifier->op == IntrinsicOp::Unknown)
{
- modifier->op = (IntrinsicOp)StringToInt(parser->ReadToken().Content);
+ parser->sink->diagnose(loc, Diagnostics::unimplemented, "unknown intrinsic op");
}
- else
- {
- modifier->opToken = parser->ReadToken(TokenType::Identifier);
+ }
+
+ parser->ReadToken(TokenType::RParent);
- modifier->op = findIntrinsicOp(modifier->opToken.Content.Buffer());
+ AddModifier(&modifierLink, modifier);
+ }
+
+ else if (AdvanceIf(parser, "__intrinsic"))
+ {
+ auto modifier = new TargetIntrinsicModifier();
+ modifier->Position = loc;
- if (modifier->op == IntrinsicOp::Unknown)
+ if (AdvanceIf(parser, TokenType::LParent))
+ {
+ modifier->targetToken = parser->ReadToken(TokenType::Identifier);
+
+ if( AdvanceIf(parser, TokenType::Comma) )
+ {
+ if( parser->LookAheadToken(TokenType::StringLiterial) )
{
- parser->sink->diagnose(loc, Diagnostics::unimplemented, "unknown intrinsic op");
+ modifier->definitionToken = parser->ReadToken();
+ }
+ else
+ {
+ modifier->definitionToken = parser->ReadToken(TokenType::Identifier);
}
}
@@ -760,21 +785,18 @@ namespace Slang
}
}
- static RefPtr<Decl> ParseUsing(
+ static RefPtr<Decl> parseImportDecl(
Parser* parser)
{
- parser->ReadToken("using");
- if (parser->tokenReader.PeekTokenType() == TokenType::StringLiterial)
- {
- auto usingDecl = new UsingFileDecl();
- usingDecl->fileName = parser->ReadToken(TokenType::StringLiterial);
- parser->ReadToken(TokenType::Semicolon);
- return usingDecl;
- }
- else
- {
- unexpected();
- }
+ parser->ReadToken("__import");
+
+ auto decl = new ImportDecl();
+ decl->nameToken = parser->ReadToken(TokenType::Identifier);
+ decl->scope = parser->currentScope;
+
+ parser->ReadToken(TokenType::Semicolon);
+
+ return decl;
}
static Token ParseDeclName(
@@ -2123,8 +2145,6 @@ parser->ReadToken(TokenType::Comma);
decl = ParseDeclaratorDecl(parser, containerDecl);
else if (parser->LookAheadToken("typedef"))
decl = ParseTypeDef(parser);
- else if (parser->LookAheadToken("using"))
- decl = ParseUsing(parser);
else if (parser->LookAheadToken("cbuffer") || parser->LookAheadToken("tbuffer"))
decl = ParseHLSLBufferDecl(parser);
else if (parser->LookAheadToken("__generic"))
@@ -2141,6 +2161,8 @@ parser->ReadToken(TokenType::Comma);
decl = ParseTraitDecl(parser);
else if(parser->LookAheadToken("__modifier"))
decl = parseModifierDecl(parser);
+ else if(parser->LookAheadToken("__import"))
+ decl = parseImportDecl(parser);
else if (AdvanceIf(parser, TokenType::Semicolon))
{
decl = new EmptyDecl();