IvannosysListener.java 58 KB

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