IvannosysListener.java 55 KB

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