diff options
| author | Tim Foley <tfoleyNV@users.noreply.github.com> | 2017-06-26 14:31:31 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-06-26 14:31:31 -0700 |
| commit | 8824b102a5dd5ac1f08daedd897b5994b1bf8b6d (patch) | |
| tree | 3669bf42ed6e971cde176cb422beab6c53158e8c | |
| parent | 0259ddb0a72d3b12278404847f6e30b63e97cfc3 (diff) | |
| parent | 7d97d424c0a754ec49cccfc8af6c8983e0d06d80 (diff) | |
Merge pull request #44 from tfoleyNV/string-literal-parsing-fix
Fix parsing of string literals.
| -rw-r--r-- | source/slang/emit.cpp | 31 | ||||
| -rw-r--r-- | source/slang/parser.cpp | 31 | ||||
| -rw-r--r-- | source/slang/syntax.h | 6 | ||||
| -rw-r--r-- | tests/hlsl/dxsdk/SimpleBezier11/SimpleBezier11.hlsl | 1 |
4 files changed, 64 insertions, 5 deletions
diff --git a/source/slang/emit.cpp b/source/slang/emit.cpp index eae9cd052..699294d84 100644 --- a/source/slang/emit.cpp +++ b/source/slang/emit.cpp @@ -765,6 +765,34 @@ static void emitCallExpr( emitSimpleCallExpr(context, callExpr, outerPrec); } +static void emitStringLiteral( + EmitContext* context, + String const& value) +{ + emit(context, "\""); + for (auto c : value) + { + // TODO: This needs a more complete implementation, + // especially if we want to support Unicode. + + char buffer[] = { c, 0 }; + switch (c) + { + default: + emit(context, buffer); + break; + + case '\"': emit(context, "\\\""); + case '\'': emit(context, "\\\'"); + case '\\': emit(context, "\\\\"); + case '\n': emit(context, "\\n"); + case '\r': emit(context, "\\r"); + case '\t': emit(context, "\\t"); + } + } + emit(context, "\""); +} + static void EmitExprWithPrecedence(EmitContext* context, RefPtr<ExpressionSyntaxNode> expr, int outerPrec) { bool needClose = false; @@ -874,6 +902,9 @@ static void EmitExprWithPrecedence(EmitContext* context, RefPtr<ExpressionSyntax case ConstantExpressionSyntaxNode::ConstantType::Bool: Emit(context, litExpr->IntValue ? "true" : "false"); break; + case ConstantExpressionSyntaxNode::ConstantType::String: + emitStringLiteral(context, litExpr->stringValue); + break; default: assert(!"unreachable"); break; diff --git a/source/slang/parser.cpp b/source/slang/parser.cpp index 61d7b225d..8edc3a122 100644 --- a/source/slang/parser.cpp +++ b/source/slang/parser.cpp @@ -3014,9 +3014,7 @@ namespace Slang { auto nextOpPrec = GetOpLevel(parser, parser->tokenReader.PeekTokenType()); - if((GetAssociativityFromLevel(nextOpPrec) == Associativity::Right) && (nextOpPrec != opPrec)) - break; - else if( nextOpPrec <= opPrec) + if((GetAssociativityFromLevel(nextOpPrec) == Associativity::Right) ? (nextOpPrec < opPrec) : (nextOpPrec <= opPrec)) break; right = parseInfixExprWithPrecedence(parser, right, nextOpPrec); @@ -3206,6 +3204,33 @@ namespace Slang return constExpr; } + case TokenType::StringLiterial: + { + RefPtr<ConstantExpressionSyntaxNode> constExpr = new ConstantExpressionSyntaxNode(); + auto token = parser->tokenReader.AdvanceToken(); + parser->FillPosition(constExpr.Ptr()); + constExpr->ConstType = ConstantExpressionSyntaxNode::ConstantType::String; + + if (!parser->LookAheadToken(TokenType::StringLiterial)) + { + // Easy/common case: a single string + constExpr->stringValue = getStringLiteralTokenValue(token); + } + else + { + StringBuilder sb; + sb << getStringLiteralTokenValue(token); + while (parser->LookAheadToken(TokenType::StringLiterial)) + { + token = parser->tokenReader.AdvanceToken(); + sb << getStringLiteralTokenValue(token); + } + constExpr->stringValue = sb.ProduceString(); + } + + return constExpr; + } + case TokenType::Identifier: { // TODO(tfoley): Need a name-lookup step here to resolve diff --git a/source/slang/syntax.h b/source/slang/syntax.h index 5eb62462e..7a1701b88 100644 --- a/source/slang/syntax.h +++ b/source/slang/syntax.h @@ -1917,7 +1917,10 @@ namespace Slang public: enum class ConstantType { - Int, Bool, Float + Int, + Bool, + Float, + String, }; ConstantType ConstType; union @@ -1925,6 +1928,7 @@ namespace Slang int IntValue; FloatingPointLiteralValue FloatValue; }; + String stringValue; virtual RefPtr<SyntaxNode> Accept(SyntaxVisitor * visitor) override; }; diff --git a/tests/hlsl/dxsdk/SimpleBezier11/SimpleBezier11.hlsl b/tests/hlsl/dxsdk/SimpleBezier11/SimpleBezier11.hlsl index 7b7a1489c..5558449d2 100644 --- a/tests/hlsl/dxsdk/SimpleBezier11/SimpleBezier11.hlsl +++ b/tests/hlsl/dxsdk/SimpleBezier11/SimpleBezier11.hlsl @@ -1,4 +1,3 @@ -//TEST_IGNORE_FILE: Currently failing due to Spire compiler issues. //TEST:COMPARE_HLSL: -target dxbc-assembly -profile vs_4_0 -entry BezierVS -profile hs_5_0 -entry BezierHS -profile ds_5_0 -entry BezierDS -profile ps_4_0 -entry BezierPS -entry SolidColorPS //-------------------------------------------------------------------------------------- // File: SimpleBezier11.hlsl |
