summaryrefslogtreecommitdiffstats
path: root/modules/gdscript/gd_tokenizer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'modules/gdscript/gd_tokenizer.cpp')
-rw-r--r--modules/gdscript/gd_tokenizer.cpp30
1 files changed, 21 insertions, 9 deletions
diff --git a/modules/gdscript/gd_tokenizer.cpp b/modules/gdscript/gd_tokenizer.cpp
index 0fa83b9eb4..0f6ee41616 100644
--- a/modules/gdscript/gd_tokenizer.cpp
+++ b/modules/gdscript/gd_tokenizer.cpp
@@ -239,8 +239,7 @@ void GDTokenizerText::_advance() {
bool is_node_path = false;
- bool is_string = false;
- bool is_string_alt = false;
+ StringMode string_mode=STRING_DOUBLE_QUOTE;
switch(GETCHAR(0)) {
case 0:
@@ -538,22 +537,35 @@ void GDTokenizerText::_advance() {
is_node_path=true;
case '\'':
- is_string_alt = true;
+ string_mode=STRING_SINGLE_QUOTE;
case '"': {
- is_string = is_string_alt ? false : true;
int i=1;
+ if (string_mode==STRING_DOUBLE_QUOTE && GETCHAR(i)=='"' && GETCHAR(i+1)=='"') {
+ i+=2;
+ string_mode=STRING_MULTILINE;
+
+ }
+
+
String str;
while(true) {
- if (CharType(GETCHAR(i)==0)) {
+ if (CharType(GETCHAR(i))==0) {
_make_error("Unterminated String");
return;
- } else if( CharType(GETCHAR(i)=='"') && is_string ) {
+ } else if( string_mode==STRING_DOUBLE_QUOTE && CharType(GETCHAR(i))=='"' ) {
break;
- } else if( CharType(GETCHAR(i)=='\'') && is_string_alt ) {
- break;
- } else if (CharType(GETCHAR(i)=='\\')) {
+ } else if( string_mode==STRING_SINGLE_QUOTE && CharType(GETCHAR(i))=='\'' ) {
+ break;
+ } else if( string_mode==STRING_MULTILINE && CharType(GETCHAR(i))=='\"' && CharType(GETCHAR(i+1))=='\"' && CharType(GETCHAR(i+2))=='\"') {
+ i+=2;
+ break;
+ } else if( string_mode!=STRING_MULTILINE && CharType(GETCHAR(i))=='\n') {
+ _make_error("Unexpected EOL at String.");
+ return;
+
+ } else if (CharType(GETCHAR(i))=='\\') {
//escaped characters...
i++;
CharType next = GETCHAR(i);