IvannosysListener.java 58 KB

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