12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447 |
- /*
- * To change this license header, choose License Headers in Project Properties.
- * To change this template file, choose Tools | Templates
- * and open the template in the editor.
- */
- package IntermediaryCode;
- import API.Api;
- import API.Functions;
- import API.Instruction;
- import API.Tipos;
- import API.Utils;
- import API.Variaveis;
- import ast.AbstractSyntaxTree;
- import ast.Node;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.LinkedHashMap;
- import java.util.LinkedList;
- import java.util.Map;
- import java.util.Stack;
- import java.util.regex.Pattern;
- // a0 a1
- // sync recebe mandando
- // exec recebe mandando
- // synexec recebe mandando
- // Atualizei as labels mas não atualizei as referencias por isso esta sendo removida quando faz a limpeza
- /**
- *
- * @author Eugenio
- */
- public final class BaseTacGen implements TacGenInterface {
- protected boolean inicializado = false;
- protected int incLabel = 0;
- protected int tmpVarCount = 1;
- // protected int OrTestAndOccurrence = 0;
- protected AbstractSyntaxTree ast;
- protected Code code;
- protected Node calEndAtt;
- protected Node compileParams;
- protected String label;
- protected String calEndVar;
- protected String calEndSize;
- protected String calEndTipo;
- protected Stack<Node> master = new Stack<>();
- protected ArrayList<String> line = new ArrayList<>();
- protected LinkedList<Boolean> branckInvert = new LinkedList<>();
- protected HashMap<String, String> arrayAcesso = new HashMap<>();
- protected HashMap<String, String> varGenMap = new HashMap<>();
- protected HashMap<String, String> funcGenMap = new HashMap<>();
- protected HashMap<String, Integer> systemCalls = new HashMap<>();
- protected ArrayList<String> currentMatrixvalues = new ArrayList<>();
- protected HashMap<String, ArrayList<String>> matrixValues = new HashMap<>();
- // protected ArrayList<CodeProcessing> afterCreate = new ArrayList<CodeProcessing>();
- protected HashMap<String, String> Complements = new HashMap<String, String>() {
- {
- put("!=", "==");
- put("==", "!=");
- put("<", ">=");
- put("<=", ">");
- put(">", "<=");
- put(">=", "<");
- }
- };
- public static Pattern AddressOperator = Pattern.compile("(\\&|\\*)");
- protected boolean enableOtimization = true;
- protected HashMap<String, String> ArrayShiftMap = new HashMap<>();
- private int jb = 0;
- public BaseTacGen() throws Exception {
- for (long i = 0; i < 31; i++) {
- power2.put(Long.toString(Long.valueOf(1 << i)), Long.valueOf(i));
- }
- }
- protected int calc(ArrayList<Integer> data) {
- Integer op1, op2, operacao;
- switch (data.size()) {
- case 1:
- return data.get(0);
- case 3:
- op1 = data.remove(0);
- operacao = data.remove(0);
- op2 = data.remove(0);
- if (operacao == 1) {
- return op1 - op2;
- // throw new Exception("Quantidade de entradas invalidas!" + data.size());
- } else {
- return op1 + op2;
- }
- default:
- op1 = data.remove(0);
- operacao = data.remove(0);
- if (operacao == 1) {
- return op1 - calc(data);
- // throw new Exception("Quantidade de entradas invalidas!" + data.size());
- } else {
- return op1 + calc(data);
- }
- }
- }
- public BaseTacGen(AbstractSyntaxTree ast) {
- for (long i = 0; i < 31; i++) {
- power2.put(Long.toString(Long.valueOf(1 << i)), Long.valueOf(i));
- }
- Ast(ast);
- }
- public void Ast(AbstractSyntaxTree ast) {
- this.ast = ast;
- code = new Code("TAC", ast);
- // code.AfterClose("clear.1", new CodeClearProcessor());
- // code.AfterClose("oti.1", new CodeOtimizadorProcessor(enableOtimization));
- // code.AfterClose("oti.1", new CodeOtimizadorProcessor(false));
- compileParams = ast.BuildParams();
- code.Template(new template.Template())
- .Formats(new HashMap<String, String>() {
- {
- String base = "{[PAD(global.position,_addressLen,' ')]':'}{[T(1)]}{[PAD(block.position,_addressLen,' ')]':'}{[T(2)]}";
- String end = "{[T(2)]}{' T< '[type]' >'}";
- put("label", "{[PAD(global.position,_addressLen,' ')]':'}{[T(2)]}{'<'[label]'>'}':'");
- put("assign", base + "{[dst]}' := '{[p1]}{' '[op]' '}{[p2]}{' --'[comment]}" + end);
- put("pointer_assignment", base + "{[dst.pointer]}{[dst]' := '}{[op]}{[p1]}{' --'[comment]}" + end);
- put("unary", base + " {[dst]} ' := '{[op]' '}{[p1]} {' --'[comment]}" + end);
- put("copy", base + " {[dst]} ' := '{[p1]} {' --'[comment]}" + end);
- put("jump", base + " 'goto ' {'<'[label]'>'} {' --'[comment]}" + end);
- put("branch", base + " 'if '{[p1]} {' '[op]' '} {[p2]} ' goto ' {'<'[label]'>'} {' --'[comment]}" + end);
- put("call", base + " {[dst]' := '} 'call <' {[funcname]} '>, ' {[nump]} {' --'[comment]}" + end);
- put("return", base + " 'return ' {[p1]} {' --'[comment]}" + end);
- put("push_param", base + " 'push_param '{[p1]} {' --'[comment]}" + end);
- put("push_return", base + " 'push_return '{[p1]} {' --'[comment]}" + end);
- put("pop_param", base + " 'pop_param '{[p1]} {' --'[comment]}" + end);
- put("pop_return", base + " 'pop_return '{[p1]} {' --'[comment]}" + end);
- }
- });
- }
- // public void DeclareConstants(Node root) throws Exception {
- //// System.out.println("DeclareConstants() ...");
- // for (Node constants : root.findAll("dec.const", "class", 0)) {
- //// System.out.println("Declare constant ..." + constants);
- // visit(constants);
- // }
- // }
- @Override
- public Code Create(AbstractSyntaxTree ast, HashMap<String, String> settings) throws Exception {
- Ast(ast);
- // DeclareConstants(ast.getRoot());
- // setOtimizacao(settings.G("clearCode").equals("true"));
- Code code = run();
- // Executa todos os tratametos definidos apos geracao do codigo
- // AfterCreate();
- printVarMap();
- // code.PrintData();
- code.Print();
- code.printOcorrences();
- return code;
- }
- protected Node visit(Node n) throws Exception {
- if (null == n || n.eq("visited", "true")) {
- return n;
- }
- n.S("visited", "true");
- // System.out.println("Visit:" + n.Class());
- switch (n.Class()) {
- case "dec.const":
- gerarConstante(n);
- break;
- case "if.stmt":
- IfStmts(n);
- break;
- case "selector":
- Selector(n);
- break;
- case "dec.var":
- // Log.PrintInfo("TAC", new Instruction().S("msg", "DECVAR." + n));
- if (n.find("exprs") != null) {
- n.S("class", "dec.var.short")
- .S("value", "dec.var.short");
- genAssign(n);
- break;
- }
- case "def.assign":
- genAssign(n);
- break;
- case "call":
- genCall(n);
- break;
- case "ID":
- genID(n);
- break;
- case "incdec":
- IncDecStmt(n);
- break;
- case "for.stmt":
- genFor(n);
- break;
- case "expr":
- _visitExpr(n);
- break;
- case "unary":
- unaryStmt(n);
- break;
- case "switch.stmt":
- switchStmt(n);
- break;
- case "test":
- test(n);
- break;
- case "return":
- visitChildrensFirst(n);
- break;
- default:
- visitRootFirst(n);
- break;
- }
- return n;
- }
- protected void genID(Node n) throws Exception {
- // System.out.println("GenId:" + n);
- Node var = Variaveis.Get(n.getText());
- n.S("_return", gerarVariavel(var));
- }
- protected void test(Node n) throws Exception {
- Node x = null;
- ArrayList<Node> chils = n.childrens();
- int size = chils.size();
- for (int i = 0; i < size; i++) {
- x = chils.get(i);
- visit(x);
- }
- n.copy("_return", x);
- }
- protected void IncDecStmt(Node n) throws Exception {
- Instruction operacao = new Instruction();
- String dst = gerarVariavel(n.findByClass("selector"));
- operacao.S("type", "assign")
- .S("format", "assign")
- .S("cat", "exp")
- .S("_return", "exp")
- .S("dst", dst)
- .S("p1", dst)
- .S("p2", "1")
- .S("p1value", "" + Api.IsValue(dst))
- .S("p2value", "true")
- .S("op", n.findByClass("operator").eq("value", "++") ? "+" : "-");
- code.Add(operacao);
- }
- protected void Selector(Node n) throws Exception {
- String tmp;
- String shift = null;
- n.S("copymode", "copy");
- switch (n.G("subclass")) {
- case "operand":
- if (n.eq("classType", "value")) {
- // n.S("value", Api.Value(n.getText()));
- n.S("_return", Api.Value(n.getText()));
- } else {
- String v = gerarVariavel(n);
- if (n.eq("pointer", "*") && n.eq("access", "read")) {
- String t = gerarVariavel("T");
- Copy(t, v, false);
- v = t;
- }
- n.S("_return", v);
- }
- // System.out.println("Seletor operand:" + n);
- break;
- case "index":
- // shift = n.childrens().G(0).getInt("value");
- // shift = n.childrens().G(0).getInt("value");
- shift = ArrayShift(n);
- case "selector":
- if (shift == null) {
- shift = "" + Variaveis.Shift(n.getText());
- }
- tmp = gerarVariavel(n) + "[" + shift + "]";
- if (!n.eq("access", "write")) {
- String t = gerarVariavel("T");
- Copy(t, tmp, false);
- tmp = t;
- }
- n.S("_return", tmp);
- break;
- case "arguments":
- break;
- }
- }
- protected ArrayList<Integer> ShiftPath(int size) {
- ArrayList<Integer> ret = new ArrayList<>();
- FindShiftPath(size, ret);
- return ret;
- }
- protected ArrayList<Integer> ShiftInterval(int size) {
- ArrayList<Integer> ret = new ArrayList<>();
- Integer op = 1, i = 1, after, before;
- //
- while (true) {
- after = 1 << (i++);
- if (after == size) {
- before = after;
- break;
- } else if (after > size) {
- before = after >> 1;
- break;
- }
- }
- // before = Math.abs(before - size);
- // after = Math.abs(after - size);
- if (Math.abs(before - size) <= Math.abs(after - size)) {
- // Se o valor anterios for menor que o posterior
- op = 0;
- }
- // else {
- // // Se o valor posterior for menor que o anterior
- // }
- ret.add(before);
- ret.add(after);
- ret.add(2, op);
- // System.out.println("Interval:{" + size + "}" + ret + "::" + op);
- return ret;
- }
- protected LinkedHashMap<String, Long> power2 = new LinkedHashMap<String, Long>();
- protected void FindShiftPath(int size, ArrayList<Integer> path) {
- size = Math.abs(size);
- ArrayList<Integer> shift = ShiftInterval(size);
- int op = shift.get(2), s1 = shift.get(op);
- // System.out.println("FindShiftPath:(" + power2.containsKey("" + s1) + "|" + size + "|" + s1 + ")\t\t" + shift);
- // System.out.println(power2);
- if (power2.containsKey("" + s1)) {
- path.add(s1);
- path.add(op);
- }
- if (size == 1) {
- // path.add(size);
- }
- System.out.println("Pathj:" + path);
- if (path.size() % 2 == 0 && Math.abs(size - s1) == 0) {
- path.remove(path.size() - 1);
- return;
- }
- FindShiftPath(size - s1, path);
- // int i = 1, after, before;
- // while (true) {
- // after = 1 << (i++);
- // if (after == size) {
- //
- // break;
- // } else if (after > size) {
- // break;
- // }
- // }
- // before = after >> 1;
- //
- // if (Math.abs(size - before) < Math.abs(after - size)) {
- // // Se o valor anterios for menor que o posterior
- // op = 1;
- // m4 = before;
- // } else {
- // // Se o valor posterior for menor que o anterior
- // op = 0;
- // m4 = after;
- // }
- // FindShiftPath(size, m4, op, path);
- }
- protected int Size(String type) {
- return Tipos.Size(type) * 4;
- }
- protected String ArrayShift(Node n) throws Exception {
- // Cria a chave para a ocorrencia de um acesso ao array, evitando recalcular o endereco
- String key = n.getText();
- for (Node node : n.childrens()) {
- key += "_" + node.getText();
- }
- if (!ArrayShiftMap.containsKey(key)) {
- // String shift;
- Node var = Variaveis.Get(n.getText());
- // System.out.println("INDEX shift:" + n + var);
- for (int i = 0, j = 1; j < var.childrens().size(); j++) {
- n.childrens().get(i++).S("collNumber", var.childrens().get(j).getText());
- }
- String ret = CalcArrayAddress(n.childrens(), Size(var.G("type")));
- // Se o offset for calculado em um inteiro atribui o mesmo como shift
- // if (Utils.isNumber(ret)) {
- // shift = ret;
- // } else {
- //// Se for um endereci faz a soma com o offset da varivel
- //// __exp("+", ret, gerarVariavel(n), ret);
- // shift = ret;
- // }
- ArrayShiftMap.put(key, ret);
- }
- return ArrayShiftMap.get(key);
- }
- protected String GenShiftLeftLogical(String var, int size, boolean mps, boolean last) throws Exception {
- ArrayList<Integer> path = ShiftPath(size);
- ArrayList<Integer> reverse = new ArrayList<>();
- for (int i = path.size() - 1; i >= 0; i--) {
- reverse.add(path.remove(i));
- }
- // System.out.println(">>>>>(var:" + var + ", size:" + size + ") arithpath:" + reverse);
- var = GSLL(var, reverse, mps, size, last);
- return var;
- }
- protected long pow2(long p) {
- return pow2("" + p);
- }
- protected long pow2(String p) {
- return power2.get(p);
- }
- protected String GSLL(String var, ArrayList<Integer> path, boolean mps, int size, boolean last) throws Exception {
- int op1, operacao, op2;
- String T1 = gerarVariavel("T"),
- T2 = gerarVariavel("T"),
- T3 = gerarVariavel("T");
- switch (path.size()) {
- case 1:
- if (!mps) {
- Copy(T1, var, false)
- .S("comment", "Copy value of index")
- .S("copy", "true");
- } else {
- T1 = var;
- }
- if (!last) {
- __exp("<<", T1, "" + pow2(size), T2).S("comment", "");
- return T2;
- }
- return T1;
- case 3:
- op1 = path.remove(0);
- operacao = path.remove(0);
- op2 = path.remove(0);
- // String T4 = gerarVariavel("T");
- if (!mps) {
- Copy(T1, var, false)
- .S("comment", "Copy value of index")
- .S("copy", "true");
- }
- if (op1 != 1) {
- __exp("<<", T1, "" + pow2(op1), T1).S("comment", "");
- }
- // if (op2 == 1) {
- // } else {
- // Copy(T3, var, false).S("comment", "Copy value of index");
- if (op2 != 1) {
- // System.out.println("GSLL:" + op2 + ":" + op1);
- // System.out.println("GSLL:op2" + pow2(op2));
- // System.out.println("GSLL:op1" + pow2(op1));
- __exp("<<", T1, "" + (pow2(op2) - pow2(op1)), T2).S("comment", "");
- // deve realizar um novo deslocamento
- } else {
- T2 = T1;
- }
- // Soma o deslocamento com o tamanho
- __exp("+", T1, T2, T1).S("comment", "");
- return T1;
- default:
- // op1 = path.remove(0);
- // operacao = path.remove(0);
- //
- // T2 = GSLL(var, path);
- //
- // Copy(T1, var, false).S("comment", "Copy value of index");
- //
- // __exp("<<", T1, "" + pow2(op1), T1).S("comment", "");
- // __exp("+", T1, T2, T1).S("comment", "");
- }
- return var;
- }
- protected String CalcArrayAddress(ArrayList<Node> childrens, int Size) throws Exception {
- // System.out.println("CalcArrayAddressINIT(" + Size + "):");
- boolean onlyNumber = true;
- for (Node node : childrens) {
- if (!node.isNumber("value")) {
- onlyNumber = false;
- break;
- }
- }
- if (onlyNumber) {
- return "" + (CalcArrayAddressNumber(childrens, Size) * Size);
- } else {
- // System.out.println("CAA:" + childrens);
- String current = CalcArrayAddressAux(childrens, Size);
- // System.out.println("Size {" + current + "}:----------->" + Size);
- // multiplica pelo tamanho
- return GenShiftLeftLogical(current, Size, true, false);
- }
- }
- protected Integer CalcArrayAddressNumber(ArrayList<Node> childrens, int Size) throws Exception {
- Node ind;
- ind = childrens.remove(0);
- Integer value = ind.getInt("value");
- // ultimo elemento da idexacao
- if (childrens.size() == 0) {
- return value;
- }
- Integer collNumber = ind.getInt("collNumber"),
- ret = CalcArrayAddressNumber(childrens, Size);
- return ((value * collNumber) + ret);
- }
- protected String CalcArrayAddressAux(ArrayList<Node> childrens, int Size) throws Exception {
- // boolean multPerSize = true;
- Node ind, nextIndex;
- ind = childrens.remove(0);
- // System.out.println("CalcArrayAddressAux:" + childrens.size() + ":" + Size + "\n" + ind);
- String current, varname;
- if (ind.eq("class", "expr")) {
- varname = gerarVariavel(
- new Node(gerarVariavel("TMP"))
- .S("array", "false")
- .S("type", "int")
- .S("var.tmp", "true")
- );
- Node p1 = visit(ind.childrens().get(0)),
- p2 = visit(ind.childrens().get(1));
- __exp(ind.getText(), p1.G("_return"), p2.G("_return"), varname);
- } else {
- varname = gerarVariavel(ind);
- }
- // if (ind)
- // ultimo elemento da idexacao
- if (childrens.size() == 0) {
- if (Utils.isNumber(ind.getText())) {
- return "" + ind.getInt("value");
- } else {
- return GenShiftLeftLogical(varname, Size, false, true);
- }
- }
- int collNumber = ind.getInt("collNumber");
- nextIndex = childrens.get(0);
- if (ind.isNumber("value") && nextIndex.isNumber("value")) {
- // System.out.println("CalcArray:" + ind.getInt("value") + ":" + ind.getInt("collNumber") + ":" + Integer.parseInt(ret));
- current = "" + (ind.getInt("value") * collNumber);
- // multPerSize = false;
- } else {
- // System.out.println("collNumber:" + collNumber);
- // current = GenShiftLeftLogical(gerarVariavel(ind), collNumber, false, false);
- current = GenShiftLeftLogical(varname, collNumber, false, false);
- // System.out.println("Gerando index calc:" + retl);
- // current = GenShiftLeftLogical(retl, Size);
- // current = retl;
- }
- String ret = CalcArrayAddressAux(childrens, Size);
- __exp("+u", current, ret, current).S("comment", "colls shift");
- // if (multPerSize) {
- // // Realiza a multiplicacao pelo tamanho do elemento
- // current = GenShiftLeftLogical(current, Size);
- // }
- return current;
- }
- // protected String CalcArrayAddress(ArrayList<Node> childrens, int Size, int index) throws Exception {
- // System.out.println("CalcArrayAddress:" + childrens.size() + ":" + Size);
- //
- // int nindex = index + 1;
- // String retl;
- // Node ind = childrens.remove(0);
- // if (childrens.size() >= 1) {
- // String ret = CalcArrayAddress(childrens, Size, nindex);
- // int collNumber = ind.getInt("collNumber");
- //
- // if (Utils.isNumber(ret) && ind.isNumber("value")) {
- //// System.out.println("CalcArray:" + ind.getInt("value") + ":" + ind.getInt("collNumber") + ":" + Integer.parseInt(ret));
- // return "" + ((ind.getInt("value") * collNumber) + Integer.parseInt(ret));
- // } else {
- //// System.out.println("collNumber:" + collNumber);
- //
- // retl = GenShiftLeftLogical(gerarVariavel(ind), collNumber);
- //
- // retl = GenShiftLeftLogical(retl, Size);
- //
- // __exp("+", retl, ret, retl).S("comment", "colls shift");
- // return retl;
- // }
- //
- // /*
- // Implementacao com mult **
- // int collNumber = ind.getInt("collNumber");
- //
- // if (Utils.isNumber(ret) && ind.isNumber("value")) {
- // System.out.println("CalcArray:" + ind.getInt("value") + ":" + collNumber + ":" + Integer.parseInt(ret));
- // return "" + ((ind.getInt("value") * collNumber) + Integer.parseInt(ret));
- // } else {
- // String retl = gerarVariavel("T");
- // __exp("*", gerarVariavel(ind), "" + collNumber, retl)
- // .S("comment", "lines shift");
- // __exp("+", retl, ret, retl)
- // .S("comment", "colls shift");
- // return retl;
- // }
- // */
- // } else {
- //
- // if (Utils.isNumber(ind.getText())) {
- // return ind.getText();
- // } else {
- // // ultimo elemento da idexacao
- //
- // return GenShiftLeftLogical(gerarVariavel(ind), Size);
- // }
- //
- // }
- // }
- /**
- * ProceSSa um node:<br>
- * Ordem:<br>
- * ->Primeiro filhoS;<br>
- * ->No principal;<br>
- *
- * @param n
- * @throws Exception
- */
- protected void visitChildrensFirst(Node n) throws Exception {
- // System.out.println("Visit:" + n.getText());
- for (Node n1 : n.childrens()) {
- // System.out.println("Visit:" + n1.getText());
- visit(n1);
- }
- // System.out.println("Process:" + n.getText());
- processarNode(n);
- }
- /**
- * ProceSSa um node:<br>
- * Ordem:<br>
- * ->Primeiro filho;<br>
- * ->No principal;<br>
- * ->Segundo filho;<br>
- *
- * @param n
- * @throws Exception
- */
- protected void visitNoMeio(Node n) throws Exception {
- visit(n.getFilho(0));
- processarNode(n);
- visit(n.getFilho(1));
- }
- /**
- * ProceSSa um node:<br>
- * Ordem:<br>
- * ->No princial;<br>
- * ->DepoiS oS filhoS
- *
- * @param n
- * @throws Exception
- */
- protected void visitRootFirst(Node n) throws Exception {
- processarNode(n);
- for (Node n1 : n.childrens()) {
- visit(n1);
- }
- }
- /**
- * Aloca endereço no inicio da memoria para conStanteS ApenaS tipoS<br>
- * [inteiro, booleano e char]
- *
- * @param n
- * @throws Exception
- */
- protected void gerarConstante(Node n) throws Exception {
- // System.out.println("Gerando constant:" + n.childrens().get(0) + n.childrens().get(1));
- // gerarVariavel(n.get(label, label));
- // getLabel("C", n);
- // if (n.closest("block", "class") != null) {
- // code.registerVar(n.G("_return"), 1, DataFrame.TYPE_VAR);
- // }
- }
- /**
- * Executa a extração fo block principal
- *
- * @throws Exception
- */
- public void main() throws Exception {
- Node main = ast.getMain();
- // main.S("_return", Threads.getId("main"));
- Node stmts = main.find("stmts");
- if (code.OpenBlock("main")) {
- PushLabel("main", "block");
- visit(stmts);
- PushLabel("main-end", "block");
- code.CloseBlock();
- }
- }
- public Code run() throws Exception {
- if (!inicializado) {
- inicializado = true;
- main();
- }
- code.UpdatePositions();
- return code;
- }
- /**
- * ProceSSa If (ElSe'S)*
- *
- * @param n
- * @throws Exception
- */
- protected void IfStmts(Node n) throws Exception {
- String end = gerarLabel(), next;
- boolean ifChain = n.childrens().size() > 1;
- //(If)+ (else)?
- next = ifChain ? gerarLabel() : end;
- n.S("next", next).S("end", end);
- for (Node stmt : n.childrens()) {
- switch (stmt.Class()) {
- case "if.case.stmt":
- IfCaseStmt(n, stmt, ifChain);
- break;
- // Else case
- case "stmts":
- // String next = gerarLabel();
- // n.S("next", next);
- visit(stmt.S("next", next));
- // Cria um PushLabel final
- // PushLabel(n.G("end"), "branch");
- // PushLabel(end);
- break;
- }
- }
- // Cria um PushLabel final
- // System.out.println("Label end:" + n.G("end"));
- PushLabel(n.G("end"), "branch");
- }
- /**
- * ProceSSa If, eSSe metodo deve Ser chamado pelo metodo IfStmtS
- *
- * @param n
- * @param _if
- * @param ifChain
- * @throws Exception
- */
- protected void IfCaseStmt(Node n, Node _if, boolean ifChain) throws Exception {
- Node test = _if.first().first();
- Node stmts = _if.find("stmts");
- // Se o teste falha deve saltar o bloco
- n.S("start", gerarLabel());
- test.S("test.type", "jb").copy("next,start,end", n);
- Branch(test, 0);
- // marca com um label o inicio do bloco do if
- PushLabel(n.G("start"), "branch");
- // gera as instruções do bloco
- visit(stmts);
- // se for uma cadeia de condiçoes com ou sem else
- if (ifChain) {
- // Salta os outros testes
- _goto(n.G("end"));
- //Adiciona o label de proximo elemento da cadeia de if's e else
- PushLabel(n.G("next"), "branch");
- //Atualiza o ponteiro para o proximo elemento
- n.S("next", gerarLabel());
- }
- }
- /**
- * Executa tratamento de um no eSpecifico, Selecionado pelo atributo claSS
- *
- * @param n
- * @throws Exception
- */
- protected void processarNode(Node n) throws Exception {
- switch (n.Class()) {
- case "return":
- genReturn(n);
- break;
- case "ctrl.stmt":
- ctrlStmt(n);
- break;
- case "label.stmt":
- PushLabel(n.getText(), "user");
- break;
- }
- }
- protected void _visitExpr(Node n) throws Exception {
- // System.out.println("VisitExpr:" + n);
- visit(n.childrens().get(0));
- visit(n.childrens().get(1));
- switch (n.G("subclass")) {
- case "arith":// ( + | - | * | / ) integer
- genExpArith(n);
- break;
- }
- }
- protected void BranchAnd(Node n, int index) throws Exception {
- // int pos = 0;
- // if (n.parent == null) {
- // System.out.println("BranchAnd:" + n);
- // }
- // OrTestAndOccurrence++;
- Instruction instruction = null;
- ArrayList<Node> x = n.childrens();
- Node op1 = x.get(0), op2 = x.get(1);
- String type = n.G("test.type"),
- step = gerarLabel(),
- attrs = "next,end,inc,test.type,skip.test";
- n.S("skip.test", step);
- op1.copy(attrs, n);
- op2.copy(attrs, n);
- instruction = Branch(op1, 1);
- if (instruction != null) {
- switch (type) {
- case "jtb":
- instruction.S("op", Complement(instruction.G("op")));
- if (n.parent != null && n.parent.eq("value", "||")) {
- if (index == 1) {
- UpdateLabel(instruction, n.parent.G("skip.test"));
- } else if (index == 2) {
- UpdateLabel(instruction, n.parent.G("end"));
- }
- // } else if (n.parent.eq("value", "&&")) {
- } else {
- UpdateLabel(instruction, n.G("end"));
- }
- break;
- case "jb":
- // if (n.parent != null) {
- if (n.parent != null && n.parent.eq("value", "||")) {
- if (index <= 1) {
- UpdateLabel(instruction, n.parent.G("skip.test"));
- } else if (index == 2) {
- // instruction.S("op", Complement(instruction.G("op")));
- UpdateLabel(instruction, n.G("next"));
- }
- }
- // } else {
- // }
- }
- }
- // System.out.println("instruction Branch 1:" + instruction + "\n" + op1);
- // if (index == 0 || (op1.in("value", new String[]{"||", "&&"}) && !n.eq("value", op1.G("value")))) {
- // Registra o label para o saldo dos testes do primeiro parametro
- PushLabel(step, "branch");
- // }
- instruction = Branch(op2, 2);
- if (instruction != null) {
- switch (type) {
- case "jtb":
- if (n.parent != null && n.parent.eq("value", "||")) {
- if (index == 1) { // teste 1 do parametro 2 com pai ||
- instruction.S("op", Complement(instruction.G("op")));
- UpdateLabel(instruction, n.G("end"));
- } else if (index == 2) { // teste 2 do parametro 2
- UpdateLabel(instruction, n.G("next"));
- }
- // } else if (n.parent.eq("value", "&&")) {
- // if (index == 1) { // teste 1 do parametro 2 com pai &&
- //// throw new Exception("// teste 1 do parametro 2 com pai &&");
- //
- // } else if (index == 2) { // teste 2 do parametro 2 com pai &&
- // instruction.S("op", Complement(instruction.G("op")));
- // UpdateLabel(instruction, n.G("end"));
- // }
- } else {
- if (index == 1) { // teste 1 do parametro 2 geral
- instruction.S("op", Complement(instruction.G("op")));
- UpdateLabel(instruction, n.G("end"));
- } else if (index == 2) {
- // throw new Exception("teste 2 do parametro 2 geral");
- }
- }
- break;
- case "jb":
- // System.out.println("I(jb:and:2)[" + index + "]\n" + instruction + "\n" + n);
- // if (n.parent != null) {
- if (n.parent != null && n.parent.eq("value", "||")) {
- if (index <= 1) {
- // UpdateLabel(instruction, n.parent.G("skip.test"));
- instruction.S("op", Complement(instruction.G("op")));
- UpdateLabel(instruction, n.G("start"));
- } else if (index == 2) {
- // instruction.S("op", Complement(instruction.G("op")));
- UpdateLabel(instruction, n.G("next"));
- }
- }
- // } else {
- // }
- }
- }
- }
- public void UpdateLabel(Instruction I, String label) {
- String copy = I.G("label");
- if (!copy.equals("")) {
- code.RemoveLabelReference(copy);
- }
- I.S("label", label);
- code.AddLabelReference(label);
- }
- protected void BranchOr(Node n, int index) throws Exception {
- // if (n.parent == null) {
- // System.out.println("BranchOr:" + n);
- // }
- // int pos = 0;
- // OrTestAndOccurrence++;
- Instruction instruction = null;
- ArrayList<Node> x = n.childrens();
- Node op1 = x.get(0), op2 = x.get(1);
- String type = n.G("test.type"),
- step = gerarLabel(),
- attrs = "next,start,end,inc,test.type,skip.test";
- n.S("skip.test", step);
- op1.copy(attrs, n);
- op2.copy(attrs, n);
- // System.out.println("BranchOr:" + n.parent);
- // Executa o lado esquerdo do ||
- instruction = Branch(op1, 1);
- if (instruction != null) {
- switch (type) {
- case "jtb":
- if (n.parent != null && n.parent.eq("value", "&&")) {
- if (index == 1) {
- UpdateLabel(instruction, n.parent.G("skip.test"));
- }
- }
- break;
- case "jb":
- // System.out.println("I(jb:1)[" + index + "]\n" + instruction + "\n" + n);
- // System.out.println("Entrei no jb ||" + (jb++) + instruction + n.parent);
- // if (n.parent != null) {
- if (n.parent != null && n.parent.eq("value", "||")) {
- // if (index == 2) {
- instruction.S("op", Complement(instruction.G("op")));
- UpdateLabel(instruction, n.G("start"));
- // }
- } else if (n.parent != null && n.parent.eq("value", "&&")) {
- if (index <= 1) {
- instruction.S("op", Complement(instruction.G("op")));
- UpdateLabel(instruction, n.parent.G("skip.test"));
- } else if (index == 2) {
- instruction.S("op", Complement(instruction.G("op")));
- UpdateLabel(instruction, n.parent.G("start"));
- }
- // }
- } else {
- instruction.S("op", Complement(instruction.G("op")));
- if (index <= 1) {
- UpdateLabel(instruction, n.G("start"));
- } else if (index == 2) {
- }
- }
- }
- }
- // System.out.println("instruction Branch 1:" + instruction + "\n" + op1);
- // Registra o label para o saldo dos testes do primeiro parametro
- PushLabel(step, "branch");
- // Executa o lado direito do ||
- instruction = Branch(op2, 2);
- if (instruction != null) {
- switch (type) {
- case "jtb":
- if (n.parent != null && n.parent.eq("value", "&&")) {
- if (index == 1) {
- instruction.S("op", Complement(instruction.G("op")));
- UpdateLabel(instruction, n.parent.G("end"));
- }
- }
- break;
- case "jb":
- // if (n.parent != null) {
- if (n.parent != null && n.parent.eq("value", "||")) {
- if (index <= 1) {
- instruction.S("op", Complement(instruction.G("op")));
- UpdateLabel(instruction, n.G("start"));
- } else if (index == 2) {
- //
- // instruction.S("op", Complement(instruction.G("op")));
- UpdateLabel(instruction, n.G("next"));
- }
- } else if (n.parent != null && n.parent.eq("value", "&&")) {
- if (index == 1) {
- // instruction.S("op", Complement(instruction.G("op")));
- // UpdateLabel(instruction, n.parent.G("start"));
- } else if (index == 2) {
- // instruction.S("op", Complement(instruction.G("op")));
- // UpdateLabel(instruction, n.parent.G("start"));
- }
- // }
- } else {
- // instruction.S("op", Complement(instruction.G("op")));
- // UpdateLabel(instruction, n.G("next"));
- }
- }
- }
- }
- protected Instruction BranchTest(Node n, int index) throws Exception {
- ArrayList<Node> x = n.childrens();
- String type = n.G("test.type");
- boolean invert = false;
- String op, p0, p1;
- switch (type) {
- case "jb":
- invert = true;
- break;
- case "jtb":
- break;
- default:
- throw new Exception("test.type '".concat(type).concat("' not suported. Values {jtb,jb}"));
- }
- visit(n);
- // Resultado do test class ou acesso a um id ou bool
- if (!n.eq("class", "expr")) {
- op = "==";
- p0 = n.G("_return");
- p1 = "1";
- } else { //(<, <=, >, >=, ==, !=)
- op = n.getText();
- p0 = visit(x.get(0)).G("_return");
- p1 = visit(x.get(1)).G("_return");
- }
- // Inverte o teste e salta o bloco
- if (invert) {
- op = Complement(op);
- }
- // return Branch(op, p0, p1, next);
- Instruction r1 = new Instruction();
- r1.S("format", "branch")
- .S("type", "branch")
- .S("op", op)
- .S("p1", p0)
- .S("p2", p1)
- .S("p1value", "" + Api.IsValue(p0))
- .S("p2value", "" + Api.IsValue(p1))
- .S("label", n.G("next"));
- // System.out.println("Add branch:" + branckInvert.peek() + branckInvert + ">>" + (!branckInvert.isEmpty() && branckInvert.peek()) + "\n" + r1);
- code.Add(r1);
- return r1;
- }
- protected Instruction Branch(Node n, int index) throws Exception {
- Instruction instruction = null;
- switch (n.getText()) {
- case "&&":
- BranchAnd(n, index);
- break;
- case "||":
- BranchOr(n, index);
- break;
- default:
- instruction = BranchTest(n, index);
- }
- return instruction;
- }
- protected String Complement(String op) {
- return Complements.get(op);
- }
- /**
- * Cria uma linha de Salto para PuShLabel eSpecificado no parametro.
- *
- * @param label
- * @throws Exception
- */
- protected void _goto(String label) throws Exception {
- Instruction r = new Instruction();
- r.S("label", label)
- .S("type", "jump")
- .S("format", "jump")
- .set("locker", getIdMaster());
- code.Add(r);
- }
- /*Inicio das avaliacoes booleanas*/
- /**
- * Gera um linha de inStrução de retorno no block de codigo
- *
- * @param n
- * @throws Exception
- */
- protected void genReturn(Node n) throws Exception {
- Instruction nreg;
- ArrayList<Node> returns = n.find("exprs").childrens();
- for (Node ret : returns) {
- // System.out.println("Return p:" + ret);
- nreg = new Instruction()
- .S("type", "push_return")
- .S("format", "push_return")
- .S("p1value", "" + Api.IsValue(ret.getText()))
- .S("p1", ret.G("_return"));
- nreg.set("locker", getIdMaster());
- code.Add(nreg);
- }
- code.Add(new Instruction()
- .S("type", "return")
- .S("format", "return")
- .set("p1", returns.size())
- .S("p1value", "true")
- .set("locker", getIdMaster()));
- }
- /**
- * Gera todoS oS SaltoS de um loop for
- *
- * @param n
- * @throws Exception
- */
- protected void genFor(Node n) throws Exception {
- String attrs = "next,end,inc,test";
- Node test = n.find("test").first();
- setMaster(n);
- String next = gerarLabel(),
- // next = gerarLabel(),
- end = gerarLabel(),
- inc = gerarLabel(),
- testLabel = gerarLabel();
- n.S("next", next)
- .S("end", end)
- .S("inc", inc)
- .S("test", testLabel);
- Node stmt = n.find("stmts");
- stmt.copy(attrs, n);
- test.copy(attrs, n).S("test.type", "jtb");
- /*Inicializacoes e atribuicoes*/
- visit(n.find("initialization"));
- /*Salta para o teste do laco*/
- _goto(testLabel);
- /*Marca o inicio do bloco do laco*/
- PushLabel(next, "branch");
- /*Executa o bloco do for*/
- visit(stmt);
- /*Label que marca os incrementos dos laco*/
- PushLabel(inc, "branch");
- /*Executa os incrementos*/
- visit(n.find("increment"));
- /*Label que marca o teste do laco*/
- PushLabel(testLabel, "branch");
- // test.type = ((JumpToBlock in LOOP) | (JumpBlock in IF || SWITCH))
- // test.type = JumpToBlock
- // test.S("test.type", "for").S("next", next).S("end", end).S("or", next);
- // System.out.println("Teste:" + test);
- Branch(test, 0);
- // if (n.Has("set.end_label")) {
- // PushLabel(n.G("end"), "branch");
- PushLabel(end, "branch");
- // }
- setNullMaster();
- }
- // protected void genFor(Node n) throws Exception {
- // setMaster(n);
- // String start = gerarLabel(), next = gerarLabel();
- //
- // n.S("next", next);
- // n.S("start", start);
- //
- // Node stmt = n.find("stmts");
- // stmt.S("next", start);
- // /*Inicializacoes e atribuicoes*/
- // visit(n.find("initialization"));
- // // Label que marca o inicio do for
- // PushLabel(start, "branch");
- //
- // Node test = n.find("test").first();
- //// if (test.hasChildrens())
- //// test.S("true", gerarLabel());
- //// test.S("false", n.G("next"));
- //// test.S("true", next);
- //// test.S("false", n.G("next"));
- // test.S("and", next);
- // test.S("next", next);
- // test.S("or", gerarLabel());
- //
- // Branch(test);
- //
- // if (test.Has("or")) {
- // PushLabel(test.G("or"), "branch");
- // }
- //
- //// PushLabel(test.G("true"), "branch");
- // /*Executa o bloco do for*/
- // visit(stmt);
- // /*Executa os incrementos*/
- // visit(n.find("increment"));
- // /*Salta para inicio do laço*/
- // _goto(start);
- // /*Marca o endereço final para sair do laço*/
- // PushLabel(test.G("next"), "branch");
- //
- // setNullMaster();
- // }
- protected void genExpArith(Node n) throws Exception {
- Node op1 = n.childrens.get(0);
- Node op2 = n.childrens.get(1);
- String _op = n.getText();
- //
- //
- // // se os dois valores são
- // if (op1.eq("type", "value") && op2.eq("type", "value")) {
- //
- // n.S("_return", resolveExpr(_op, op1.G("value"), op2.G("value")));
- // }
- // if (op1.isNumber("value") && op2.isNumber("value")) {
- //
- // } else {
- // Inverte a ordem dos operandos se o segundo for seletor e o primeiro for valor
- if (op1.isNumber("value") && !op2.isNumber("value")) {
- Node aux = op1;
- op1 = op2;
- op2 = aux;
- }
- // System.out.println("GerarArit" + op1 + "-" + op2);
- String _p1 = op1.G("_return");
- String _p2 = op2.G("_return");
- String _return = gerarVariavel("T");
- n.S("_return", _return);
- Instruction instruction = __exp(_op, _p1, _p2, _return);
- if (instruction.eq("type", "copy")) {
- n.S("_p1", instruction.G("p1"));
- n.S("value", instruction.G("p1"));
- } else {
- n.S("_op", _op);
- n.S("_p1", _p1);
- n.S("_p2", _p2);
- }
- }
- /**
- * Para cima verificado <==>
- */
- protected void genArray(Node n) {
- if (n.eq("raiz", "t")) {
- currentMatrixvalues = new ArrayList<String>();
- matrixValues.put(n.G("id"), currentMatrixvalues);
- for (Node c : n.childrens()) {
- genArray(c);
- }
- } else if (n.eq("terminal", "t")) {
- currentMatrixvalues.add(n.getText());
- } else {
- for (Node c : n.childrens()) {
- genArray(c);
- }
- }
- }
- protected ArrayList<String> initValues(Node n) {
- ArrayList<String> values = new ArrayList<>();
- switch (n.G("class")) {
- case "_array":
- values = matrixValues.get(n.G("id"));
- break;
- /*valores e constantes*/
- default:
- String _return = n.G("_return");
- if (_return.matches("^_.*")) {
- _return = "0";
- }
- values.add(_return);
- }
- return values;
- }
- /**
- * Gera a chamada para o metodo de deSalocacao de memoria
- *
- * @param n
- * @throws Exception
- */
- protected void genDelete(Node n) throws Exception {
- for (Node address : n.childrens()) {
- visit(address);
- __genParam(address.G("_return"));
- __gerarCall(Functions.FREE, "1", getIdMaster());
- }
- }
- /**
- * Gera a Switch caSe
- *
- * @param n
- */
- protected void switchStmt(Node n) throws Exception {
- /*Label que sera consultado pelo break para sair do case*/
- String start,
- next,
- end = gerarLabel(),
- dst = null;
- n.S("next", end);
- Node test = n.find("test");
- // Verifica se existe entrada para selecao
- if (test.childrens().size() > 0) {
- test = test.first();
- visit(test);
- dst = test.G("_return");
- }
- // test;
- ArrayList<Node> cases = n.findAll("def.case", "class", 1);
- for (Node _case : cases) {
- start = gerarLabel();
- next = gerarLabel();
- _case.S("start", start)
- .S("_input", dst)
- .S("next", next)
- .S("end", end)
- .S("test.type", "jb");
- genCase(_case);
- }
- /*Marca o endereço final para sair do switch*/
- PushLabel(end, "branch");
- }
- /**
- * Gera oS caSeS de um Switch
- *
- * @param n
- */
- protected void genCase(Node n) throws Exception {
- ArrayList<Node> exprs;
- Node test;
- // System.out.println("GEN_CASE:" + n);
- // String start = n.Has("start") ? n.G("start") : gerarLabel();
- // String next = gerarLabel(), end;
- //
- //// System.out.println("GenCase:" + start + ":" + next);
- ArrayList<Node> itens = n.childrens();
- Node stmts = n.find("stmts");
- // Node or;
- //
- if (itens.size() >= 2) { // Tem teste
- test = n.first();
- String input = n.G("_input"),
- start = n.G("start"),
- end = n.G("end"),
- next = n.G("next");
- //
- if (input != null) {
- exprs = ExprsEq(test, new Node(input).S("_return", input));
- } else {
- exprs = test.childrens();
- }
- // /*Seleciona o endereco de saida se é no proximo case ou no fim do switch*/
- // if (stmts.last().eq("value", "fallthrough")) {
- // end = gerarLabel();
- // n.S("next", end);
- // } else {
- // end = n.G("end");
- // }
- //
- // // Atualiza o PushLabel de sucesso das exprs
- for (Node expr : exprs) {
- expr.copy("start,next,end,test.type", n);
- }
- //
- Branch(OR(exprs).S("next", next), 0);
- /*Se nenhum dos casos for compativel salta para o proximo*/
- /*Marca o PushLabel inicial do caso*/
- PushLabel(start, "branch");
- /*Visita o bloco do case*/
- visit(stmts);
- /*Salta para o proximo case ou para o fim do switchcase*/
- _goto(end);
- /*Label do inicio do proximo case*/
- PushLabel(next, "branch");
- } else { // Default statiment
- visit(stmts);
- }
- // String start = n.Has("start") ? n.G("start") : gerarLabel();
- // String next = gerarLabel(), end;
- //
- //// System.out.println("GenCase:" + start + ":" + next);
- // ArrayList<Node> itens = n.childrens();
- // Node stmts = n.find("stmts");
- // Node or;
- //
- // if (itens.size() >= 2) { // Tem teste
- // String input = n.G("_input");
- // Node test = n.first();
- // ArrayList<Node> exprs;
- //
- // if (input != null) {
- // exprs = ExprsEq(test, new Node(input).S("_return", input));
- // } else {
- // exprs = test.childrens();
- // }
- //
- // /*Seleciona o endereco de saida se é no proximo case ou no fim do switch*/
- // if (stmts.last().eq("value", "fallthrough")) {
- // end = gerarLabel();
- // n.S("next", end);
- // } else {
- // end = n.G("end");
- // }
- //
- // // Atualiza o PushLabel de sucesso das exprs
- // for (Node expr : exprs) {
- // expr.S("true", !last ? next : end);
- //// expr.S("false", next);
- //// expr.S("false", start);
- // }
- //
- // Branch(OR(exprs).S("next", next), 0);
- //
- // /*Se nenhum dos casos for compativel salta para o proximo*/
- //// _goto(!last ? next : end);
- // /*Marca o PushLabel inicial do caso*/
- // PushLabel(start, "branch");
- // /*Visita o bloco do case*/
- // visit(stmts);
- //
- // if (!last) {
- // /*Salta para o proximo case ou para o fim do switchcase*/
- // _goto(end);
- // /*Label do inicio do proximo case*/
- // PushLabel(next, "branch");
- // }
- // } else { // Default statiment
- // visit(stmts);
- // }
- }
- protected Node NodeBoolExpr(String op, Node e1, Node e2) {
- return new Node(op)
- .S("type", "bool")
- .S("class", "expr")
- .S("subclass", "bool")
- .addFilho(e1)
- .addFilho(e2);
- }
- protected ArrayList<Node> ExprsEq(Node n, Node input) throws Exception {
- ArrayList<Node> list = new ArrayList<>();
- switch (n.Class()) {
- case "exprs":
- for (Node e : n.childrens()) {
- list.add(NodeBoolExpr("==", input, e));
- }
- break;
- default:
- list.add(NodeBoolExpr("==", input, n));
- }
- return list;
- }
- protected Node OR(ArrayList<Node> n) throws Exception {
- switch (n.size()) {
- case 0:
- return null;
- case 1:
- return n.get(0);
- default:
- Node x = n.get(0);
- n.remove(x);
- return NodeBoolExpr("||", x, OR(n)).copy("start,next,end,test.type", x);
- }
- }
- protected int qtdByIndex(Node n) throws Exception {
- Node indexes = n.find("indexes");
- if (indexes == null) {
- return 1;
- } else {
- int sum = 0;
- for (Node index : indexes.childrens()) {
- sum += index.getInt("_return");
- }
- return sum;
- }
- }
- /**
- * Gera inStrução de atribuicao
- *
- * @param n
- * @throws Exception
- */
- protected void genAssign(Node n) throws Exception {
- ArrayList<String> localAttribs = new ArrayList<>(),
- // copymode = new ArrayList<>(),
- // operators = new ArrayList<>(),
- returns;
- ArrayList<Boolean> copyaddress = new ArrayList<>();
- String p1,
- modify = n.G("modify"),
- declare = "" + n.getText().equals("dec.var.short");
- // System.out.println("genAssign:" + n.childrens().get(0).childrens().get(0));
- Node dsts = n.childrens().get(0);
- if (n.in("value", new String[]{"dec.var.short", "def.assign"})) {
- for (Node attrib : n.childrens().get(1).childrens()) {
- visit(attrib);
- // System.out.println("n:" + n);
- // System.out.println("genAssign:" + attrib.G("class") + ":" + attrib.G("value"));
- if (attrib.eq("class", "call")) {
- returns = attrib.getList("returns");
- if (returns != null) {
- for (String _return : returns) {
- localAttribs.add(_return);
- copyaddress.add(attrib.eq("subclass", "address"));
- }
- }
- } else if (attrib.eq("class", "index")) {
- // System.out.println("Attr <- :" + attrib);
- } else if (attrib.eq("class", "literal")) {
- // System.out.println("literal<- :" + attrib);
- switch (attrib.G("subclass")) {
- case "array":
- for (Node element : attrib.find("exprs").childrens()) {
- visit(element);
- copyaddress.add(element.eq("subclass", "address"));
- localAttribs.add(element.G("_return"));
- }
- break;
- }
- } else {
- // System.out.println("Assign:" + attrib);
- copyaddress.add(attrib.eq("subclass", "address"));
- localAttribs.add(attrib.G("_return"));
- }
- }
- }
- // System.out.println("Copy::" + localAttribs);
- // System.out.println("Lista de atribuicoes locais:\n" + dsts + "\n>>\n" + n);
- // System.out.println("Lista de atribuicoes locais:\n" + dsts + "\n>>\n" + localAttribs);
- // Executa a copia dos valores
- for (int dstPosition = 0, i = 0; i < localAttribs.size(); dstPosition++) {
- Node d = dsts.childrens().get(dstPosition);
- d.S("declare", declare);
- visit(d);
- // System.out.println("D:" + d.childrens());
- if (d.eq("class", "unary") && d.eq("dst.pointer", "*")) {
- p1 = localAttribs.get(i);
- code.Add(new Instruction()
- .S("format", "pointer_assignment")
- .S("type", "pointer_assignment")
- .S("dst", d.childrens().get(1).G("_return"))
- .S("p1", p1)
- .S("p1value", "" + Api.IsValue(p1))
- .S("dst.pointer", "*")
- .set("locker", getIdMaster()));
- i++;
- // Salva o valor em memoria
- } else if (d.eq("array", "true")) {
- for (int j = 0; j < d.getInt("array_size"); j++, i++) {
- // System.out.println("ARRAY:" + d.G("_return") + "[" + j + "]" + " -- " + localAttribs.get(i));
- Copy(d.G("_return") + "[" + j + "]", localAttribs.get(i), copyaddress.get(i));
- }
- } else {
- // Copia valor para endereco
- // System.out.println("Attrib:" + d.G("_return") + "<" + localAttribs.get(i));
- if (!modify.equals("")) {
- __exp(modify, d.G("_return"), localAttribs.get(i), d.G("_return")).S("comment", "");
- } else {
- Copy(d.G("_return"), localAttribs.get(i), copyaddress.get(i));
- }
- i++;
- }
- }
- }
- protected void __genParam(String param) throws Exception {
- Instruction r = new Instruction();
- r.S("format", "push_param")
- .S("type", "push_param")
- .S("p1", param)
- .S("p1value", "" + Api.IsValue(param))
- .set("locker", getIdMaster());
- code.Add(r);
- }
- protected void genFunction(String id, Node func) throws Exception {
- if (!funcGenMap.containsKey(id)) {
- funcGenMap.put(id, "true");
- Node block = func.find("stmts");
- code.OpenBlock(id);
- /*Cria a PushLabel inicial da funcao*/
- PushLabel(id, "block");
- /*Declara as variaveis de parametro*/
- genPopParams(func);
- /*Declara as variaveis de retorno caso sejam nomeadas*/
- // visit(func.find("def::return"));
- // System.out.println(Variaveis.printScope(func.G("scope")));
- /*Processa o bloco de instrucoes*/
- visit(block);
- /*Cria a PushLabel final da funcao*/
- PushLabel(id + "-end", "block");
- code.CloseBlock();
- }
- }
- protected void genCall(Node n) throws Exception {
- int argsNum = 0;
- // Se for metodo carrega o contexto no primeiro parametro
- // System.out.println("GenCall:" + n);
- if (!n.eq("ctx", "")) {
- Node var = Variaveis.Get(n.G("ctx"));
- // System.out.println("");
- // __genParam("&" + gerarVariavel(var));
- // code.Add(new Instruction()
- // .S("", PushLabel));
- // gerarVariavel(var)
- __genParam(gerarVariavel(var));
- argsNum++;
- }
- // Gera os argumentos
- Node args = n.find("arguments").find("exprs");
- if (args != null) {
- for (Node param : args.childrens()) {
- // Processa o argumento para obter o _return
- visit(param);
- // Cria a instrução de parametro
- __genParam(param.G("_return"));
- }
- argsNum += args.getChildrenCount();
- }
- // System.out.println("GenCall:" + n.getText());
- Node def = Functions.Get(n.getText());
- genFunction(n.getText(), def);
- // Cria a instrução de chamada
- Instruction r = __gerarCall(n.getText(), "" + argsNum, getIdMaster(), def.find("dec.return"));
- // System.out.println("CALL -> " + r.getList("returns"));
- n.addList("returns", r.getList("returns"));
- }
- protected String UnaryResolve(String op, String value) throws Exception {
- switch (op) {
- case "-":
- return "-" + value;
- case "!":
- return "" + (value.equalsIgnoreCase("false") || value.equals("0") ? "1" : "0");
- }
- throw new Exception(String.format("Invalid [%s]%s ", op, value));
- }
- /*Fim dos laços*/
- /*Inicio das operacoes aritimeticas*/
- /**
- * Unary pode Ser uma expreSSão do tipo <br>
- * (&|*)addreSS - operacao de ponteiroS <br>
- * (-) addreSS|value - negação aritimetica <br>
- * (!) addreSS|value - negação booleana
- *
- * @param n
- * @throws Exception
- */
- protected void unaryStmt(Node n) throws Exception {
- String op = n.childrens().get(0).getText().trim();
- Node value = n.childrens().get(1);
- visit(value);
- String _ret,
- _val = value.G("_return");
- // Se for escrita verifica se é escrita no ponteir ou no lugar referenciado
- if (Api.IsValue(_val)) {
- _ret = UnaryResolve(op, _val);
- // } else {
- } else if (n.eq("access", "write")) {
- _ret = "ERR";
- n.S("dst.pointer", op);
- } else {
- // System.out.println("N:[" + n.G("id") + "]");
- _ret = gerarVariavel("T");
- // System.out.println("Unary:" + n.childrens().G(1));
- String type;
- if (AddressOperator.matcher(op).matches()) {
- type = "pointer_assignment";
- } else {
- type = "unary";
- }
- Instruction r = new Instruction()
- .S("type", type)
- .S("format", type)
- .S("dst", _ret)
- .S("p1", _val)
- .S("op", op)
- .S("copymode", "unary")
- .S("p1value", "" + Api.IsValue(_val))
- .set("locker", getIdMaster());
- code.Add(r);
- // System.out.println("N:" + n);
- // throw new Exception("Unary Stmt not defined");
- }
- n.S("_return", _ret);
- // System.out.println("UnaryStmt:[" + _val + ":" + op + "]" + n);
- }
- protected Integer _ExprResolve(String op, String p1, String p2) throws Exception {
- int p1v = Integer.parseInt(p1),
- p2v = Integer.parseInt(p2);
- switch (op.substring(0, 1)) {
- case "+":
- return p1v + p2v;
- case "-":
- return p1v - p2v;
- case "*":
- return p1v * p2v;
- case "/":
- return p1v / p2v;
- case "%":
- return p1v % p2v;
- }
- return null;
- }
- protected Instruction __exp(String op, String p1, String p2, String ret) throws Exception {
- boolean p1value = Api.IsValue(p1),
- p2value = Api.IsValue(p2);
- String unsigned = "false";
- if (op.contains("u")) {
- op = op.replace("u", "");
- unsigned = "true";
- }
- Instruction r = new Instruction();
- if (p1value && p2value) {
- r.S("type", "copy")
- .S("format", "copy")
- .S("p1value", "true")
- .S("p1", "" + _ExprResolve(op, p1, p2));
- } else {
- r.S("type", "assign")
- .S("format", "assign")
- .S("cat", "exp")
- .S("p1", p1)
- .S("p2", p2)
- .S("copymode", "assign")
- .S("p1value", "" + p1value)
- .S("p2value", "" + p2value);
- // System.out.println("__EXP:"+p1value+":"+p2value);
- }
- r.S("dst", ret)
- .S("op", op)
- .S("op.unsigned", unsigned)
- .set("locker", getIdMaster());
- return code.Add(r);
- }
- /**
- * Gera Salto para inStruçõeS de continue e break;
- *
- * @param n
- * @throws Exception
- */
- protected void ctrlStmt(Node n) throws Exception {
- String go;
- Node ctn = n.closest("for.stmt,switch.stmt", "class");
- switch (n.getText()) {
- case "continue":
- go = ctn.G(ctn.eq("class", "for.stmt") ? "inc" : "end");
- break;
- case "break":
- go = ctn.G("end");
- break;
- case "goto":
- go = n.G("label");
- break;
- default:
- throw new Exception("Undefined ctrl stmt '" + n.getText() + "'.");
- }
- _goto(go);
- }
- /**
- * Executa a extração do codigo baSeado na aSt, e retorna um objeto
- * CodigoTreSEnderecoS contendo oS blockS em Formato de treS endereçoS.
- *
- * @return
- * @throws Exception
- */
- public Code getCodigoDeTresEnderecos() throws Exception {
- return run();
- }
- /**
- * Ativa ou deSativa a otimizacao
- *
- * @param lc
- */
- public void setOtimizacao(boolean lc) {
- code.setOtimizacao(lc);
- }
- protected void setMaster(Node n) {
- master.push(n);
- }
- protected Node getMaster() {
- return master.peek();
- }
- protected void setNullMaster() {
- master.pop();
- }
- protected int getIdMaster() throws Exception {
- if (master.empty()) {
- return 0;
- }
- return master.peek().getInt("id");
- }
- /**
- * Adiciona aS declaraçõeS bem como carregaoS parametroS e referenciaS
- *
- * @param n
- * @throws Exception
- */
- protected void genPopParams(Node func) throws Exception {
- int reg = 0;
- String destino, atribuido;
- /**
- * Se for method declara e atribui o endereco a variavel
- */
- Node receive = func.find("receive.type");
- if (receive != null) {
- // atribuido = "_A" + (reg++);
- // destino = clearPointer(atribuido, gerarVariavel(receive.childrens().G(0)));
- destino = gerarVariavel(receive.childrens().get(0));
- // copy_pointer?
- Copy(Api.clearID(destino), __popParam().G("_return"), false);
- }
- for (Node argument : func.find("arguments").childrens()) {
- for (Node arg : argument.find("ids").childrens()) {
- /**
- * Gera uma instrução de copia do registrador a{i},i = [0-4],
- * para o endereço de memoria dos parametros
- */
- // atribuido = "_Ra" + (reg++);
- // atribuido = "_A" + (reg++);
- // System.out.println("PopArg:" + arg);
- // destino = clearPointer(atribuido, gerarVariavel(arg));
- // copy_pointer?
- Copy(Api.clearID(gerarVariavel(arg)), __popParam().G("_return"), false);
- }
- }
- }
- protected Instruction __popParam() throws Exception {
- String varname = gerarVariavel("T");
- Instruction r = new Instruction()
- .S("type", "pop_param")
- .S("format", "pop_param")
- .S("p1", varname)
- .S("p1value", "false")
- .S("_return", varname);
- r.set("locker", getIdMaster());
- code.Add(r);
- return r;
- }
- // protected void inicializarVariaveis() throws Exception {
- //// System.out.println("INICIALIZAR VARIAVEIS:");
- //
- // for (Node container : ast.getRoot().childrens()) {
- // for (Node constant : container.findAll("dec::const,dec::var", "class", 1)) {
- // visit(constant);
- // }
- // }
- // }
- protected Instruction Copy(String dst, String src, boolean address) throws Exception {
- // System.out.println("TAC:Copy:" + dst + "=" + src);
- String type, format, arrayPattern = ".*\\[.*\\]";
- Instruction r = new Instruction();
- if (dst.matches(arrayPattern) || src.matches(arrayPattern)) {
- type = "indexed_assign";
- format = "copy";
- if (Variaveis.isArray(src)) {
- r.S("src_indexed", "true");
- r.S("p1.indice", Api.getIndice(src));
- }
- if (Variaveis.isArray(dst)) {
- r.S("dst_indexed", "true");
- r.S("dst.indice", Api.getIndice(dst));
- } else {
- r.S("dst_indexed", "false");
- }
- if (Variaveis.isArray(src)) {
- r.S("indice", Api.getIndice(src));
- }
- } else {
- type = format = "copy";
- }
- // Identifica que o valor copiado é um endereco ou valor
- if (address) {
- r.S("src.address", "true");
- }
- r.S("format", format)
- .S("type", type)
- .S("dst", dst)
- .S("p1", src)
- .S("p1value", Api.IsValue(src) + "")
- .set("locker", getIdMaster());
- code.Add(r);
- return r;
- }
- /**
- * Gera um PuShLabel unico
- *
- * @param n
- * @return
- */
- protected String gerarLabel(Node n) {
- // return code.genLabel();
- return code.getCurrentBlockName() + "+_i" + (incLabel++);
- }
- protected String gerarLabel() {
- // return code.genLabel();
- return code.getCurrentBlockName() + "+_i" + (incLabel++);
- }
- /**
- * Cria uma linha de PuShLabel no block de codigo corrente
- *
- * @param label String
- * @throws Exception
- */
- protected Instruction PushLabel(String label, String type) throws Exception {
- Instruction r = new Instruction()
- .S("label", label)
- .S("type", "label")
- .S("label_type", type)
- .S("format", "label")
- .set("locker", getIdMaster());
- return code.Add(r);
- }
- /**
- * Gera um nome de variavel unico,
- *
- * @param pre prefixo da variavel
- * @param n
- * @return
- */
- protected String gerarVariavel(String pre) {
- return "_" + pre + (tmpVarCount++);
- }
- protected String gerarVariavel(Node n) throws Exception {
- String id = n.getText();
- if (!varGenMap.containsKey(id)) {
- varGenMap.put(id, gerarVariavelSet(id, n));
- }
- return varGenMap.get(id);
- }
- protected String gerarVariavelSet(String id, Node n) throws Exception {
- Node var = Variaveis.Get(id);
- String varname, alias, vn;
- if (var != null) {
- if (var.eq("constant", "true")) {
- varname = id;
- } else {
- varname = var.getText();
- }
- // System.out.println("Variavel definida:" + varname);
- } else {
- varname = n.getText();
- var = n;
- // System.out.println("Variavel do no consultado:" + varname);
- // Variaveis.Add(id, n);
- }
- // System.out.printf("GerarVariavelSet{%s\n,%s\n,%s\n}\n", id, varname, var);
- // if (var.eq("constant", "true")) {
- // System.out.printf("GerarVariavelSet{%s\n,%s\n,%s\n}\n", id, varname, var);
- // }
- if (varGenMap.containsKey(varname)) {
- alias = varGenMap.get(varname);
- // System.out.printf("GerarVariavelSet[MAPPED]{%s,%s}\n", varname, alias);
- } else {
- String prefix;
- // System.out.println("GerarVariavelSet\n" + varname + "\n" + id + "\n" + var);
- if (var.eq("class", "dec.const")) {
- prefix = "C";
- } else if (var.eq("global", "true")) {
- prefix = "G";
- } else if (var.eq("var.tmp", "true")) {
- prefix = "T";
- } else {
- prefix = "V";
- }
- // System.out.println("gerarVariavelSet:" + id + var);
- // System.out.println("DecVar:" + var);
- // alias = var.G("pointer") + gerarVariavel(prefix);
- alias = gerarVariavel(prefix);
- n.S("alias", alias);
- n.copy("pointer", var);
- varGenMap.put(varname, alias);
- // vn = var.G("scope");
- int size = Tipos.Size(var.G("type")), b = 1;
- // System.out.println("gerarVariavelSetVAR:" + var);
- // Se for um array considera os filhos como index
- if (var.eq("array", "true") && var.childrens().size() > 0) {
- for (Node node : var.childrens()) {
- // System.out.println("gerarVariavelSetArray:"
- // + node.eq("constant", "true")
- // + "\n" + node
- // + "\nVARIABLE:\n" + var
- // );
- b *= (node.eq("constant", "true")
- ? node.getInt("valueConstant")
- : node.getInt("value"));
- }
- }
- size *= b;
- var.set("size", size);
- // System.out.println("gerarVariave[" + prefix + "|" + id + "]:" + var);
- if (!var.eq("constant", "true") || !var.in("type", new String[]{"int", "char", "bool"})) {
- (prefix.equals("G") ? code.GData() : code.Block().Data()).Add(alias, var);
- } else {
- // System.out.println("var:" + var);
- alias = var.G("valueConstant");
- }
- }
- return alias;
- }
- /**
- * Imprime o codigo de treS endereçoS
- *
- * @return
- */
- @Override
- public String toString() {
- return printVarMap() + code.toString();
- }
- public String printVarMap() {
- StringBuilder s = new StringBuilder();
- for (Map.Entry<String, String> e : varGenMap.entrySet()) {
- s.append(e.getKey() + " : " + e.getValue() + "\n");
- }
- System.out.println("Var Map:\n" + s.toString());
- return varGenMap.toString();
- }
- /**
- * Executa a extração da aSt para codigo de treS endereçoS
- *
- * @throws Exception
- */
- public void extrair() throws Exception {
- if (!inicializado) {
- inicializado = true;
- }
- // inicializarVariaveis();
- // extrairTraps();
- // extrairThreads();
- // extractFunctions();
- // extracMethods();
- main();
- }
- protected Instruction __gerarCall(String funcname, String numparam, int idMaster, Node returns) throws Exception {
- Instruction call = __gerarCall(funcname, numparam, idMaster);
- // Atribuição dos enderecos de retorn
- if (returns != null) {
- ArrayList<String> rts = new ArrayList<>();
- String t;
- for (Node r : returns.childrens()) {
- t = gerarVariavel("T");
- rts.add(t);
- code.Add(new Instruction()
- .S("type", "pop_return")
- .S("format", "pop_return")
- .S("p1value", "false")
- .S("p1", t));
- }
- call.addList("returns", rts);
- }
- return call;
- }
- /**
- * Gera inStrução de call
- *
- * @param funcname
- * @param numparam
- * @param idMaster
- * @param variavelRetorno
- * @throws Exception
- */
- protected Instruction __gerarCall(String funcname, String numparam, int idMaster) throws Exception {
- Instruction r = new Instruction();
- r.S("format", "call")
- .S("type", "call")
- .S("funcname", funcname)
- .S("nump", numparam).set("locker", idMaster);
- // if (!variavelRetorno.equals("")) {
- // r.S("dst", variavelRetorno);
- // }
- code.Add(r);
- return r;
- }
- }
- // case "||":
- // and = false;
- // // Não deve inverter operacao no caso de ||
- // branckInvert.push(and);
- //
- // _or(n);
- //
- // Branch(x.get(0));
- // Branch(x.get(1));
- //
- // // Inverte a ultima operacao
- // if (n.parent.eq("value", "||")) {
- // }
- //
- //// if (!loop && branckInvert.size() == 1) {
- //// Instruction last = code.Last();
- //// last.S("op", Complement(last.G("op"))).S("label", n.G("next"));
- //// }
- // if (!x.get(0).Has("and")) {
- // n.remove("and");
- // }
- // branckInvert.pop();
- //
- // break;
- // default:
- //// boolean empty = branckInvert.isEmpty();
- ////
- //// if (empty) {
- //// branckInvert.push(true);
- //// }
- //
- // visit(n);
- // // Resultado do test class ou acesso a um id ou bool
- // if (!n.eq("class", "expr")) {
- // op = "==";
- // p0 = n.G("_return");
- // p1 = "1";
- // } else { //(<, <=, >, >=, ==, !=)
- // p0 = visit(x.get(0)).G("_return");
- // p1 = visit(x.get(1)).G("_return");
- // }
- //
- // Instruction instruction = Branch(op, p0, p1, n.G("next"));
- //// instruction. ;
- //// if (n.Has("false")) {
- // // _goto(n.G("false"));
- // // }
- // // if (empty) {
- // // branckInvert.pop();
- // // }
- // @Override
- // public TacGenInterface AfterCreate(CodeProcessing p) {
- // this.afterCreate.add(p);
- // return this;
- // }
- //
- // public TacGenInterface AfterCreate() throws Exception {
- // for (CodeProcessing x : afterCreate) {
- // x.Exec(code);
- // }
- // return this;
- // }
- // protected Instruction Branch(String op, final String p1, final String p2, String label) throws Exception {
- //
- // Instruction r1 = new Instruction();
- // r1.S("format", "branch")
- // .S("type", "branch")
- // .S("op", op)
- // .S("p1", p1)
- // .S("p2", p2)
- // .S("p1value", "" + Api.IsValue(p1))
- // .S("p2value", "" + Api.IsValue(p2))
- // .S("label", label);
- //
- //// System.out.println("Add branch:" + branckInvert.peek() + branckInvert + ">>" + (!branckInvert.isEmpty() && branckInvert.peek()) + "\n" + r1);
- // code.Add(r1);
- // return r1;
- // }
- // /**
- // * ProceSSa um teSte logico AND
- // *
- // * @param n
- // * @throws Exception
- // */
- // protected void _and(Node n) throws Exception {
- // String attrs = "next,start,end,test,skip.test";
- // Node b1 = n.getFilho(0).copy(attrs, n);
- // Node b2 = n.getFilho(1).copy(attrs, n);
- //
- //// boolean isFor = n.eq("test.type", "for");
- //// System.out.println("_AND{" + isFor + "}:" + n.G(isFor ? "and" : "next"));
- //// String l = n.G(n.eq("test.type", "for") ? "and" : "next");
- // b1.S("true", n.G("next"));
- //// b1.S("false", b.G("false"));
- //// System.out.println("_AND:" + label + "-s" + b1);
- // b2.S("true", n.G("next"));
- //// b2.S("false", b.G("false"));
- //// b1.S("true", gerarLabel());
- //// b1.S("false", b.G("false"));
- ////
- //// b2.S("true", b.G("true"));
- //// b2.S("false", b.G("false"));
- // }
- // /**
- // * ProceSSa um teSte logico OR
- // *
- // * @param n
- // * @throws Exception
- // */
- // protected void _or(Node n) throws Exception {
- //
- // String attrs = "next,start,end,test,skip.test";
- // Node b1 = n.getFilho(0).copy(attrs, n);
- // Node b2 = n.getFilho(1).copy(attrs, n);
- //
- // b1.S("true", n.G("start"));
- // b2.S("true", n.G("start"));
- //
- // }//
- // protected String updateLabel(Node n) {
- // String PushLabel = n.G("_return");
- //// if (!PushLabel.substring(0, 1).equals("_R")) {
- //// }
- //// n.S("_return", PushLabel);
- // return PushLabel;
- // }
|