diff options
| author | Tim Foley <tfoleyNV@users.noreply.github.com> | 2017-06-13 14:10:10 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-06-13 14:10:10 -0700 |
| commit | 5a11b47b34845874e1d8bfa28181661863645920 (patch) | |
| tree | ed48ba12c7db141d517b29343b9127692e72ad8c /source/slang/parser.cpp | |
| parent | 7fc4c40b17f340800d6616e0bae111606cef18cc (diff) | |
| parent | d81c347e0edcbbf181885baf2b13978c28dfc9a8 (diff) | |
Merge pull request #5 from tfoleyNV/cross-compile
Cross compilation
Diffstat (limited to 'source/slang/parser.cpp')
| -rw-r--r-- | source/slang/parser.cpp | 74 |
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(); |
