From 1201f82850a7771ff7df18eab7996bb4c111e99f Mon Sep 17 00:00:00 2001 From: kenji21 Date: Fri, 8 Dec 2017 05:51:26 +0100 Subject: [PATCH] Add swift4 multiline example and update antlr grammar --- .../antlr/com/sleekbyte/tailor/antlr/Swift.g4 | 21 ++++++++++++++----- .../tailor/grammar/StringsAndCharacters.swift | 20 ++++++++++++++++++ 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/src/main/antlr/com/sleekbyte/tailor/antlr/Swift.g4 b/src/main/antlr/com/sleekbyte/tailor/antlr/Swift.g4 index 11b3571e..e39c89f0 100644 --- a/src/main/antlr/com/sleekbyte/tailor/antlr/Swift.g4 +++ b/src/main/antlr/com/sleekbyte/tailor/antlr/Swift.g4 @@ -671,7 +671,7 @@ selectorExpression // GRAMMAR OF A KEY PATH EXPRESSION keyPathExpression - : '#keyPath' '(' expression ')' + : '#keyPath' '(' expression ')' | '\\' expression ; @@ -899,7 +899,7 @@ swiftVersion: FloatingPointLiteral ; lineControlStatement: '#sourceLocation' '(' 'file' ':' fileName ',' 'line' ':' lineNumber ')' | '#sourceLocation' '(' ')' ; lineNumber: integerLiteral ; -fileName: StringLiteral ; +fileName: SingleStringLiteral ; // ---------- Lexical Structure ----------- @@ -1009,7 +1009,7 @@ ImplicitParameterName : '$' DecimalLiteral ; // TODO: don't allow '_' here // GRAMMAR OF A LITERAL booleanLiteral: BooleanLiteral ; -literal : numericLiteral | StringLiteral | BooleanLiteral | NilLiteral ; +literal : numericLiteral | MultiStringLiteral | SingleStringLiteral | BooleanLiteral | NilLiteral ; // GRAMMAR OF AN INTEGER LITERAL @@ -1060,13 +1060,24 @@ VersionLiteral: DecimalLiteral DecimalFraction DecimalFraction ; // GRAMMAR OF A STRING LITERAL -StringLiteral : '"' QuotedText? '"' ; +TRIPLEDQUOTES : '"""' ; + +MultiStringLiteral : TRIPLEDQUOTES '\n' .*? '\n' TRIPLEDQUOTES ; +fragment MultiQuotedText : MultiQuotedTextItem+ ; +fragment MultiQuotedTextItem : MultiInterpolatedString + | ~[\\\u000A\u000D] + ; +fragment MultiInterpolatedString: '\\(' (MultiQuotedTextItem | SingleStringLiteral)* ')'; + +// StringLiteral : '"' QuotedText? '"' ; +SingleStringLiteral : '"' QuotedText? '"' ; +fragment SingleDoubleQuote : '"' | ~["] ; fragment QuotedText : QuotedTextItem+ ; fragment QuotedTextItem : EscapedCharacter | InterpolatedString // | '\\(' expression ')' | ~["\\\u000A\u000D] ; -fragment InterpolatedString: '\\(' (QuotedTextItem | StringLiteral)* ')'; +fragment InterpolatedString: '\\(' (QuotedTextItem | SingleStringLiteral)* ')'; EscapedCharacter : '\\' [0\\tnr"'] | '\\x' HexadecimalDigit HexadecimalDigit diff --git a/src/test/swift/com/sleekbyte/tailor/grammar/StringsAndCharacters.swift b/src/test/swift/com/sleekbyte/tailor/grammar/StringsAndCharacters.swift index fec0d6bc..6c734075 100644 --- a/src/test/swift/com/sleekbyte/tailor/grammar/StringsAndCharacters.swift +++ b/src/test/swift/com/sleekbyte/tailor/grammar/StringsAndCharacters.swift @@ -3,6 +3,26 @@ let someString = "Some string literal value" var emptyString = "" // empty string literal var anotherEmptyString = String() // initializer syntax +let star = "⭐️" + +let multilineString = """ +multiline +text +""" + +let multilineStringWithVar = """ +multiline +text +with a star \(star) +""" + +let multilineStringWithEscaped = """ + You could write multi-lined strings + without "escaping" single quotes. +""" + + + if emptyString.isEmpty { print("Nothing to see here") }