Browse Source

Add a sample script to convert yacc/bison files with positional parameters to named parameters

mingodad 5 years ago
parent
commit
f18cf9797f
1 changed files with 121 additions and 0 deletions
  1. 121 0
      SquiLu/samples/cvt-bison-to-named.nut

+ 121 - 0
SquiLu/samples/cvt-bison-to-named.nut

@@ -0,0 +1,121 @@
+__max_print_stack_str_size <- 100;
+
+auto fname;
+if(vargv.len() > 1) fname = vargv[1];
+//else fname = "/home/mingo/dev/dadbiz++/third-party/dad/CG-SQL/sources/cql-0.y";
+
+auto txt = readfile(fname);
+
+auto parser_start_mark = "\n%%\n";
+auto parser_start_pos = txt.indexOf(parser_start_mark);
+auto before_parser = txt.slice(0, parser_start_pos);
+
+txt = txt.slice(parser_start_pos+parser_start_mark.len());
+
+auto brackets = {"'{'": "_ZCHAR_OB_", "'}'": "_ZCHAR_CB_", "';'": "_ZCHAR_SCOL_", "':'": "_ZCHAR_COL_"};
+txt = txt.gsub("'[{};:]'", brackets);
+auto buf = blob();
+
+local function fixDeclarations(dtxt)
+{
+  //print("===", dtxt.slice(0, 12));
+  dtxt.gmatch(
+    //"\n *(%S+)%s*:(.-})%s*;",
+    "\n *(%S+)%s*:(.+)",
+    function(key, val)
+    {
+      //print("---", key);
+      //print("---", key, val);
+      //print(key  + " :");
+      buf.write(key, ":\n");
+      val = val.replace("$$", "$" + key /*+ "_0"*/);
+      auto ary = [];
+      auto last_pos = 0;
+      val.gmatch(
+        "(.-)%s*(%b{})()",
+        function(klist, code, lp)
+        {
+	  last_pos = lp;
+          if(ary.len()) ary.append("_z_"); //dummy for interleaved {}
+          //print("+++", klist, "<=>", code);
+          auto done = false;
+          klist.gmatch(
+            "(%S+)",
+            function(m)
+            {
+              if(m == ';')
+              {
+                //print("***done");
+                done = true;
+                return false;
+              }
+              if(m == "|") ary.clear(); //reset
+              else
+              {
+                ary.append(m);
+              }
+              return true;
+            }
+          );
+          if(done) return false;
+
+          foreach(m in ary)
+          {
+            auto idx = 0;
+	    if(m == key) ++idx;
+            foreach(m2 in ary) if(m == m2) ++idx;
+            if(idx > 1)
+            {
+              while((idx = ary.find(m)) >= 0)
+              {
+                ary[idx] = ary[idx] + "_" + (idx+1);
+              }
+            }
+          }
+
+          code = code.gsub(
+            "([$@])(%d+)",
+            function(pfx, idx)
+            {
+              idx = idx.tointeger() -1;
+              //print("===", ary.join("::"));
+              return pfx + ary[idx];
+            }
+          );
+          //print("==", code);
+          //print("", klist.trim(), code);
+          buf.write("\t", klist.trim(), "\t", code, "\n");
+          return true;
+        }
+      );
+      if(buf[buf.len()-1] == '\n') buf.setLen(buf.len()-1);
+      buf.write(val.slice(last_pos), "\n\n");
+      //print(";\n");
+      //buf.write("\t;\n\n");
+      return true;
+    }
+  );
+}
+
+auto last_sp = 0;
+txt.gmatch(
+  "\n%s*;()%s*\n",
+  function(sp)
+  {
+    //print(sp, txt.slice(last_sp, sp));
+    //buf.write(txt.slice(last_sp, sp));
+    //print(sp);
+    fixDeclarations(txt.slice(last_sp, sp));
+    last_sp = sp;
+    return true;
+  }
+);
+//print(last_sp, txt.slice(last_sp));
+//buf.write(txt.slice(last_sp));
+fixDeclarations(txt.slice(last_sp));
+
+auto txt2 = buf.tostring();
+auto brackets_back = {};
+foreach(k,v in brackets) brackets_back[v] <- k;
+auto txt_named = txt2.gsub("_ZCHAR_[^_]+_", brackets_back);
+print(txt_named);