TListener.java 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  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 templates;
  7. import API.Utils;
  8. import common.RegistroBase;
  9. import java.util.ArrayList;
  10. import java.util.LinkedList;
  11. import java.util.Stack;
  12. import templates.TemplateParser.CallContext;
  13. /**
  14. *
  15. * @author EUGENIO CARVALHO
  16. */
  17. public class TListener extends TemplateBaseListener {
  18. protected RegistroBase ctx;
  19. protected StringBuilder sb = new StringBuilder();
  20. protected Stack<ArrayList<String>> args = new Stack<>();
  21. protected LinkedList<String> stmt = new LinkedList<>();
  22. protected String append;
  23. protected String returnCall;
  24. protected boolean suspend;
  25. protected String Error = null;
  26. public TListener(RegistroBase ctx) {
  27. this.ctx = ctx;
  28. }
  29. public String GetError() {
  30. return Error;
  31. }
  32. @Override
  33. public String toString() {
  34. return sb.toString(); //To change body of generated methods, choose Tools | Templates.
  35. }
  36. @Override
  37. public void exitLiteral(TemplateParser.LiteralContext ctx) {
  38. // System.out.println("@@@@@@@@@@ExitLiteral{" + ctx.parent.getClass().getName() + "}");
  39. if (ctx.parent.getClass().getName().equals("templates.TemplateParser$InitContext")) {
  40. sb.append(ctx.any().getText());
  41. }
  42. super.exitLiteral(ctx); //To change body of generated methods, choose Tools | Templates.
  43. }
  44. @Override
  45. public void enterExpression(TemplateParser.ExpressionContext ctx) {
  46. this.append = "";
  47. super.enterExpression(ctx); //To change body of generated methods, choose Tools | Templates.
  48. }
  49. @Override
  50. public void exitExpression(TemplateParser.ExpressionContext ctx) {
  51. sb.append(this.append);
  52. super.exitExpression(ctx); //To change body of generated methods, choose Tools | Templates.
  53. }
  54. @Override
  55. public void enterArgs(TemplateParser.ArgsContext ctx) {
  56. args.push(new ArrayList<>());
  57. super.enterArgs(ctx); //To change body of generated methods, choose Tools | Templates.
  58. }
  59. @Override
  60. public void exitArgs(TemplateParser.ArgsContext ctx) {
  61. super.exitArgs(ctx); //To change body of generated methods, choose Tools | Templates.
  62. }
  63. @Override
  64. public void exitStmt(TemplateParser.StmtContext ctx) {
  65. if (ctx.call() != null) {
  66. this.stmt.push(this.returnCall);
  67. }
  68. super.exitStmt(ctx); //To change body of generated methods, choose Tools | Templates.
  69. }
  70. @Override
  71. public void exitCall(TemplateParser.CallContext ctx) {
  72. try {
  73. ArrayList<String> arguments;
  74. if (!args.isEmpty()) {
  75. arguments = args.pop();
  76. } else {
  77. arguments = new ArrayList<>();
  78. }
  79. // System.out.println("ExitCall:" + ctx.ID().getText() + " -args:" + arguments);
  80. this.returnCall = Functions.Call(ctx.ID().getText(), this.ctx, arguments);
  81. super.exitCall(ctx); //To change body of generated methods, choose Tools | Templates.
  82. } catch (Exception ex) {
  83. ThrowError(ctx, ex.getMessage());
  84. }
  85. }
  86. @Override
  87. public void exitPart(TemplateParser.PartContext ctx) {
  88. if (!this.append.equals("")) {
  89. return;
  90. }
  91. if (!this.stmt.isEmpty() && !Utils.Empty(this.stmt.peek())) {
  92. if (ctx.pre != null) {
  93. this.append = ctx.pre.any().getText();
  94. }
  95. this.append += this.stmt.pop();
  96. if (ctx.pos != null) {
  97. this.append += ctx.pos.any().getText();
  98. }
  99. }
  100. super.exitPart(ctx); //To change body of generated methods, choose Tools | Templates.
  101. }
  102. @Override
  103. public void exitArg(TemplateParser.ArgContext ctx) {
  104. String value;
  105. if (ctx.seletor() != null) {
  106. String seletor = ctx.seletor().getText().replace("'", "");
  107. if (seletor.equals("label")) {
  108. // System.out.println("this.ctx(seletor:" + seletor + ":" + this.ctx);
  109. }
  110. value = this.ctx.Get(seletor);
  111. } else if (ctx.call() != null) {
  112. value = this.returnCall;
  113. } else if (ctx.literal() != null) {
  114. value = ctx.literal().any().getText();
  115. } else {
  116. value = ctx.number().getText();
  117. }
  118. // System.out.println("EXIT ARG:" + value);
  119. ArrayList<String> arguments = args.empty() ? null : args.peek();
  120. if (arguments != null) {
  121. arguments.add(value);
  122. } else {
  123. this.stmt.push(value);
  124. }
  125. super.exitArg(ctx); //To change body of generated methods, choose Tools | Templates.
  126. }
  127. private void ThrowError(CallContext ctx, String message) {
  128. Error = "<" + ctx.getStart().getLine() + ":" + ctx.getStart().getCharPositionInLine() + "> " + message;
  129. }
  130. public boolean hasError() {
  131. return Error != null;
  132. }
  133. }