Jelajahi Sumber

Added multiple choices for multiline string delimiter, multiline strings can use [=*[ content ]=*] or {=*{ content }=*} or (=*( content )=*)

mingodad 13 tahun lalu
induk
melakukan
43f270e86e

+ 12 - 7
SquiLu-ext/pp.nut

@@ -1,3 +1,4 @@
+#!/home/mingo/bin/squilu
 function puts(s) {
 function puts(s) {
 	fd.write(s);
 	fd.write(s);
 }
 }
@@ -27,27 +28,31 @@ function preprocess(file_name){
 	local new_code = code.gsub(code_generation_begin_escaped + ".-" + code_generation_end_escaped, "");
 	local new_code = code.gsub(code_generation_begin_escaped + ".-" + code_generation_end_escaped, "");
 
 
 	new_code = new_code.gsub("(//@(.-)\n)", function(m, m2) {
 	new_code = new_code.gsub("(//@(.-)\n)", function(m, m2) {
-			return format("%s%s]====])\n%s;\nputsnl([====[\n%s", m, code_generation_begin, m2, code_generation_end)
+			return format("%s%s}====})\n%s;\nputsnl({===={\n%s", m, code_generation_begin, m2, code_generation_end)
 		});
 		});
 
 
 
 
 	new_code = new_code.gsub("(/%*SquiLu(.-)SquiLu%*/)", function(m, m2) {
 	new_code = new_code.gsub("(/%*SquiLu(.-)SquiLu%*/)", function(m, m2) {
-			return format("%s]====])\n%s\nputsnl([====[", m, m2)
+			return format("%s}====})\n%s\nputsnl({===={", m, m2)
 		});
 		});
 
 
 	local buffer = blob();
 	local buffer = blob();
-	buffer.write("putsnl([====[");
+	buffer.write("puts({===={");
 	buffer.write(new_code);
 	buffer.write(new_code);
-	buffer.write("]====])");
+	buffer.write("}====})");
 	local sqcode = buffer.tostring();
 	local sqcode = buffer.tostring();
 	
 	
 	local code_func = compilestring(sqcode, "sqcode-preprocessed");
 	local code_func = compilestring(sqcode, "sqcode-preprocessed");
 
 
-	::fd <- file(file_name + ".cpp", "w");
+	local bak_filename = file_name + ".pp.bak";
+	os.rename(file_name, bak_filename);
+
+	::fd <- file(file_name, "w");
 	code_func();
 	code_func();
 	::fd.close();
 	::fd.close();
+
 }
 }
 
 
-if(vargv.len() > 0){
-	preprocess(vargv[0]);
+if(vargv.len() > 1){
+	preprocess(vargv[1]);
 }
 }

+ 27 - 0
SquiLu/samples/test-multiline-string.nut

@@ -0,0 +1,27 @@
+//multiline strings can use [=*[ content ]=*] or  {=*{ content }=*} or (=*( content )=*)
+local str = [==[
+local str2 = {=={
+Hello !
+I'm a multiline string !	
+}==};
+]==];
+
+print(str);
+
+str = {=={
+local str2 = [==[
+Hello !
+I'm a multiline string !	
+]==];
+}==};
+
+print(str);
+
+str = (==(
+local str2 = [==[
+Hello !
+I'm a multiline string !	
+]==];
+)==);
+
+print(str);

+ 40 - 13
SquiLu/squirrel/sqlexer.cpp

@@ -113,9 +113,14 @@ SQTable * SQLexer::GetKeywords()
 	return tbl;
 	return tbl;
 }
 }
 
 
-void SQLexer::Error(const SQChar *err)
+void SQLexer::Error(const SQChar *fmt, ...)
 {
 {
-	_errfunc(_errtarget,err);
+    static SQChar temp[256];
+    va_list vl;
+    va_start(vl, fmt);
+    scvsprintf(temp, fmt, vl);
+    va_end(vl);
+	_errfunc(_errtarget,temp);
 }
 }
 
 
 void SQLexer::Next()
 void SQLexer::Next()
@@ -143,7 +148,16 @@ const SQChar *SQLexer::Tok2Str(SQInteger tok)
 }
 }
 
 
 void SQLexer::LexBlockComment()
 void SQLexer::LexBlockComment()
-{
+{
+/*
+    if(CUR_CHAR == _SC('*'))
+    {
+        NEXT();
+        if(CUR_CHAR != _SC('*')){ //document comment
+            printf("Doument comment found at line %d\n", _currentline);
+        }
+    }
+*/
 	bool done = false;
 	bool done = false;
 	while(!done) {
 	while(!done) {
 		switch(CUR_CHAR) {
 		switch(CUR_CHAR) {
@@ -254,10 +268,10 @@ SQInteger SQLexer::Lex()
 			{
 			{
 			    SQInteger ret = CUR_CHAR;
 			    SQInteger ret = CUR_CHAR;
                 NEXT();
                 NEXT();
-                if(ret == _SC('[') && CUR_CHAR == _SC('=')){
+                if((ret == _SC('[') || ret == _SC('{') || ret == _SC('(')) && CUR_CHAR == _SC('=')){
                     //lets try lua literal delimiters
                     //lets try lua literal delimiters
                     SQInteger stype;
                     SQInteger stype;
-                    if((stype=ReadString(CUR_CHAR,true))!=-1){
+                    if((stype=ReadString(ret,true))!=-1){
                         RETURN_TOKEN(stype);
                         RETURN_TOKEN(stype);
                     }
                     }
                     Error(_SC("error parsing the string"));
                     Error(_SC("error parsing the string"));
@@ -345,18 +359,31 @@ SQInteger SQLexer::ReadString(SQInteger ndelim,bool verbatim)
 {
 {
 	INIT_TEMP_STRING();
 	INIT_TEMP_STRING();
 	SQInteger start_equals = 0;
 	SQInteger start_equals = 0;
-	if(ndelim == _SC('=')){
+	SQChar cdelim1, cdelim2;
+	if(ndelim == _SC('{')){
+	    cdelim1 = _SC('{');
+	    cdelim2 = _SC('}');
+	}
+	else if(ndelim == _SC('(')){
+	    cdelim1 = _SC('(');
+	    cdelim2 = _SC(')');
+	}
+	else {
+	    cdelim1 = _SC('[');
+	    cdelim2 = _SC(']');
+	}
+	if(CUR_CHAR == _SC('=')){
 	    //lua like literal
 	    //lua like literal
 	    while(!IS_EOB() && CUR_CHAR == _SC('=')) {
 	    while(!IS_EOB() && CUR_CHAR == _SC('=')) {
 	        ++start_equals;
 	        ++start_equals;
 	        NEXT();
 	        NEXT();
 	    }
 	    }
-	    if(CUR_CHAR != _SC('[')){
+	    if(CUR_CHAR != cdelim1){
 	        //it's not a lua literal delimiter
 	        //it's not a lua literal delimiter
-	        Error(_SC("expect '[' on literal delimiter"));
+	        Error(_SC("expect '%c' on literal delimiter"), cdelim1);
 	        return -1;
 	        return -1;
 	    }
 	    }
-	    ndelim = _SC(']');
+	    ndelim = cdelim2;
 	}
 	}
 	NEXT();
 	NEXT();
 	if(IS_EOB()) return -1;
 	if(IS_EOB()) return -1;
@@ -426,22 +453,22 @@ SQInteger SQLexer::ReadString(SQInteger ndelim,bool verbatim)
 		    if(CUR_CHAR == _SC('=')){
 		    if(CUR_CHAR == _SC('=')){
                 SQInteger end_equals = start_equals;
                 SQInteger end_equals = start_equals;
                 NEXT();
                 NEXT();
-                if(CUR_CHAR == _SC('=') || CUR_CHAR == _SC(']')){
+                if(CUR_CHAR == _SC('=') || CUR_CHAR == cdelim2){
                     --end_equals;
                     --end_equals;
                     while(!IS_EOB() && CUR_CHAR == _SC('=')) {
                     while(!IS_EOB() && CUR_CHAR == _SC('=')) {
                         --end_equals;
                         --end_equals;
                         NEXT();
                         NEXT();
                     }
                     }
                     if(end_equals) Error(_SC("expect same number of '=' on literal delimiter"));
                     if(end_equals) Error(_SC("expect same number of '=' on literal delimiter"));
-                    if(CUR_CHAR != _SC(']')) Error(_SC("expect ']' to close literal delimiter"));
+                    if(CUR_CHAR != cdelim2) Error(_SC("expect '%c' to close literal delimiter"), cdelim2);
                     NEXT();
                     NEXT();
                     break;
                     break;
                 }
                 }
-                APPEND_CHAR(_SC(']')); //the first NEXT() after break the while loop
+                APPEND_CHAR(cdelim2); //the first NEXT() after break the while loop
                 APPEND_CHAR(_SC('='));
                 APPEND_CHAR(_SC('='));
                 lastBraceAdded = true;
                 lastBraceAdded = true;
 		    }
 		    }
-		    if(!lastBraceAdded) APPEND_CHAR(_SC(']')); //the first NEXT() after break the while loop
+		    if(!lastBraceAdded) APPEND_CHAR(cdelim2); //the first NEXT() after break the while loop
 		    APPEND_CHAR(CUR_CHAR);
 		    APPEND_CHAR(CUR_CHAR);
 		    NEXT();
 		    NEXT();
 		}
 		}

+ 1 - 1
SquiLu/squirrel/sqlexer.h

@@ -14,7 +14,7 @@ struct SQLexer
 	~SQLexer();
 	~SQLexer();
 	void Init(SQSharedState *ss,SQLEXREADFUNC rg,SQUserPointer up,CompilerErrorFunc efunc,void *ed);
 	void Init(SQSharedState *ss,SQLEXREADFUNC rg,SQUserPointer up,CompilerErrorFunc efunc,void *ed);
 	SQTable * GetKeywords();
 	SQTable * GetKeywords();
-	void Error(const SQChar *err);
+	void Error(const SQChar *err, ...);
 	SQInteger Lex();
 	SQInteger Lex();
 	const SQChar *Tok2Str(SQInteger tok);
 	const SQChar *Tok2Str(SQInteger tok);
 private:
 private: