TListener.java 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. /*
  2. * To change this license header, choose License Headers in Project Properties.
  3. * To change this template file, choose Tools | Templates
  4. * and open the template in the editor.
  5. */
  6. package template;
  7. import API.Utils;
  8. import java.util.ArrayList;
  9. import java.util.LinkedList;
  10. /**
  11. *
  12. * @author EUGENIO CARVALHO
  13. */
  14. public class TListener extends TemplateBaseListener {
  15. protected TemplateCtx ctx;
  16. protected StringBuilder sb = new StringBuilder();
  17. protected LinkedList<ArrayList<String>> args = new LinkedList<>();
  18. protected LinkedList<String> stmt = new LinkedList<>();
  19. protected String append;
  20. protected String returnCall;
  21. protected boolean suspend;
  22. protected TemplateCtx gctx;
  23. public TListener(TemplateCtx ctx, TemplateCtx gctx) {
  24. this.ctx = ctx;
  25. this.gctx = gctx;
  26. }
  27. @Override
  28. public String toString() {
  29. return sb.toString(); //To change body of generated methods, choose Tools | Templates.
  30. }
  31. @Override
  32. public void exitLiteral(TemplateParser.LiteralContext ctx) {
  33. if (ctx.parent.getClass().getName().equals("template.TemplateParser$InitContext")) {
  34. sb.append(ctx.any().getText());
  35. }
  36. super.exitLiteral(ctx); //To change body of generated methods, choose Tools | Templates.
  37. }
  38. @Override
  39. public void enterExpression(TemplateParser.ExpressionContext ctx) {
  40. this.append = "";
  41. super.enterExpression(ctx); //To change body of generated methods, choose Tools | Templates.
  42. }
  43. @Override
  44. public void exitExpression(TemplateParser.ExpressionContext ctx) {
  45. sb.append(this.append);
  46. super.exitExpression(ctx); //To change body of generated methods, choose Tools | Templates.
  47. }
  48. @Override
  49. public void enterArgs(TemplateParser.ArgsContext ctx) {
  50. args.push(new ArrayList<String>());
  51. super.enterArgs(ctx); //To change body of generated methods, choose Tools | Templates.
  52. }
  53. @Override
  54. public void exitStmt(TemplateParser.StmtContext ctx) {
  55. if (ctx.call() != null) {
  56. this.stmt.push(this.returnCall);;
  57. }
  58. super.exitStmt(ctx); //To change body of generated methods, choose Tools | Templates.
  59. }
  60. @Override
  61. public void exitCall(TemplateParser.CallContext ctx) {
  62. ExecCall(ctx);
  63. super.exitCall(ctx); //To change body of generated methods, choose Tools | Templates.
  64. }
  65. public ArrayList<String> ExecCall(TemplateParser.CallContext ctx) {
  66. ArrayList<String> arguments;
  67. if (!args.isEmpty()) {
  68. arguments = args.pop();
  69. } else {
  70. arguments = new ArrayList<>();
  71. }
  72. // System.out.println("Exec:" + ctx.ID().getText() + ":" + arguments);
  73. switch (ctx.ID().getText()) {
  74. case "T": // Adiciona tabulacoes
  75. this.returnCall = T(arguments);
  76. break;
  77. case "HEX": // Convert valor hex
  78. this.returnCall = HEX(arguments);
  79. break;
  80. case "L": // Lavel function
  81. this.returnCall = L(arguments);
  82. break;
  83. // case "A": // Lavel function
  84. // this.returnCall = A(arguments);
  85. // break;
  86. case "PAD": // Lavel function
  87. this.returnCall = PAD(arguments);
  88. break;
  89. default:
  90. this.returnCall = "";
  91. }
  92. return arguments;
  93. }
  94. @Override
  95. public void exitPart(TemplateParser.PartContext ctx) {
  96. if (!this.append.equals("")) {
  97. return;
  98. }
  99. if (!this.stmt.isEmpty() && !Utils.Empty(this.stmt.peek())) {
  100. if (ctx.pre != null) {
  101. this.append = ctx.pre.any().getText();
  102. }
  103. this.append += this.stmt.pop();
  104. if (ctx.pos != null) {
  105. this.append += ctx.pos.any().getText();
  106. }
  107. }
  108. super.exitPart(ctx); //To change body of generated methods, choose Tools | Templates.
  109. }
  110. @Override
  111. public void exitArg(TemplateParser.ArgContext ctx) {
  112. String value;
  113. if (ctx.seletor() != null) {
  114. String seletor = ctx.seletor().getText().replace("'", "");
  115. // Global context
  116. if (seletor.substring(0, 1).equals("_")) {
  117. value = this.gctx.G(seletor);
  118. } else {
  119. value = this.ctx.G(seletor);
  120. }
  121. } else if (ctx.call() != null) {
  122. value = this.returnCall;
  123. } else if (ctx.literal() != null) {
  124. value = ctx.literal().any().getText();
  125. } else {
  126. value = ctx.number().getText();
  127. }
  128. ArrayList<String> arguments = args.peek();
  129. if (arguments != null) {
  130. arguments.add(value);
  131. } else {
  132. // this.append = value;
  133. this.stmt.push(value);
  134. }
  135. super.exitArg(ctx); //To change body of generated methods, choose Tools | Templates.
  136. }
  137. protected String HEX(ArrayList<String> arguments) {
  138. String value = arguments.get(0);
  139. if (!value.equals("")) {
  140. value = Get(value);
  141. value = hex(value);
  142. arguments.set(0, value);
  143. return PAD(arguments);
  144. }
  145. return "";
  146. }
  147. protected String T(ArrayList<String> arguments) {
  148. return Utils.Repeat("\t", arguments.get(0));
  149. }
  150. protected String L(ArrayList<String> arguments) {
  151. return " <" + arguments.get(0) + ">";
  152. }
  153. protected String hex(String value) {
  154. return Integer.toHexString(Integer.parseInt(value));
  155. }
  156. protected String PAD(ArrayList<String> arguments) {
  157. String value = arguments.get(0);
  158. if (arguments.size() > 1) {
  159. value = PAD(value, arguments.get(2), Integer.parseInt(arguments.get(1)));
  160. }
  161. return value;
  162. }
  163. protected String PAD(String value, String replace, int i) {
  164. return String.format("%" + i + "s", value).replace(" ", replace);
  165. }
  166. // protected String A(ArrayList<String> params) {
  167. // return String.format("%" + i + "s", value).replace(" ", replace);
  168. // }
  169. protected String Get(String value) {
  170. if (Utils.isNumber(value)) {
  171. return value;
  172. }
  173. if (value.substring(0, 1).equals("_")) {
  174. return gctx.G(value);
  175. } else {
  176. return ctx.G(value);
  177. }
  178. }
  179. protected String FormatNum(int value, String format) {
  180. switch (format) {
  181. case "hex":
  182. return Integer.toHexString(value);
  183. case "bin":
  184. return Integer.toBinaryString(value);
  185. case "oct":
  186. return Integer.toOctalString(value);
  187. }
  188. return value + "";
  189. }
  190. }