IvannosysListener.java 56 KB

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