소스 검색

文本块 """

mxd 5 년 전
부모
커밋
33f0089d54

+ 1 - 1
src/main/java/org/ssssssss/script/functions/DatabaseQuery.java

@@ -222,7 +222,7 @@ public class DatabaseQuery extends HashMap<String, DatabaseQuery> {
 
 		BoundSql(String sql) {
 			MagicScriptContext context = MagicScriptContext.get();
-			this.sql = ifTokenParser.parse(sql, text -> {
+			this.sql = ifTokenParser.parse(sql.trim(), text -> {
 				AtomicBoolean ifTrue = new AtomicBoolean(false);
 				String val = ifParamTokenParser.parse("?{" + text, param -> {
 					Object result = Parser.parseExpression(new TokenStream(tokenizer.tokenize(param))).evaluate(context);

+ 2 - 2
src/main/java/org/ssssssss/script/parsing/Span.java

@@ -113,7 +113,7 @@ public class Span {
 	        return this.line;
         }
 		int lineStart = start;
-		while (true) {
+		while (lineStart < end) {
 			if (lineStart < 0) {
 				break;
 			}
@@ -142,7 +142,7 @@ public class Span {
 
 		int lineNumber = 0;
 		int idx = lineStart;
-		while (idx > 0) {
+		while (idx > 0 && idx < end) {
 			char c = source.charAt(idx);
 			if (c == '\n') {
 				lineNumber++;

+ 24 - 0
src/main/java/org/ssssssss/script/parsing/Tokenizer.java

@@ -86,6 +86,30 @@ public class Tokenizer {
                 continue;
             }
 
+            // String literal
+            if (stream.match("\"\"\"", true)) {
+                stream.startSpan();
+                boolean matchedEndQuote = false;
+                while (stream.hasMore()) {
+                    // Note: escape sequences like \n are parsed in StringLiteral
+                    if (stream.match("\\", true)) {
+                        stream.consume();
+                    }
+                    if (stream.match("\"\"\"", true)) {
+                        matchedEndQuote = true;
+                        break;
+                    }
+                    stream.consume();
+                }
+                if (!matchedEndQuote) {
+                    MagicScriptError.error("多行字符串没有结束符\"\"\"", stream.endSpan(), new StringLiteralException());
+                }
+                Span stringSpan = stream.endSpan();
+                stringSpan = stream.getSpan(stringSpan.getStart() - 1, stringSpan.getEnd() - 2);
+                tokens.add(new Token(TokenType.StringLiteral, stringSpan));
+                continue;
+            }
+
             // String literal
             if (stream.match(TokenType.DoubleQuote.getLiteral(), true)) {
                 stream.startSpan();