IvannosysListener.java 58 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613
  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 frontend.Ivannosys;
  7. import API.BuildParams;
  8. import API.Functions;
  9. import API.Imports;
  10. import API.Interfaces;
  11. import API.Types;
  12. import API.Utils;
  13. import API.Variables;
  14. import ast.AbstractSyntaxTree;
  15. import ast.Node;
  16. import common.Instruction;
  17. import common.Log;
  18. import compiler.IvannosysCompiler;
  19. import grammar.IvannosysGrammarBaseListener;
  20. import grammar.IvannosysGrammarParser;
  21. import java.util.ArrayList;
  22. import java.util.HashMap;
  23. import java.util.LinkedList;
  24. import java.util.List;
  25. import java.util.Stack;
  26. import java.util.logging.Level;
  27. import java.util.logging.Logger;
  28. import org.antlr.v4.runtime.ParserRuleContext;
  29. import org.antlr.v4.runtime.RuleContext;
  30. import org.antlr.v4.runtime.tree.TerminalNode;
  31. /**
  32. *
  33. * @author Eugenio
  34. */
  35. public class IvannosysListener extends IvannosysGrammarBaseListener {
  36. protected int uniq = 0;
  37. protected int InsideType;
  38. protected boolean insideSwitch = false;
  39. // protected String packageName;
  40. protected Log errors;
  41. protected AbstractSyntaxTree ast;
  42. protected IvannosysCompiler compiler;
  43. protected Stack<String> scopeStack = new Stack<>();
  44. protected Stack<String> scopeFile = new Stack<>();
  45. protected LinkedList<Boolean> ReadId = new LinkedList<>();
  46. protected HashMap<String, String> packages = new HashMap<>();
  47. protected LinkedList<String> TypePath;
  48. // protected final ArrayList<String> paths;
  49. // protected boolean returnReferece;
  50. // protected int paramPosition;
  51. // protected int defAtribuicaoIndex;
  52. // protected int returnPosition;
  53. protected LinkedList<String> packageNames = new LinkedList<>();
  54. public IvannosysListener(IvannosysCompiler comp) throws Exception {
  55. ast = AbstractSyntaxTree.getAbstractSyntaxTree();
  56. compiler = comp;
  57. errors = new Log();
  58. this.ReadId.push(true);
  59. }
  60. public Log Error() {
  61. return errors;
  62. }
  63. @Override
  64. public void enterBuild_stmt(IvannosysGrammarParser.Build_stmtContext ctx) {
  65. String tag = ctx.ID().getText();
  66. ArrayList<String> values = new ArrayList<>();
  67. String value;
  68. for (IvannosysGrammarParser.BuildvalueContext id : ctx.buildvalue()) {
  69. value = id.getText().trim();
  70. if (value.contains("`")) {
  71. value = value.replace("`", "");
  72. }
  73. values.add(value);
  74. }
  75. BuildParams.Set(tag, values);
  76. // ast.getCompileParams().addList(tag, values);
  77. super.enterBuild_stmt(ctx); //To change body of generated methods, choose Tools | Templates.
  78. }
  79. //INIT
  80. @Override
  81. public void enterInit(IvannosysGrammarParser.InitContext ctx) {
  82. packageNames.push(ctx.ID().getText());
  83. String scope = packageNames.peek();
  84. setEscopo(scope);
  85. Node root = ast.getRoot();
  86. ast.Current(root);
  87. ast.setNode(new Node(packageNames.peek()).Set("class", "package"));
  88. scopeFile.push(scope + "::" + ctx.ID().getText());
  89. astBaseSet(ctx);
  90. List<IvannosysGrammarParser.ImportsContext> imps = ctx.imports();
  91. if (imps.size() > 0) {
  92. Node imports = astSetCurrentNode("imports", ctx);
  93. imports.Set("class", "imports");
  94. String alias, path, defaultname;
  95. String[] parts;
  96. for (IvannosysGrammarParser.ImportsContext imp : imps) {
  97. for (IvannosysGrammarParser.Import_partContext impPart : imp.import_part()) {
  98. path = impPart.T_STRING().getText().replaceAll("\"", "");
  99. parts = path.split("/");
  100. defaultname = parts[parts.length - 1];
  101. if (impPart.ID() != null) {
  102. alias = impPart.ID().getText().replaceAll("\"", "");
  103. } else {
  104. alias = defaultname;
  105. }
  106. packages.put(alias, path);
  107. imports.addFilho(new Node(alias)
  108. .Set("path", path)
  109. .Set("default", defaultname));
  110. }
  111. }
  112. astReturnLevel();
  113. }
  114. super.enterInit(ctx); //To change body of generated methods, choose Tools | Templates.
  115. }
  116. @Override
  117. public void exitInit(IvannosysGrammarParser.InitContext ctx) {
  118. // if (ctx.R_INIT_LIBRARY() != null) {
  119. // astReturnLevel();
  120. // }
  121. astReturnLevel();
  122. ast.Back();
  123. scopeStack.pop();
  124. scopeFile.pop();
  125. // Extracao de contantes, variaveis, funcoes e metodos
  126. // if (packageNames.peek().equals("main")) {
  127. //
  128. // }
  129. packageNames.pop();
  130. // InitConstantes(ctx);
  131. super.exitInit(ctx); //To change body of generated methods, choose Tools | Templates.
  132. }
  133. /**
  134. *
  135. *
  136. *
  137. */
  138. @Override
  139. public void enterNewstmt(IvannosysGrammarParser.NewstmtContext ctx) {
  140. astSetCurrentNode("new", ctx);
  141. astSetAtributo("class", "new");
  142. super.enterNewstmt(ctx); //To change body of generated methods, choose Tools | Templates.
  143. }
  144. @Override
  145. public void exitNewstmt(IvannosysGrammarParser.NewstmtContext ctx) {
  146. String size = "1";
  147. if (ctx.T_INTEIRO() != null) {
  148. size = ctx.T_INTEIRO().getText();
  149. }
  150. astAddChildren(size);
  151. astReturnLevel();
  152. super.exitNewstmt(ctx); //To change body of generated methods, choose Tools | Templates.
  153. }
  154. @Override
  155. public void enterFallthroughStmt(IvannosysGrammarParser.FallthroughStmtContext ctx) {
  156. astSetCurrentNode("fallthrough", ctx).Set("class", "fallthrough.stmt");
  157. super.enterFallthroughStmt(ctx); //To change body of generated methods, choose Tools | Templates.
  158. }
  159. @Override
  160. public void exitFallthroughStmt(IvannosysGrammarParser.FallthroughStmtContext ctx) {
  161. astReturnLevel();
  162. super.exitFallthroughStmt(ctx); //To change body of generated methods, choose Tools | Templates.
  163. }
  164. @Override
  165. public void enterDelete(IvannosysGrammarParser.DeleteContext ctx) {
  166. astSetCurrentNode("delete", ctx);
  167. astSetAtributo("class", "delete");
  168. super.enterDelete(ctx); //To change body of generated methods, choose Tools | Templates.
  169. }
  170. @Override
  171. public void exitDelete(IvannosysGrammarParser.DeleteContext ctx) {
  172. astReturnLevel();
  173. super.exitDelete(ctx); //To change body of generated methods, choose Tools | Templates.
  174. }
  175. @Override
  176. public void enterDec_var_part(IvannosysGrammarParser.Dec_var_partContext ctx) {
  177. astSetCurrentNode("dec.var", ctx);
  178. astSetAtributo("class", "dec.var");
  179. super.enterDec_var_part(ctx); //To change body of generated methods, choose Tools | Templates.
  180. }
  181. @Override
  182. public void exitDec_var_part(IvannosysGrammarParser.Dec_var_partContext ctx) {
  183. try {
  184. DeclVar(ctx, astCurrent());
  185. astReturnLevel();
  186. super.exitDec_var_part(ctx); //To change body of generated methods, choose Tools | Templates.
  187. } catch (Exception ex) {
  188. Logger.getLogger(IvannosysListener.class.getName()).log(Level.SEVERE, null, ex);
  189. }
  190. }
  191. protected void DeclVar(ParserRuleContext ctx, Node node) throws Exception {
  192. int i = 0;
  193. String varname, t, value;
  194. Node variable,
  195. exprs = node.find("exprs"),
  196. type = node.find("type");
  197. ArrayList<ArrayList<String>> valuesGroup = new ArrayList<>();
  198. ArrayList<String> types = new ArrayList<>(), values;
  199. ArrayList<Node> ids = node.find("ids").childrens();
  200. ArrayList<ArrayList<Node>> indexes = new ArrayList<>();
  201. if (type != null) {
  202. // System.out.println("DeclVar:" + type);
  203. // Quando declarado normal
  204. t = type.Get("type");
  205. for (int k = 0; k < ids.size(); k++) {
  206. types.add(t);
  207. indexes.add(type.childrens());
  208. values = new ArrayList<>();
  209. if (exprs != null) {
  210. Node e = exprs.childrens().get(k);
  211. // for (Node e : exprs.childrens()) {
  212. switch (e.Class()) {
  213. // case "selector":
  214. // break;
  215. default:
  216. value = e.Get("value");
  217. switch (t) {
  218. case "bool":
  219. value = value.equals("true") ? "1" : "0";
  220. }
  221. values.add(value);
  222. // System.out.println("Ey:" + e);
  223. }
  224. // }
  225. }
  226. valuesGroup.add(values);
  227. }
  228. } else {
  229. // Quando declarado encurtado
  230. //Todo fazer os tipos inferidos;
  231. for (Node e : exprs.childrens()) {
  232. values = new ArrayList<>();
  233. switch (e.Class()) {
  234. case "call":
  235. // System.out.println("Call:" + e.getText());
  236. try {
  237. Node def = Functions.Get(e.getText());
  238. for (Node rtype : def.find("dec.return").childrens()) {
  239. types.add(rtype.Get("type"));
  240. indexes.add(new ArrayList<Node>());
  241. }
  242. } catch (Exception ex) {
  243. errors.AddError(new Instruction()
  244. .Set("class", "Call")
  245. .Set("msg", ex.getMessage())
  246. .Set("line", ctx.getStart().getLine())
  247. .Set("col", ctx.getStart().getCharPositionInLine()));
  248. }
  249. break;
  250. case "literal":
  251. // System.out.println("Lit:" + e);
  252. if (e.eq("subclass", "array")) {
  253. ArrayList<Node> indc = new ArrayList<>();
  254. indexes.add(indc);
  255. indc.add(new Node("" + e.find("exprs").childrens().size()));
  256. types.add(e.find("exprs").childrens().get(0).Get("type"));
  257. }
  258. break;
  259. case "expr":
  260. // System.out.println("Exp:" + e);
  261. types.add(e.Get("type"));
  262. indexes.add(new ArrayList<Node>());
  263. break;
  264. default:
  265. // System.out.println("E:" + e);
  266. types.add(e.Get("type"));
  267. indexes.add(e.childrens());
  268. break;
  269. }
  270. valuesGroup.add(values);
  271. }
  272. }
  273. // System.out.println("types:" + types);
  274. for (Node var : node.find("ids").childrens()) {
  275. varname = scopeStack.peek() + "." + var.getText();
  276. t = types.get(i);
  277. var.Set("type", t)
  278. .Set("value", varname)
  279. .Set("class", "ID")
  280. .Set("array", "" + (indexes.get(i).size() > 0))
  281. .Set("array_size", "" + ArraySize(indexes.get(i)))
  282. .copy("pointer", type);
  283. variable = new Node()
  284. .Set("global", "" + (scopeStack.peek().split("\\.").length == 1))
  285. .Set("name", var.getText())
  286. .Set("class", "selector")
  287. .Set("subclass", "operand");
  288. variable.copy("type,value,pointer,array,array_size", var);
  289. variable.addList("default.values", valuesGroup.get(i));
  290. astBaseSet(ctx, variable);
  291. if (exprs != null) {
  292. // expr = exprs.childrens.Get(i++);
  293. // variable.addFilho(expr);
  294. }
  295. variable.childrens = indexes.get(i);
  296. // System.out.println("DeclVAR:" + varname + "|" + variable);
  297. try {
  298. Variables.Add(varname, variable);
  299. } catch (Exception e) {
  300. errors.AddError(new Instruction()
  301. .Set("class", "Decl.Var")
  302. .Set("msg", e.getMessage())
  303. .Set("line", ctx.getStart().getLine())
  304. .Set("col", ctx.getStart().getCharPositionInLine()));
  305. }
  306. i++;
  307. }
  308. }
  309. protected String ArraySize(ArrayList<Node> indexes) throws Exception {
  310. int result = 1, v;
  311. for (Node index : indexes) {
  312. if (index.isNumber("value")) {
  313. v = index.getInt("value");
  314. } else {
  315. v = 1;
  316. }
  317. result *= v;
  318. }
  319. return "" + result;
  320. }
  321. @Override
  322. public void enterExpression_list(IvannosysGrammarParser.Expression_listContext ctx) {
  323. astSetCurrentNode("exprs", ctx);
  324. astSetAtributo("class", "exprs");
  325. super.enterExpression_list(ctx); //To change body of generated methods, choose Tools | Templates.
  326. }
  327. @Override
  328. public void exitExpression_list(IvannosysGrammarParser.Expression_listContext ctx) {
  329. astReturnLevel();
  330. super.exitExpression_list(ctx); //To change body of generated methods, choose Tools | Templates.
  331. }
  332. //DECLARACAO DE CONSTANTES -------------------------------------------------
  333. @Override
  334. public void enterDec_const_part(IvannosysGrammarParser.Dec_const_partContext ctx) {
  335. astSetCurrentNode("const", ctx);
  336. astSetAtributo("class", "dec.const");
  337. astBaseSet(ctx);
  338. Node label = new Node(ctx.ID().getText());
  339. label.Set("class", "ID");
  340. astAddChildren(label);
  341. super.enterDec_const_part(ctx); //To change body of generated methods, choose Tools | Templates.
  342. }
  343. @Override
  344. public void exitDec_const_part(IvannosysGrammarParser.Dec_const_partContext ctx) {
  345. // String id = ctx.ID().getText();
  346. astBaseSet(ctx);
  347. Node node = astCurrent()
  348. .Set("constant", "true");
  349. ArrayList<Node> childrens = node.childrens();
  350. String id = childrens.get(0).getText();
  351. Node value = childrens.get(1);
  352. String varID = scopeStack.peek() + "." + id;
  353. Node var = new Node(varID).Set("name", id)
  354. .Set("default.value", value.getText())
  355. .Set("constant", "true")
  356. .Set("pointer", "false")
  357. .Set("array", "false")
  358. .copy("file,scope,line,col,type", value);
  359. try {
  360. Variables.Add(varID, var);
  361. } catch (Exception e) {
  362. errors.AddError(
  363. (Instruction) new Instruction()
  364. .Set("class", "Import")
  365. .Set("msg", e.getMessage())
  366. .Set("line", ctx.getStart().getLine())
  367. .Set("col", ctx.getStart().getCharPositionInLine()));
  368. }
  369. astReturnLevel();
  370. super.exitDec_const_part(ctx); //To change body of generated methods, choose Tools | Templates.
  371. }
  372. public String getTypeOfPrimitive(IvannosysGrammarParser.Primitive_valueContext ctx) {
  373. if (ctx.T_BOOL_FALSE() != null || ctx.T_BOOL_TRUE() != null) {
  374. return "bool";
  375. } else if (ctx.T_CHAR() != null) {
  376. return "char";
  377. } else if (ctx.T_INTEIRO() != null) {
  378. return "int32";
  379. }
  380. return "undefined";
  381. }
  382. @Override
  383. public void enterPrimitive_value(IvannosysGrammarParser.Primitive_valueContext ctx) {
  384. if (!this.ReadId.peek()) {
  385. return;
  386. }
  387. String classe = "value",
  388. type = getTypeOfPrimitive(ctx),
  389. subclasse = "";
  390. if (!Types.Primitive(type)) {
  391. errors.AddError((Instruction) new Instruction()
  392. .Set("class", "Import")
  393. .Set("msg", "Primitive type undefined.")
  394. .Set("line", ctx.getStart().getLine())
  395. .Set("col", ctx.getStart().getCharPositionInLine()));
  396. return;
  397. }
  398. // if (ctx.T_BOOL_FALSE() != null || ctx.T_BOOL_TRUE() != null) {
  399. // type = "bool";
  400. // subclasse = "boolean";
  401. // } else if (ctx.T_CHAR() != null) {
  402. // type = "char";
  403. // subclasse = "char";
  404. // } else if (ctx.T_INTEIRO() != null) {
  405. // type = "int32";
  406. // subclasse = "integer";
  407. // } else {
  408. // return;
  409. // }
  410. astSetCurrentNode(ctx.getText(), ctx);
  411. astSetAtributo("type", type);
  412. astSetAtributo("class", classe);
  413. astSetAtributo("subclass", classe);
  414. astBaseSet(ctx);
  415. super.enterPrimitive_value(ctx); //To change body of generated methods, choose Tools | Templates.
  416. }
  417. @Override
  418. public void exitPrimitive_value(IvannosysGrammarParser.Primitive_valueContext ctx) {
  419. if (!this.ReadId.peek()) {
  420. return;
  421. }
  422. astReturnLevel();
  423. super.exitPrimitive_value(ctx); //To change body of generated methods, choose Tools | Templates.
  424. }
  425. // Definicao de tipos
  426. @Override
  427. public void enterType(IvannosysGrammarParser.TypeContext ctx) {
  428. // if (this.InsideType == 0) {
  429. //// System.out.println("???? Type:" + typename + ":" + this.InsideType);
  430. //// System.out.println("Type:" + ctx.getText());
  431. // this.TypePath = new LinkedList<>();
  432. astSetCurrentNode("type", ctx);
  433. astBaseSet(ctx);
  434. astSetAtributo("class", "type");
  435. // }
  436. //
  437. // if (ctx.R_OP_AST() != null) {
  438. // astSetAtributo("pointer", "*");
  439. //
  440. // } else if (ctx.ltype != "" && ctx.ltype != null && !ctx.ltype.equals("null")) {
  441. //
  442. // String base = ctx.ltype;
  443. // Node imports = ast.getPackage(packageNames.peek()).find("imports");
  444. // if (imports != null) {
  445. // Node impt = imports.find(ctx.ltype);
  446. // if (impt != null) {
  447. // base = impt.Get("default");
  448. // }
  449. // }
  450. //// System.out.println("Ctx ltype " + base);
  451. // this.TypePath.addFirst(base);
  452. // } else if (ctx.expression_seletor() != null) {
  453. //
  454. //// System.out.println("Ctx seletor " + ctx.expression_seletor().ID().getText());
  455. // this.TypePath.addFirst(ctx.expression_seletor().ID().getText());
  456. //
  457. // } else if (ctx.type() != null) {
  458. //// System.out.println("Ctx type " + ctx.type().getText());
  459. // this.TypePath.addFirst(ctx.type().getText());
  460. // } else if (ctx.ID() != null) {
  461. //// System.out.println("Ctx id " + ctx.ID().getText());
  462. // this.TypePath.addFirst(ctx.ID().getText());
  463. // }
  464. //
  465. // this.InsideType++;
  466. super.enterType(ctx); //To change body of generated methods, choose Tools | Templates.
  467. }
  468. @Override
  469. public void exitType(IvannosysGrammarParser.TypeContext ctx) {
  470. String typename = ctx.ltype;
  471. // Adiciona o pacote local se não for um tipo primitivo e não possui um pacote
  472. if (!Types.Primitive(typename)) {
  473. String pack = packageNames.peek();
  474. // Se não tem formato "pacote.tipo"
  475. if (typename.indexOf(".") < 0 && !pack.equals("main")) {
  476. // local type
  477. typename = packageNames.peek() + "." + typename;
  478. // System.out.println("ExitTypeL:" + typename + "::" + pack);
  479. } else {
  480. // imported type
  481. // Carrega pacote se não for o pacote local
  482. String[] parts = typename.split("\\.");
  483. // System.out.println("ExitType:" + typename + "::" + pack);
  484. if (!parts[0].equals(pack)) {
  485. try {
  486. Imports.Load(parts[0]);
  487. } catch (Exception ex) {
  488. Logger.getLogger(IvannosysListener.class.getName()).log(Level.SEVERE, null, ex);
  489. return;
  490. }
  491. Node imports = ast.getPackage(pack).find("imports");
  492. if (imports != null) {
  493. Node impt = imports.find(ctx.ltype);
  494. if (impt != null) {
  495. typename = impt.Get("default") + "." + ctx.ltype;
  496. }
  497. }
  498. }
  499. }
  500. }
  501. // System.out.println("Out of type :" + ctx.ltype + ":" + ctx.getText());
  502. // System.out.println("TYPE:" + typename);
  503. Node type = astCurrent().Set("type", typename);
  504. ArrayList<Node> indexes = new ArrayList<>();
  505. for (Node x : type.childrens()) {
  506. if (x.eq("class", "index")) {
  507. indexes.add(x);
  508. }
  509. }
  510. type.childrens = indexes;
  511. astReturnLevel();
  512. // }
  513. super.exitType(ctx); //To change body of generated methods, choose Tools | Templates.
  514. }
  515. @Override
  516. public void enterIndexedType(IvannosysGrammarParser.IndexedTypeContext ctx) {
  517. if (ctx.index() != null) {
  518. String val = ctx.index().expression().getText();
  519. if (!Utils.IsNumber(val)) {
  520. Node ref = Variables.Get(scopeStack.peek() + "." + val);
  521. if (ref != null && ref.eq("constant", "true")) {
  522. // System.out.println("INDEXEDTYPE" + constante);
  523. val = ref.Get("default.value");
  524. }
  525. }
  526. astAddChildren(val)
  527. .Set("class", "index");
  528. }
  529. super.enterIndexedType(ctx); //To change body of generated methods, choose Tools | Templates.
  530. }
  531. @Override
  532. public void enterTypename(IvannosysGrammarParser.TypenameContext ctx) {
  533. if (ctx.R_OP_AST() != null) {
  534. astSetAtributo("pointer", "*");
  535. // System.out.println("ENTERTYPENAME = " + ctx.ltype);
  536. }
  537. super.enterTypename(ctx); //To change body of generated methods, choose Tools | Templates.
  538. }
  539. @Override
  540. public void exitTypename(IvannosysGrammarParser.TypenameContext ctx) {
  541. super.exitTypename(ctx); //To change body of generated methods, choose Tools | Templates.
  542. }
  543. @Override
  544. public void enterDef_type(IvannosysGrammarParser.Def_typeContext ctx) {
  545. astSetCurrentNode(ctx.ID().getText(), ctx);
  546. astSetAtributo("class", "dec.type");
  547. astBaseSet(ctx);
  548. super.enterDef_type(ctx); //To change body of generated methods, choose Tools | Templates.
  549. }
  550. @Override
  551. public void exitDef_type(IvannosysGrammarParser.Def_typeContext ctx) {
  552. Node defType = astCurrent();
  553. try {
  554. Types.Add(packageNames.peek() + "." + defType.getText(), defType);
  555. } catch (Exception e) {
  556. errors.AddError((Instruction) new Instruction()
  557. .Set("class", "Import")
  558. .Set("msg", e.getMessage())
  559. .Set("line", ctx.getStart().getLine())
  560. .Set("col", ctx.getStart().getCharPositionInLine()));
  561. }
  562. astReturnLevel();
  563. super.exitDef_type(ctx); //To change body of generated methods, choose Tools | Templates.
  564. }
  565. @Override
  566. public void enterArguments(IvannosysGrammarParser.ArgumentsContext ctx) {
  567. // Chamda de funcao
  568. astSetCurrentNode("arguments", ctx);
  569. if (ctx.expression_list() != null) {
  570. // Declaracao
  571. } else if (ctx.expression_list_typed().size() > 0) {
  572. }
  573. // astSetCurrentNode("args", ctx);
  574. super.enterArguments(ctx); //To change body of generated methods, choose Tools | Templates.
  575. }
  576. @Override
  577. public void exitArguments(IvannosysGrammarParser.ArgumentsContext ctx) {
  578. astReturnLevel();
  579. super.exitArguments(ctx); //To change body of generated methods, choose Tools | Templates.
  580. }
  581. @Override
  582. public void enterExpression_list_typed(IvannosysGrammarParser.Expression_list_typedContext ctx) {
  583. astSetCurrentNode("argument", ctx).Set("class", "argument");
  584. super.enterExpression_list_typed(ctx); //To change body of generated methods, choose Tools | Templates.
  585. }
  586. @Override
  587. public void exitExpression_list_typed(IvannosysGrammarParser.Expression_list_typedContext ctx) {
  588. Node argument = astCurrent();
  589. if (argument != null && argument.find("ids") != null) {
  590. try {
  591. // System.out.println("Argument:" + argument);
  592. DeclVar(ctx, argument);
  593. } catch (Exception ex) {
  594. Logger.getLogger(IvannosysListener.class.getName()).log(Level.SEVERE, null, ex);
  595. }
  596. }
  597. astReturnLevel();
  598. super.exitExpression_list_typed(ctx); //To change body of generated methods, choose Tools | Templates.
  599. }
  600. @Override
  601. public void enterId_list(IvannosysGrammarParser.Id_listContext ctx) {
  602. astSetCurrentNode("ids", ctx);
  603. for (TerminalNode id : ctx.ID()) {
  604. astAddChildren(id.getText());
  605. }
  606. super.enterId_list(ctx); //To change body of generated methods, choose Tools | Templates.
  607. }
  608. @Override
  609. public void exitId_list(IvannosysGrammarParser.Id_listContext ctx) {
  610. astReturnLevel();
  611. super.exitId_list(ctx); //To change body of generated methods, choose Tools | Templates.
  612. }
  613. @Override
  614. public void enterStructType(IvannosysGrammarParser.StructTypeContext ctx) {
  615. super.enterStructType(ctx); //To change body of generated methods, choose Tools | Templates.
  616. }
  617. @Override
  618. public void exitStructType(IvannosysGrammarParser.StructTypeContext ctx) {
  619. Node decl = astCurrent(), type;
  620. ArrayList<Node> attribs = new ArrayList<>();
  621. ArrayList<Node> decls = decl.childrens();
  622. // System.out.println("StructType:" + decl);
  623. for (Node ids : decl.findAll("ids", "value")) {
  624. type = decls.get(decls.indexOf(ids) + 1);
  625. for (Node id : ids.childrens()) {
  626. astBaseSet(ctx, id);
  627. id.Set("class", "attr");
  628. id.addFilho(type);
  629. attribs.add(id);
  630. }
  631. }
  632. decl.childrens = attribs;
  633. super.exitStructType(ctx); //To change body of generated methods, choose Tools | Templates.
  634. }
  635. @Override
  636. public void enterComposite(IvannosysGrammarParser.CompositeContext ctx) {
  637. // astSetCurrentNode("composite", ctx);
  638. super.enterComposite(ctx); //To change body of generated methods, choose Tools | Templates.
  639. }
  640. @Override
  641. public void exitComposite(IvannosysGrammarParser.CompositeContext ctx) {
  642. // astReturnLevel();
  643. super.exitComposite(ctx); //To change body of generated methods, choose Tools | Templates.
  644. }
  645. @Override
  646. public void enterArrayType(IvannosysGrammarParser.ArrayTypeContext ctx) {
  647. astCurrent()
  648. .Set("class", "literal")
  649. .Set("value", "literal")
  650. .Set("subclass", "array");
  651. super.enterArrayType(ctx); //To change body of generated methods, choose Tools | Templates.
  652. }
  653. @Override
  654. public void exitArrayType(IvannosysGrammarParser.ArrayTypeContext ctx) {
  655. super.exitArrayType(ctx); //To change body of generated methods, choose Tools | Templates.
  656. }
  657. @Override
  658. public void enterFieldDecl(IvannosysGrammarParser.FieldDeclContext ctx) {
  659. super.enterFieldDecl(ctx); //To change body of generated methods, choose Tools | Templates.
  660. }
  661. @Override
  662. public void exitFieldDecl(IvannosysGrammarParser.FieldDeclContext ctx) {
  663. // if (ctx.id_list() != null) {
  664. // for (TerminalNode x : ctx.id_list().ID()) {
  665. //// astSetCurrentNode(x.getText(), ctx);
  666. //// astSetAtributo("class", "attr");
  667. //// astReturnLevel();
  668. // }
  669. // } else if (ctx.anon_field() != null) {
  670. //// ctx.anon_field().typename().getText()
  671. // }
  672. // Node decl = astCurrent(), type;
  673. // ArrayList<Node> attribs = new ArrayList<>();
  674. // ArrayList<Node> decls = decl.childrens();
  675. //
  676. // for (Node ids : decl.findAll("ids", "value")) {
  677. // type = decls.Get(decls.indexOf(ids) + 1);
  678. // for (Node id : ids.childrens()) {
  679. // System.out.println("Add attr:" + id + type);
  680. // astBaseSet(ctx, id);
  681. // id.Set("class", "attr");
  682. // id.addFilho(type);
  683. // attribs.Add(id);
  684. // }
  685. // }
  686. // decl.childrens = attribs;
  687. super.exitFieldDecl(ctx); //To change body of generated methods, choose Tools | Templates.
  688. }
  689. @Override
  690. public void enterIndex(IvannosysGrammarParser.IndexContext ctx) {
  691. super.enterIndex(ctx); //To change body of generated methods, choose Tools | Templates.
  692. }
  693. @Override
  694. public void exitIndex(IvannosysGrammarParser.IndexContext ctx) {
  695. super.exitIndex(ctx); //To change body of generated methods, choose Tools | Templates.
  696. }
  697. // Definicao de um bloco de instrucoes
  698. @Override
  699. public void enterDef_block(IvannosysGrammarParser.Def_blockContext ctx) {
  700. astSetCurrentNode("stmts", ctx);
  701. astSetAtributo("class", "stmts");
  702. astBaseSet(ctx);
  703. super.enterDef_block(ctx); //To change body of generated methods, choose Tools | Templates.
  704. }
  705. @Override
  706. public void exitDef_block(IvannosysGrammarParser.Def_blockContext ctx) {
  707. astReturnLevel();
  708. super.exitDef_block(ctx); //To change body of generated methods, choose Tools | Templates.
  709. }
  710. // Definicao do retorno de uma funcao
  711. @Override
  712. public void enterReturn_stmt(IvannosysGrammarParser.Return_stmtContext ctx) {
  713. astSetCurrentNode("return", ctx);
  714. astSetAtributo("class", "return");
  715. astBaseSet(ctx);
  716. super.enterReturn_stmt(ctx); //To change body of generated methods, choose Tools | Templates.
  717. }
  718. @Override
  719. public void exitReturn_stmt(IvannosysGrammarParser.Return_stmtContext ctx) {
  720. astReturnLevel();
  721. super.exitReturn_stmt(ctx); //To change body of generated methods, choose Tools | Templates.
  722. }
  723. @Override
  724. public void enterInc_dec(IvannosysGrammarParser.Inc_decContext ctx) {
  725. astSetCurrentNode("incdec.stmt", ctx);
  726. astSetAtributo("class", "incdec");
  727. astSetCurrentNode(ctx.op.getText(), ctx);
  728. astSetAtributo("class", "operator");
  729. astReturnLevel();
  730. super.enterInc_dec(ctx); //To change body of generated methods, choose Tools | Templates.
  731. }
  732. @Override
  733. public void exitInc_dec(IvannosysGrammarParser.Inc_decContext ctx) {
  734. astReturnLevel();
  735. super.exitInc_dec(ctx); //To change body of generated methods, choose Tools | Templates.
  736. }
  737. //DECLARACAO DE FUNCOES
  738. protected String __functionName__(IvannosysGrammarParser.Def_functionContext ctx) {
  739. return ((ctx.name != null)
  740. ? ctx.name.getText() : ("anonymous." + this.uniq++));
  741. }
  742. @Override
  743. public void enterDef_function(IvannosysGrammarParser.Def_functionContext ctx) {
  744. String id = this.__functionName__(ctx), classe;
  745. // setEscopo("func." + id);
  746. setEscopo(id);
  747. astSetCurrentNode(id, ctx);
  748. astBaseSet(ctx);
  749. if (ctx.receive_type() != null) {
  750. astSetAtributo("method", "true");
  751. classe = "dec.method";
  752. } else {
  753. classe = "dec.func";
  754. }
  755. astSetAtributo("class", classe);
  756. super.enterDef_function(ctx); //To change body of generated methods, choose Tools | Templates.
  757. }
  758. @Override
  759. public void exitDef_function(IvannosysGrammarParser.Def_functionContext ctx) {
  760. Node node = astCurrent();
  761. ArrayList<String> name = null;
  762. if (ctx.receive_type() != null) {
  763. astSetAtributo("method", "true");
  764. name = new ArrayList<String>();
  765. // name.add(packageNames.peek());
  766. name.add("method");
  767. name.add("(" + node.find("receive.type").find("type").Get("type") + ")"); // type
  768. } else {
  769. if (name == null) {
  770. name = new ArrayList<String>();
  771. name.add(packageNames.peek());
  772. }
  773. }
  774. // Adiciona o nome da funcao
  775. name.add(node.getText());
  776. node.Set("name", node.getText());
  777. try {
  778. astBaseSet(ctx, node);
  779. Functions.Add(Utils.Join(name, "."), node);
  780. } catch (Exception e) {
  781. errors.AddError(
  782. (Instruction) new Instruction()
  783. .Set("class", "Decl.Func")
  784. .Set("msg", e.getMessage())
  785. .Set("line", ctx.getStart().getLine())
  786. .Set("col", ctx.getStart().getCharPositionInLine()));
  787. }
  788. scopeStack.pop();
  789. astReturnLevel();
  790. super.exitDef_function(ctx); //To change body of generated methods, choose Tools | Templates.
  791. }
  792. /**
  793. * Não possui valor padrão. corresponde a variavel da qual é chamado um
  794. * metodo
  795. *
  796. * @param ctx
  797. */
  798. @Override
  799. public void enterReceive_type(IvannosysGrammarParser.Receive_typeContext ctx) {
  800. astSetCurrentNode("receive.type", ctx);
  801. astAddChildren(ctx.ID().getText()).Set("class", "ID");
  802. super.enterReceive_type(ctx); //To change body of generated methods, choose Tools | Templates.
  803. }
  804. @Override
  805. public void exitReceive_type(IvannosysGrammarParser.Receive_typeContext ctx) {
  806. ArrayList<Node> parts = astCurrent().childrens();
  807. String varname = parts.get(0).getText();
  808. String fullname = scopeStack.peek() + "." + varname;
  809. // astBaseSet(ctx);
  810. Node var = new Node(fullname);
  811. parts.get(0).Set("value", fullname);
  812. var.Set("name", varname)
  813. .Set("pointer", parts.get(1).Get("pointer"))
  814. .Set("type", parts.get(1).Get("type"));
  815. // System.out.println("POINTER[" + fullname + "]:" + parts.Get(1).Get("pointer"));
  816. try {
  817. Variables.Add(fullname, var);
  818. } catch (Exception e) {
  819. errors.AddError(
  820. (Instruction) new Instruction()
  821. .Set("class", "Import")
  822. .Set("msg", e.getMessage())
  823. .Set("line", ctx.getStart().getLine())
  824. .Set("col", ctx.getStart().getCharPositionInLine()));
  825. }
  826. astReturnLevel();
  827. super.exitReceive_type(ctx); //To change body of generated methods, choose Tools | Templates.
  828. }
  829. @Override
  830. public void enterReturn_dec(IvannosysGrammarParser.Return_decContext ctx) {
  831. astSetCurrentNode("dec.return", ctx);
  832. super.enterReturn_dec(ctx); //To change body of generated methods, choose Tools | Templates.
  833. }
  834. @Override
  835. public void exitReturn_dec(IvannosysGrammarParser.Return_decContext ctx) {
  836. astReturnLevel();
  837. super.exitReturn_dec(ctx); //To change body of generated methods, choose Tools | Templates.
  838. }
  839. @Override
  840. public void enterDef_interface(IvannosysGrammarParser.Def_interfaceContext ctx) {
  841. astSetCurrentNode(ctx.ID().getText(), ctx);
  842. astSetAtributo("class", "dec.interface");
  843. astSetAtributo("package", "");
  844. super.enterDef_interface(ctx); //To change body of generated methods, choose Tools | Templates.
  845. }
  846. @Override
  847. public void exitDef_interface(IvannosysGrammarParser.Def_interfaceContext ctx) {
  848. Node node = astCurrent();
  849. Interfaces.Add(packageNames.peek() + "." + node.getText(), node);
  850. astReturnLevel();
  851. super.exitDef_interface(ctx); //To change body of generated methods, choose Tools | Templates.
  852. }
  853. @Override
  854. public void enterFunc_spec(IvannosysGrammarParser.Func_specContext ctx) {
  855. astSetCurrentNode(ctx.ID().getText(), ctx);
  856. astSetAtributo("class", "desc.method");
  857. super.enterFunc_spec(ctx); //To change body of generated methods, choose Tools | Templates.
  858. }
  859. @Override
  860. public void exitFunc_spec(IvannosysGrammarParser.Func_specContext ctx) {
  861. astReturnLevel();
  862. super.exitFunc_spec(ctx); //To change body of generated methods, choose Tools | Templates.
  863. }
  864. @Override
  865. public void enterDec_var_short(IvannosysGrammarParser.Dec_var_shortContext ctx) {
  866. astSetCurrentNode("dec.var.short", ctx);
  867. astSetAtributo("class", "def.assign");
  868. // List<TerminalNode> ids = ctx.id_list().ID();
  869. // List<IvannosysGrammarParser.ExpressionContext> expr = ctx.expression_list().expression();
  870. // int idsLen = ids.size(), exprLen = expr.size();
  871. //
  872. // if (idsLen == exprLen) {// Caso OK
  873. //// Node inode;
  874. //// for (TerminalNode id : ids) {
  875. //// inode = astAddChildren(id.getText());
  876. //// inode.Set("class", "ID");
  877. //// }
  878. //
  879. // } else if (idsLen < exprLen) {// Menos endereco de atribuicao
  880. //
  881. // } else {// Mais endereco de atribuicao
  882. //
  883. // }
  884. super.enterDec_var_short(ctx); //To change body of generated methods, choose Tools | Templates.
  885. }
  886. @Override
  887. public void exitDec_var_short(IvannosysGrammarParser.Dec_var_shortContext ctx) {
  888. try {
  889. DeclVar(ctx, astCurrent());
  890. astReturnLevel();
  891. super.exitDec_var_short(ctx); //To change body of generated methods, choose Tools | Templates.
  892. } catch (Exception ex) {
  893. Logger.getLogger(IvannosysListener.class.getName()).log(Level.SEVERE, null, ex);
  894. }
  895. }
  896. @Override
  897. public void enterDef_for(IvannosysGrammarParser.Def_forContext ctx) {
  898. String id = "for_" + this.__uniq__();
  899. setEscopo(id);
  900. astSetCurrentNode(id, ctx);
  901. astSetAtributo("class", "for.stmt");
  902. astBaseSet(ctx);
  903. super.enterDef_for(ctx); //To change body of generated methods, choose Tools | Templates.
  904. }
  905. @Override
  906. public void exitDef_for(IvannosysGrammarParser.Def_forContext ctx) {
  907. scopeStack.pop();
  908. astReturnLevel();
  909. super.exitDef_for(ctx); //To change body of generated methods, choose Tools | Templates.
  910. }
  911. @Override
  912. public void enterIncrement(IvannosysGrammarParser.IncrementContext ctx) {
  913. astSetCurrentNode("increment", ctx);
  914. super.enterIncrement(ctx); //To change body of generated methods, choose Tools | Templates.
  915. }
  916. @Override
  917. public void exitIncrement(IvannosysGrammarParser.IncrementContext ctx) {
  918. astReturnLevel();
  919. super.exitIncrement(ctx); //To change body of generated methods, choose Tools | Templates.
  920. }
  921. @Override
  922. public void enterInitialization(IvannosysGrammarParser.InitializationContext ctx) {
  923. astSetCurrentNode("initialization", ctx);
  924. super.enterInitialization(ctx); //To change body of generated methods, choose Tools | Templates.
  925. }
  926. @Override
  927. public void exitInitialization(IvannosysGrammarParser.InitializationContext ctx) {
  928. astReturnLevel();
  929. super.exitInitialization(ctx); //To change body of generated methods, choose Tools | Templates.
  930. }
  931. @Override
  932. public void enterTest(IvannosysGrammarParser.TestContext ctx) {
  933. astSetCurrentNode("test", ctx).Set("class", "test");
  934. super.enterTest(ctx); //To change body of generated methods, choose Tools | Templates.
  935. }
  936. @Override
  937. public void exitTest(IvannosysGrammarParser.TestContext ctx) {
  938. // if (astCurrent().childrens().size() == 0) {
  939. // astCurrent().parent.removeFilho(astCurrent());
  940. // }
  941. astReturnLevel();
  942. super.exitTest(ctx); //To change body of generated methods, choose Tools | Templates.
  943. }
  944. @Override
  945. public void enterFor_clause(IvannosysGrammarParser.For_clauseContext ctx) {
  946. // astSetCurrentNode("ctrl", ctx);
  947. // astSetAtributo("class", "ctrl");
  948. // astSetAtributo("subclass", "clause");
  949. super.enterFor_clause(ctx); //To change body of generated methods, choose Tools | Templates.
  950. }
  951. @Override
  952. public void exitFor_clause(IvannosysGrammarParser.For_clauseContext ctx) {
  953. // astReturnLevel();
  954. super.exitFor_clause(ctx); //To change body of generated methods, choose Tools | Templates.
  955. }
  956. @Override
  957. public void enterFor_each(IvannosysGrammarParser.For_eachContext ctx) {
  958. astSetCurrentNode("range", ctx);
  959. astSetAtributo("class", "range");
  960. // this.ReadId.push(false);
  961. // astSetAtributo("subclass", "each");
  962. super.enterFor_each(ctx); //To change body of generated methods, choose Tools | Templates.
  963. }
  964. @Override
  965. public void exitFor_each(IvannosysGrammarParser.For_eachContext ctx) {
  966. // this.ReadId.pop();
  967. Node range = astCurrent(),
  968. ids = new Node("ids");
  969. range.Set("type", ctx.R_SHORT_VAR() != null ? "dec" : "assign");
  970. ids.Set("class", "ids");
  971. for (Node n : range.findAll("selector", "class")) {
  972. ids.addFilho(n);
  973. range.removeFilho(n);
  974. }
  975. astAddChildren(ids);
  976. astReturnLevel();
  977. super.exitFor_each(ctx); //To change body of generated methods, choose Tools | Templates.
  978. }
  979. @Override
  980. public void enterUnary_expr(IvannosysGrammarParser.Unary_exprContext ctx) {
  981. // System.out.println("Unary:" + ctx.getText());
  982. if (ctx.op != null) {
  983. String subclass, op = ctx.op.getText();
  984. switch (op) {
  985. case "&":
  986. subclass = "address";
  987. break;
  988. case "!":
  989. subclass = "negation.bool";
  990. break;
  991. case "+":
  992. subclass = "add";
  993. break;
  994. case "-":
  995. subclass = "negation.arith";
  996. break;
  997. case "*":
  998. subclass = "content";
  999. break;
  1000. default:
  1001. return;
  1002. }
  1003. astSetCurrentNode("unary", ctx)
  1004. .Set("class", "unary")
  1005. .Set("subclass", subclass);
  1006. astAddChildren(op)
  1007. .Set("class", "operator");
  1008. }
  1009. super.enterUnary_expr(ctx); //To change body of generated methods, choose Tools | Templates.
  1010. }
  1011. @Override
  1012. public void exitUnary_expr(IvannosysGrammarParser.Unary_exprContext ctx) {
  1013. if (ctx.op != null) {
  1014. Node c = astCurrent();
  1015. c.Set("type", c.childrens().get(1).Get("type"));
  1016. astReturnLevel();
  1017. }
  1018. super.exitUnary_expr(ctx); //To change body of generated methods, choose Tools | Templates.
  1019. }
  1020. @Override
  1021. public void enterDef_assign_op(IvannosysGrammarParser.Def_assign_opContext ctx) {
  1022. astSetCurrentNode("def.assign", ctx);
  1023. astSetAtributo("class", "def.assign");
  1024. IvannosysGrammarParser.Assign_modifyContext mod = ctx.assign_modify();
  1025. if (mod != null) {
  1026. astSetAtributo("modify", mod.getText());
  1027. }
  1028. astBaseSet(ctx);
  1029. // super.enterDef_assign_op(ctx); //To change body of generated methods, choose Tools | Templates.
  1030. }
  1031. @Override
  1032. public void exitDef_assign_op(IvannosysGrammarParser.Def_assign_opContext ctx) {
  1033. for (Node address : astCurrent().first().childrens()) {
  1034. address.Set("access", "write");
  1035. }
  1036. astReturnLevel();
  1037. // super.exitDef_assign_op(ctx); //To change body of generated methods, choose Tools | Templates.
  1038. }
  1039. // //CONTROLE
  1040. // //IF-ELSE
  1041. @Override
  1042. public void enterDef_if(IvannosysGrammarParser.Def_ifContext ctx
  1043. ) {
  1044. astSetCurrentNode("if." + this.__uniq__(), ctx);
  1045. astSetAtributo("class", "if.stmt");
  1046. astBaseSet(ctx);
  1047. super.enterDef_if(ctx); //To change body of generated methods, choose Tools | Templates.
  1048. }
  1049. @Override
  1050. public void exitDef_if(IvannosysGrammarParser.Def_ifContext ctx) {
  1051. astReturnLevel();
  1052. super.exitDef_if(ctx); //To change body of generated methods, choose Tools | Templates.
  1053. }
  1054. //IFBLOCK
  1055. @Override
  1056. public void enterDef_if_block(IvannosysGrammarParser.Def_if_blockContext ctx) {
  1057. astSetCurrentNode("if.case.stmt", ctx);
  1058. astSetAtributo("class", "if.case.stmt");
  1059. astBaseSet(ctx);
  1060. super.enterDef_if_block(ctx); //To change body of generated methods, choose Tools | Templates.
  1061. }
  1062. @Override
  1063. public void exitDef_if_block(IvannosysGrammarParser.Def_if_blockContext ctx) {
  1064. astReturnLevel();
  1065. super.exitDef_if_block(ctx); //To change body of generated methods, choose Tools | Templates.
  1066. }
  1067. @Override
  1068. public void enterRange(IvannosysGrammarParser.RangeContext ctx) {
  1069. astSetCurrentNode("range.gen", ctx);
  1070. super.enterRange(ctx); //To change body of generated methods, choose Tools | Templates.
  1071. }
  1072. @Override
  1073. public void exitRange(IvannosysGrammarParser.RangeContext ctx) {
  1074. astReturnLevel();
  1075. super.exitRange(ctx); //To change body of generated methods, choose Tools | Templates.
  1076. }
  1077. @Override
  1078. public void enterPrimary_expr(IvannosysGrammarParser.Primary_exprContext ctx) {
  1079. String base = "",
  1080. funcname = "",
  1081. subclasse = "",
  1082. classe = "selector",
  1083. type = "",
  1084. pointer = "",
  1085. name = "",
  1086. classType = "",
  1087. ctxVar = "";
  1088. Node d = new Node("");
  1089. astBaseSet(ctx, d);
  1090. if (ctx.getParent().getClass().getName().equals("grammar.IvannosysGrammarParser$Primary_exprContext")) {
  1091. // System.out.println("Return Primary_expr:" + ctx.getText());
  1092. return;
  1093. } else if (ctx.arguments() != null) {
  1094. base = ctx.primary_expr().getText();
  1095. classe = "call";
  1096. subclasse = "arguments";
  1097. // É o acesso de uma funcao do pacote atual
  1098. if (base.indexOf(".") == -1) {
  1099. funcname = base;
  1100. base = packageNames.peek() + "." + base;
  1101. name = base;
  1102. } else {
  1103. String[] parts = base.split("\\.");
  1104. if (parts.length >= 2 && !packages.containsKey(parts[0])) {
  1105. // System.out.println("Base:" + +"." + base);
  1106. // É sempre um metodo
  1107. ArrayList<String> p = new ArrayList<>();
  1108. p.add(scopeStack.peek());
  1109. for (int k = 0; k < parts.length - 1; k++) {
  1110. p.add(parts[k]);
  1111. }
  1112. ctxVar = Utils.Join(p, ".");
  1113. String t = Variables.Type(ctxVar);
  1114. funcname = parts[parts.length - 1];
  1115. name = funcname;
  1116. // base = packageNames.peek() + ".method.(" + t + ")." + funcname;
  1117. base = "method.(" + t + ")." + funcname;
  1118. } else {
  1119. name = funcname = parts[1];
  1120. // É um acesso de uma funcao de um pacote
  1121. }
  1122. }
  1123. } else if (ctx.operand() != null) {
  1124. base = ctx.operand().getText();
  1125. if (ctx.operand().primitive_value() != null) {
  1126. classType = "value";
  1127. type = getTypeOfPrimitive(ctx.operand().primitive_value());
  1128. } else {
  1129. try {
  1130. base = scopeStack.peek() + "." + base;
  1131. type = Variables.TypeOf(base);
  1132. pointer = Variables.Get(base).Get("pointer");
  1133. } catch (Exception ex) {
  1134. // Logger.getLogger(IvannosysListener.class.getName()).Log(Level.SEVERE, null, ex);
  1135. }
  1136. }
  1137. subclasse = "operand";
  1138. } else if (ctx.expression_seletor() != null) {
  1139. try {
  1140. base = scopeStack.peek() + "." + ctx.primary_expr().getText() + "." + ctx.expression_seletor().ID().getText();
  1141. subclasse = "selector";
  1142. type = Variables.TypeOf(base);
  1143. } catch (Exception ex) {
  1144. // Logger.getLogger(IvannosysListener.class.getName()).Log(Level.SEVERE, null, ex);
  1145. }
  1146. } else if (ctx.index() != null) {
  1147. try {
  1148. subclasse = "index";
  1149. base = scopeStack.peek() + "." + ctx.id;
  1150. type = Variables.TypeOf(base);
  1151. } catch (Exception ex) {
  1152. // Logger.getLogger(IvannosysListener.class.getName()).Log(Level.SEVERE, null, ex);
  1153. }
  1154. }
  1155. ast.setNode(d.Set("value", base)
  1156. .Set("class", classe)
  1157. .Set("subclass", subclasse)
  1158. .Set("type", type)
  1159. .Set("name", name)
  1160. .Set("pointer", pointer)
  1161. .Set("classType", classType));
  1162. if (funcname != "") {
  1163. d.Set("ctx", ctxVar).Set("funcname", funcname);
  1164. }
  1165. this.ReadId.push(false);
  1166. // System.out.println("PrimaryExpr:" + base + "<>" + ctx.getText());
  1167. super.enterPrimary_expr(ctx); //To change body of generated methods, choose Tools | Templates.
  1168. }
  1169. @Override
  1170. public void exitPrimary_expr(IvannosysGrammarParser.Primary_exprContext ctx) {
  1171. if (ctx.getParent().getClass().getName().equals("grammar.IvannosysGrammarParser$Primary_exprContext")) {
  1172. return;
  1173. } else if (ctx.arguments() != null) {
  1174. // System.out.println("packageName:" + packageName);
  1175. // Functions.Add(, null);
  1176. // base = ctx.primary_expr().getText();
  1177. // classe = "call";
  1178. // subclasse = "arguments";
  1179. }
  1180. this.ReadId.pop();
  1181. astReturnLevel();
  1182. super.exitPrimary_expr(ctx); //To change body of generated methods, choose Tools | Templates.
  1183. }
  1184. @Override
  1185. public void enterExpression_seletor(IvannosysGrammarParser.Expression_seletorContext ctx) {
  1186. super.enterExpression_seletor(ctx); //To change body of generated methods, choose Tools | Templates.
  1187. }
  1188. @Override
  1189. public void exitExpression_seletor(IvannosysGrammarParser.Expression_seletorContext ctx) {
  1190. super.exitExpression_seletor(ctx); //To change body of generated methods, choose Tools | Templates.
  1191. }
  1192. @Override
  1193. public void enterExpression(IvannosysGrammarParser.ExpressionContext ctx) {
  1194. if (ctx.op != null) { // expr_operation
  1195. String op = ctx.op.getText(), classe = "", subclasse = "", type = "";
  1196. switch (op) {
  1197. case "||":
  1198. case "&&":
  1199. case "==":
  1200. case "!=":
  1201. case "<":
  1202. case "<=":
  1203. case ">=":
  1204. case ">":
  1205. classe = "expr";
  1206. subclasse = "bool";
  1207. type = "bool";
  1208. //Booleana
  1209. break;
  1210. case "+":
  1211. case "-":
  1212. case "*":
  1213. case "/":
  1214. case "%":
  1215. case "&":
  1216. case "^":
  1217. case "|":
  1218. case "<<":
  1219. case ">>":
  1220. classe = "expr";
  1221. subclasse = "arith";
  1222. type = "int";
  1223. //Aritimeticas
  1224. }
  1225. astSetCurrentNode(op, ctx)
  1226. .Set("type", type)
  1227. .Set("class", classe)
  1228. .Set("subclass", subclasse);
  1229. } else { // expr_unary
  1230. }
  1231. super.enterExpression(ctx); //To change body of generated methods, choose Tools | Templates.
  1232. }
  1233. @Override
  1234. public void exitExpression(IvannosysGrammarParser.ExpressionContext ctx) {
  1235. if (ctx.op != null) {
  1236. astReturnLevel();
  1237. }
  1238. super.exitExpression(ctx); //To change body of generated methods, choose Tools | Templates.
  1239. }
  1240. @Override
  1241. public void enterOperand(IvannosysGrammarParser.OperandContext ctx) {
  1242. if (this.ReadId.peek() && ctx.Value != "") {
  1243. astSetCurrentNode(ctx.Value, ctx);
  1244. }
  1245. super.enterOperand(ctx); //To change body of generated methods, choose Tools | Templates.
  1246. }
  1247. @Override
  1248. public void exitOperand(IvannosysGrammarParser.OperandContext ctx) {
  1249. if (this.ReadId.peek() && ctx.Value != "") {
  1250. String type;
  1251. Node operand = astCurrent();
  1252. if (ctx.primitive_value() != null) {
  1253. type = getTypeOfPrimitive(ctx.primitive_value());
  1254. } else {
  1255. Node var = Variables.Get(ctx.ID().getText());
  1256. type = var.Get("type");
  1257. operand.copy("pointer", var);
  1258. }
  1259. operand.Set("class", "operand").Set("type", type);
  1260. astReturnLevel();
  1261. }
  1262. super.exitOperand(ctx); //To change body of generated methods, choose Tools | Templates.
  1263. }
  1264. @Override
  1265. public void enterLabel_stmt(IvannosysGrammarParser.Label_stmtContext ctx) {
  1266. astSetCurrentNode(ctx.ID().getText(), ctx).Set("class", "label.stmt");
  1267. super.enterLabel_stmt(ctx); //To change body of generated methods, choose Tools | Templates.
  1268. }
  1269. @Override
  1270. public void exitLabel_stmt(IvannosysGrammarParser.Label_stmtContext ctx) {
  1271. astReturnLevel();
  1272. super.exitLabel_stmt(ctx); //To change body of generated methods, choose Tools | Templates.
  1273. }
  1274. @Override
  1275. public void enterDef_switch(IvannosysGrammarParser.Def_switchContext ctx) {
  1276. this.insideSwitch = true;
  1277. astSetCurrentNode("switch." + this.__uniq__(), ctx);
  1278. astSetAtributo("class", "switch.stmt");
  1279. astBaseSet(ctx);
  1280. super.enterDef_switch(ctx); //To change body of generated methods, choose Tools | Templates.
  1281. }
  1282. @Override
  1283. public void enterFlux_control(IvannosysGrammarParser.Flux_controlContext ctx) {
  1284. Node ctrlStmt = astSetCurrentNode(ctx.control, ctx)
  1285. .Set("class", "ctrl.stmt");
  1286. if (ctx.ID() != null) {
  1287. ctrlStmt.Set("label", ctx.ID().getText());
  1288. }
  1289. super.enterFlux_control(ctx); //To change body of generated methods, choose Tools | Templates.
  1290. }
  1291. @Override
  1292. public void exitFlux_control(IvannosysGrammarParser.Flux_controlContext ctx) {
  1293. astReturnLevel();
  1294. super.exitFlux_control(ctx); //To change body of generated methods, choose Tools | Templates.
  1295. }
  1296. @Override
  1297. public void exitDef_switch(IvannosysGrammarParser.Def_switchContext ctx) {
  1298. astReturnLevel();
  1299. this.insideSwitch = false;
  1300. super.exitDef_switch(ctx); //To change body of generated methods, choose Tools | Templates.
  1301. }
  1302. @Override
  1303. public void enterDef_case(IvannosysGrammarParser.Def_caseContext ctx) {
  1304. astSetCurrentNode("switch.case", ctx);
  1305. astSetAtributo("class", "def.case");
  1306. astBaseSet(ctx);
  1307. super.enterDef_case(ctx); //To change body of generated methods, choose Tools | Templates.
  1308. }
  1309. @Override
  1310. public void exitDef_case(IvannosysGrammarParser.Def_caseContext ctx) {
  1311. // retorno do switch
  1312. // Node c =astCurrent();
  1313. astReturnLevel();
  1314. super.exitDef_case(ctx); //To change body of generated methods, choose Tools | Templates.
  1315. }
  1316. @Override
  1317. public void enterStatement_list(IvannosysGrammarParser.Statement_listContext ctx) {
  1318. astSetCurrentNode("stmts", ctx);
  1319. astSetAtributo("class", "stmts");
  1320. super.enterStatement_list(ctx); //To change body of generated methods, choose Tools | Templates.
  1321. }
  1322. @Override
  1323. public void exitStatement_list(IvannosysGrammarParser.Statement_listContext ctx) {
  1324. astReturnLevel();
  1325. super.exitStatement_list(ctx); //To change body of generated methods, choose Tools | Templates.
  1326. }
  1327. /*AST FUNCTIONS ----------------------------------------------------------*/
  1328. protected void astBaseSet(ParserRuleContext ctx) {
  1329. astBaseSet(ctx, astCurrent());
  1330. }
  1331. protected void astBaseSet(ParserRuleContext ctx, Node n) {
  1332. n.Set("file", scopeFile.peek())
  1333. .Set("scope", scopeStack.peek())
  1334. .Set("line", "" + ctx.getStart().getLine())
  1335. .Set("col", "" + ctx.getStart().getCharPositionInLine());
  1336. }
  1337. protected String getNodeType(RuleContext node) {
  1338. return node.getClass().getSimpleName().replace("Context", "");
  1339. }
  1340. protected void setEscopo(String escopo) {
  1341. String ant = scopeStack.empty() ? "" : scopeStack.peek() + ".@";
  1342. scopeStack.push(ant + escopo);
  1343. }
  1344. protected Node astAddChildren(String n) {
  1345. return astAddChildren(new Node(n));
  1346. }
  1347. protected Node astAddChildren(Node n) {
  1348. this.ast.addChildren(n);
  1349. return n;
  1350. }
  1351. protected Node astSetCurrentNode(String n, ParserRuleContext ctx) {
  1352. Node x = new Node(n);
  1353. astBaseSet(ctx, x);
  1354. return this.ast.setNode(x);
  1355. }
  1356. protected Node astReturnLevel() {
  1357. return this.ast.setParentToCurrent();
  1358. }
  1359. protected void astSetAtributo(String atrib, String valor) {
  1360. this.ast.setAtributo(atrib, valor);
  1361. }
  1362. AbstractSyntaxTree getAbstractSyntaxTree() {
  1363. return this.ast;
  1364. }
  1365. protected void astConcatAtributo(String atrib, String valor) {
  1366. String at = this.ast.getAtributo(atrib);
  1367. this.ast.setAtributo(atrib, at + "," + valor);
  1368. }
  1369. protected String astGetAtributo(String atrib) {
  1370. return this.ast.getAtributo(atrib);
  1371. }
  1372. protected Node astCurrent() {
  1373. return this.ast.getCurrent();
  1374. }
  1375. protected void astSetAtributo(Node parent, String atrib, String valor) {
  1376. parent.Set(atrib, valor);
  1377. }
  1378. protected int __uniq__() {
  1379. return this.uniq++;
  1380. }
  1381. // protected String getTypeOfVar(String base) {
  1382. // System.out.println("getTypeOfVar:" + base);
  1383. // Node var = Variables.Get(base);
  1384. // if (var != null) {
  1385. // return var.Get("type");
  1386. // } else {
  1387. // return "undefined";
  1388. // }
  1389. // }
  1390. }