cvt-bison-to-named.nut 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. __max_print_stack_str_size <- 100;
  2. auto fname;
  3. if(vargv.len() > 1) fname = vargv[1];
  4. //else fname = "/home/mingo/dev/dadbiz++/third-party/dad/CG-SQL/sources/cql-0.y";
  5. auto txt = readfile(fname);
  6. auto parser_start_mark = "\n%%\n";
  7. auto parser_start_pos = txt.indexOf(parser_start_mark);
  8. auto before_parser = txt.slice(0, parser_start_pos);
  9. txt = txt.slice(parser_start_pos+parser_start_mark.len());
  10. auto brackets = {"'{'": "_ZCHAR_OB_", "'}'": "_ZCHAR_CB_", "';'": "_ZCHAR_SCOL_", "':'": "_ZCHAR_COL_"};
  11. txt = txt.gsub("'[{};:]'", brackets);
  12. auto buf = blob();
  13. local function fixDeclarations(dtxt)
  14. {
  15. //print("===", dtxt.slice(0, 12));
  16. dtxt.gmatch(
  17. //"\n *(%S+)%s*:(.-})%s*;",
  18. "\n *(%S+)%s*:(.+)",
  19. function(key, val)
  20. {
  21. //print("---", key);
  22. //print("---", key, val);
  23. //print(key + " :");
  24. buf.write(key, ":\n");
  25. val = val.replace("$$", "$" + key /*+ "_0"*/);
  26. auto ary = [];
  27. auto last_pos = 0;
  28. val.gmatch(
  29. "(.-)%s*(%b{})()",
  30. function(klist, code, lp)
  31. {
  32. last_pos = lp;
  33. if(ary.len()) ary.append("_z_"); //dummy for interleaved {}
  34. //print("+++", klist, "<=>", code);
  35. auto done = false;
  36. klist.gmatch(
  37. "(%S+)",
  38. function(m)
  39. {
  40. if(m == ';')
  41. {
  42. //print("***done");
  43. done = true;
  44. return false;
  45. }
  46. if(m == "|") ary.clear(); //reset
  47. else
  48. {
  49. ary.append(m);
  50. }
  51. return true;
  52. }
  53. );
  54. if(done) return false;
  55. foreach(m in ary)
  56. {
  57. auto idx = 0;
  58. if(m == key) ++idx;
  59. foreach(m2 in ary) if(m == m2) ++idx;
  60. if(idx > 1)
  61. {
  62. while((idx = ary.find(m)) >= 0)
  63. {
  64. ary[idx] = ary[idx] + "_" + (idx+1);
  65. }
  66. }
  67. }
  68. code = code.gsub(
  69. "([$@])(%d+)",
  70. function(pfx, idx)
  71. {
  72. idx = idx.tointeger() -1;
  73. //print("===", ary.join("::"));
  74. return pfx + ary[idx];
  75. }
  76. );
  77. //print("==", code);
  78. //print("", klist.trim(), code);
  79. buf.write("\t", klist.trim(), "\t", code, "\n");
  80. return true;
  81. }
  82. );
  83. if(buf[buf.len()-1] == '\n') buf.setLen(buf.len()-1);
  84. buf.write(val.slice(last_pos), "\n\n");
  85. //print(";\n");
  86. //buf.write("\t;\n\n");
  87. return true;
  88. }
  89. );
  90. }
  91. auto last_sp = 0;
  92. txt.gmatch(
  93. "\n%s*;()%s*\n",
  94. function(sp)
  95. {
  96. //print(sp, txt.slice(last_sp, sp));
  97. //buf.write(txt.slice(last_sp, sp));
  98. //print(sp);
  99. fixDeclarations(txt.slice(last_sp, sp));
  100. last_sp = sp;
  101. return true;
  102. }
  103. );
  104. //print(last_sp, txt.slice(last_sp));
  105. //buf.write(txt.slice(last_sp));
  106. fixDeclarations(txt.slice(last_sp));
  107. auto txt2 = buf.tostring();
  108. auto brackets_back = {};
  109. foreach(k,v in brackets) brackets_back[v] <- k;
  110. auto txt_named = txt2.gsub("_ZCHAR_[^_]+_", brackets_back);
  111. print(txt_named);