From 4d6407fd32a03851412d3b40e1300cf90a712f86 Mon Sep 17 00:00:00 2001 From: florianhartung Date: Sat, 28 Nov 2020 11:33:34 +0100 Subject: [PATCH] NumericExpression --- .idea/vcs.xml | 6 ++ .../compiler/standard/StandardCompiler.java | 21 +---- .../compiler/standard/statements/IfStart.java | 1 - .../compiler/standard/statements/Print.java | 18 ++++ .../standard/statements/PrintNumber.java | 19 ---- .../standard/statements/PrintVariable.java | 23 ----- .../statements/VariableAssignment.java | 71 ++------------- .../expressions/NumericExpression.java | 81 ++++++++++++++++++ .../compiler/standard/StandardCompiler.class | Bin 5566 -> 5379 bytes .../standard/statements/PrintNumber.class | Bin 734 -> 0 bytes .../standard/statements/PrintVariable.class | Bin 1156 -> 0 bytes .../statements/VariableAssignment.class | Bin 4198 -> 2774 bytes 12 files changed, 117 insertions(+), 123 deletions(-) create mode 100644 .idea/vcs.xml create mode 100644 src/main/java/jcompiler/compiler/standard/statements/Print.java delete mode 100644 src/main/java/jcompiler/compiler/standard/statements/PrintNumber.java delete mode 100644 src/main/java/jcompiler/compiler/standard/statements/PrintVariable.java create mode 100644 src/main/java/jcompiler/compiler/standard/statements/expressions/NumericExpression.java delete mode 100644 target/classes/jcompiler/compiler/standard/statements/PrintNumber.class delete mode 100644 target/classes/jcompiler/compiler/standard/statements/PrintVariable.class diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/main/java/jcompiler/compiler/standard/StandardCompiler.java b/src/main/java/jcompiler/compiler/standard/StandardCompiler.java index 8a93830..3662927 100644 --- a/src/main/java/jcompiler/compiler/standard/StandardCompiler.java +++ b/src/main/java/jcompiler/compiler/standard/StandardCompiler.java @@ -20,7 +20,7 @@ public class StandardCompiler extends Compiler { public void compile(BufferedReader input, BufferedWriter output) throws MemoryOverflowException, IOException { StringBuilder currentStatement = new StringBuilder(); - int buffer = -1; + int buffer; while ((buffer = input.read()) != -1) { switch ((char) buffer) { case '\n': @@ -36,26 +36,18 @@ public void compile(BufferedReader input, BufferedWriter output) throws MemoryOv } if (currentStatement.length() > 0) { compileStatement(currentStatement.toString()); - currentStatement = new StringBuilder(); } List johnnyInstructions = new ArrayList<>(); - for (int i = 0; i < statements.size(); i++) { - Statement statement = statements.get(i); - + for (Statement statement : statements) { if (statement instanceof IfEnd) { - System.out.println("."); int found = 0; IfState.Operation operation = IfState.endIfStructure(); - System.out.println("operation = " + operation); - System.out.println("johnnyInstructions.size() = " + johnnyInstructions.size()); for (int j = johnnyInstructions.size() - 1; ; j--) { if (johnnyInstructions.get(j) instanceof Jump && ((Jump) johnnyInstructions.get(j)).getJumpToAdr() == -1) { if (found == 1) { if (operation == IfState.Operation.GT || operation == IfState.Operation.LT) { - System.out.println("j = " + j); ((Jump) johnnyInstructions.get(j)).setJumpToAdr(j + 2); - System.out.println("new: " + (j + 2)); } else { ((Jump) johnnyInstructions.get(j)).setJumpToAdr(j + 5); } @@ -91,15 +83,10 @@ public void compile(BufferedReader input, BufferedWriter output) throws MemoryOv private void compileStatement(String statement) { if (statement.toLowerCase().startsWith("print")) { - String valueToPrint = statement.split(" ")[1]; + String valueToPrint = statement.substring(6); - if (valueToPrint.matches("\\d+")) { - statements.add(new PrintNumber(Integer.parseInt(valueToPrint))); - } else { - statements.add(new PrintVariable(valueToPrint)); - } + statements.add(new Print(valueToPrint)); } else if (statement.equalsIgnoreCase("exit")) { - System.out.println(); statements.add(new Exit()); } else if (statement.matches("\\w+ ?=.*")) { String[] splitStatement = statement.split(" ?= ?"); diff --git a/src/main/java/jcompiler/compiler/standard/statements/IfStart.java b/src/main/java/jcompiler/compiler/standard/statements/IfStart.java index b9e8316..a7702f0 100644 --- a/src/main/java/jcompiler/compiler/standard/statements/IfStart.java +++ b/src/main/java/jcompiler/compiler/standard/statements/IfStart.java @@ -23,7 +23,6 @@ public IfStart(String condition) {//y>x means y sub x then non null, one step (b @Override public JohnnyInstruction[] compile() { - System.out.println(1253); String[] splitCondition = condition.split(" ?(<|>|<=|>=|==) ?"); String operation = condition.replaceAll("[\\w\\d ]", ""); diff --git a/src/main/java/jcompiler/compiler/standard/statements/Print.java b/src/main/java/jcompiler/compiler/standard/statements/Print.java new file mode 100644 index 0000000..d2aa946 --- /dev/null +++ b/src/main/java/jcompiler/compiler/standard/statements/Print.java @@ -0,0 +1,18 @@ +package jcompiler.compiler.standard.statements; + +import jcompiler.compiler.JohnnyInstruction; +import jcompiler.compiler.Statement; +import jcompiler.compiler.standard.statements.expressions.NumericExpression; + +public class Print implements Statement { + + private final String expressionToPrint; + + public Print(String expressionToPrint) { + this.expressionToPrint = expressionToPrint; + } + + public JohnnyInstruction[] compile() { + return new NumericExpression(expressionToPrint).compile(); + } +} diff --git a/src/main/java/jcompiler/compiler/standard/statements/PrintNumber.java b/src/main/java/jcompiler/compiler/standard/statements/PrintNumber.java deleted file mode 100644 index 37805c1..0000000 --- a/src/main/java/jcompiler/compiler/standard/statements/PrintNumber.java +++ /dev/null @@ -1,19 +0,0 @@ -package jcompiler.compiler.standard.statements; - -import jcompiler.Memory; -import jcompiler.compiler.Statement; -import jcompiler.compiler.JohnnyInstruction; -import jcompiler.compiler.standard.johnnyinstructions.Take; - -public class PrintNumber implements Statement { - - private final int numberToPrint; - - public PrintNumber(int numberToPrint) { - this.numberToPrint = numberToPrint; - } - - public JohnnyInstruction[] compile() { - return new JohnnyInstruction[]{new Take(Memory.addVariable(numberToPrint))}; - } -} diff --git a/src/main/java/jcompiler/compiler/standard/statements/PrintVariable.java b/src/main/java/jcompiler/compiler/standard/statements/PrintVariable.java deleted file mode 100644 index 2dbe5b6..0000000 --- a/src/main/java/jcompiler/compiler/standard/statements/PrintVariable.java +++ /dev/null @@ -1,23 +0,0 @@ -package jcompiler.compiler.standard.statements; - -import jcompiler.Memory; -import jcompiler.compiler.Statement; -import jcompiler.compiler.JohnnyInstruction; -import jcompiler.compiler.standard.johnnyinstructions.Take; - -public class PrintVariable implements Statement { - - private final String variableToPrint; - - public PrintVariable(String variableToPrint) { - this.variableToPrint = variableToPrint; - } - - public JohnnyInstruction[] compile() { - if(!Memory.variableExists(variableToPrint)) { - throw new IllegalStateException("Variable " + variableToPrint + " does not exist!"); - } - - return new JohnnyInstruction[]{new Take(Memory.resolveId(variableToPrint))}; - } -} diff --git a/src/main/java/jcompiler/compiler/standard/statements/VariableAssignment.java b/src/main/java/jcompiler/compiler/standard/statements/VariableAssignment.java index 9a0f800..5c8dbda 100644 --- a/src/main/java/jcompiler/compiler/standard/statements/VariableAssignment.java +++ b/src/main/java/jcompiler/compiler/standard/statements/VariableAssignment.java @@ -3,22 +3,16 @@ import jcompiler.Memory; import jcompiler.compiler.Statement; import jcompiler.compiler.JohnnyInstruction; -import jcompiler.compiler.standard.johnnyinstructions.Add; import jcompiler.compiler.standard.johnnyinstructions.Save; -import jcompiler.compiler.standard.johnnyinstructions.Sub; import jcompiler.compiler.standard.johnnyinstructions.Take; +import jcompiler.compiler.standard.statements.expressions.NumericExpression; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; public class VariableAssignment implements Statement { - public static final String VAR_REGEX = "[a-zA-Z]+"; - public static final String NUM_REGEX = "[0-9]+"; - public static final String VALUE_REGEX = "(" + NUM_REGEX + "|" + VAR_REGEX + ")"; - public static final String OPERATOR_REGEX = "([+|\\-])"; - - private final String id; private final String value; @@ -30,12 +24,11 @@ public VariableAssignment(String id, String value) { public JohnnyInstruction[] compile() { String[] splitValues = value.split("([+\\- ])+"); - System.out.println("splitValues = " + splitValues.length); if (splitValues.length == 1) { - if (splitValues[0].matches(NUM_REGEX)) { + if (splitValues[0].matches("[0-9]+")) { Memory.addVariable(id, Integer.parseInt(splitValues[0])); return new JohnnyInstruction[0]; - } else if (splitValues[0].matches(VAR_REGEX)) { + } else if (splitValues[0].matches("[a-zA-Z]+")) { if (!Memory.variableExists(splitValues[0])) { throw new IllegalStateException("Variable " + splitValues[0] + " does not exist!"); } @@ -48,59 +41,11 @@ public JohnnyInstruction[] compile() { Memory.addVariable(id, 0); } - boolean first = true; - - List instructionList = new ArrayList<>(); - - - String operators = value.replaceAll("[\\w\\d ]", ""); - - List toAdd = new ArrayList<>(); - List toSub = new ArrayList<>(); - for (int i = 0; i < splitValues.length; i++) { - String s = splitValues[i]; - boolean add; - if (first) { - add = true; - first = false; - } else { - add = operators.charAt(i - 1) == '+'; - } - if (add) { - toAdd.add(s); - } else { - toSub.add(s); - } - } - first = true; - for (String s : toAdd) { - if (s.matches(VAR_REGEX)) { - if (!Memory.variableExists(s)) { - throw new IllegalStateException("Variable " + s + " does not exist!"); - } - instructionList.add(first ? new Take(Memory.resolveId(s)) : new Add(Memory.resolveId(s))); - } else if (s.matches(NUM_REGEX)) { - instructionList.add(first ? new Take(Memory.addVariable(Integer.parseInt(s))) : new Add(Memory.addVariable(Integer.parseInt(s)))); - } else { - throw new IllegalArgumentException("Invalid syntax: " + id + " = " + value + " at " + s); - } - if (first) { - first = false; - } - } - for (String s : toSub) { - if (s.matches(VAR_REGEX)) { - if (!Memory.variableExists(s)) { - throw new IllegalStateException("Variable " + s + " does not exist!"); - } + //move value of expression to db + JohnnyInstruction[] expression = new NumericExpression(value).compile(); + List instructionList = new ArrayList<>(Arrays.asList(expression)); - instructionList.add(new Sub(Memory.resolveId(s))); - } else if (s.matches(NUM_REGEX)) { - instructionList.add(new Sub(Memory.addVariable(Integer.parseInt(s)))); - } else { - throw new IllegalArgumentException("Invalid syntax: " + id + " = " + value + " at " + s); - } - } + //save to (new) identifier instructionList.add(new Save(Memory.resolveId(id))); return instructionList.toArray(new JohnnyInstruction[0]); diff --git a/src/main/java/jcompiler/compiler/standard/statements/expressions/NumericExpression.java b/src/main/java/jcompiler/compiler/standard/statements/expressions/NumericExpression.java new file mode 100644 index 0000000..9b8c4fb --- /dev/null +++ b/src/main/java/jcompiler/compiler/standard/statements/expressions/NumericExpression.java @@ -0,0 +1,81 @@ +package jcompiler.compiler.standard.statements.expressions; + +import jcompiler.Memory; +import jcompiler.compiler.JohnnyInstruction; +import jcompiler.compiler.Statement; +import jcompiler.compiler.standard.johnnyinstructions.Add; +import jcompiler.compiler.standard.johnnyinstructions.Sub; +import jcompiler.compiler.standard.johnnyinstructions.Take; + +import java.util.ArrayList; +import java.util.List; + +public class NumericExpression implements Statement { + + public static final String VAR_REGEX = "[a-zA-Z]+"; + public static final String NUM_REGEX = "[0-9]+"; + + private final String expression; + + public NumericExpression(String expression) { + this.expression = expression; + } + + @Override + public JohnnyInstruction[] compile() { + boolean first = true; + + List instructionList = new ArrayList<>(); + + String[] splitValues = expression.split("([+\\- ])+"); + String operators = expression.replaceAll("[\\w\\d ]", ""); + + List toAdd = new ArrayList<>(); + List toSub = new ArrayList<>(); + for (int i = 0; i < splitValues.length; i++) { + String s = splitValues[i]; + boolean add; + if (first) { + add = true; + first = false; + } else { + add = operators.charAt(i - 1) == '+'; + } + if (add) { + toAdd.add(s); + } else { + toSub.add(s); + } + } + first = true; + for (String s : toAdd) { + if (s.matches(VAR_REGEX)) { + if (!Memory.variableExists(s)) { + throw new IllegalStateException("Variable " + s + " does not exist!"); + } + instructionList.add(first ? new Take(Memory.resolveId(s)) : new Add(Memory.resolveId(s))); + } else if (s.matches(NUM_REGEX)) { + instructionList.add(first ? new Take(Memory.addVariable(Integer.parseInt(s))) : new Add(Memory.addVariable(Integer.parseInt(s)))); + } else { + throw new IllegalArgumentException("Invalid numeric expression syntax: " + expression + " at " + s); + } + if (first) { + first = false; + } + } + for (String s : toSub) { + if (s.matches(VAR_REGEX)) { + if (!Memory.variableExists(s)) { + throw new IllegalStateException("Variable " + s + " does not exist!"); + } + + instructionList.add(new Sub(Memory.resolveId(s))); + } else if (s.matches(NUM_REGEX)) { + instructionList.add(new Sub(Memory.addVariable(Integer.parseInt(s)))); + } else { + throw new IllegalArgumentException("Invalid numeric expression syntax: " + expression + " at " + s); + } + } + return instructionList.toArray(new JohnnyInstruction[0]); + } +} diff --git a/target/classes/jcompiler/compiler/standard/StandardCompiler.class b/target/classes/jcompiler/compiler/standard/StandardCompiler.class index 2fcc569318526856de5b6ae50611559ba227ba6d..dfbc994999e38d732a83ea938e942219bc3a735a 100644 GIT binary patch delta 1890 zcmYLK30PEB6#mbfpg{t^>G&PX1^&?SC;lSnRn_hqm#ivrbfS!VT*BW*sP$sgQT$_M zShHr~Um5K`xODsv7oT-;!1e^X2$o9svTSxdDR)mvI4xl=&Ip{7;Q6vf+>*U8hjipb@JCh3OQIBb=q0JL1(Tg6ujuD3Xw7 zl&AxYDq%^`QNSIcD2nFF-1Qzd>&0e#Ozx^vnypjAqjicQI|oV}J34W!PQ59XFd`6R zoEl{+pgzW2b+}=u<5Mo8ID);0joeDFyPSETcuLTzFP0OOP%T(NoY5!bcuQYxu*n|L z;}PV~$O|22j0)pJhGwW@iOaiik-OGd8JcN0!cvWru+r(%_AVuJ zmef|z78VrDWV8m9cFbZ~4;o-L=I|47w~N@Su*DHxs?bcM&c53x%~m0lSv!V#D29g3 zGz?dO{Re5w^F<6W!L5B=fBHEai^;6e&1m1B`i%aR9+Ii0HH z;#yR|1e-DmOW4599xQPM&oNQ=$i09NGz3x)5^)cHUTa8Yu!PU5G+G2exu;4L)4Y z3tts3nVU+DoYlgc`<;Fac4YW5q#1pk5mrBj=A~|ftpk}wX{{L6j^PUCY($IGk>$r_ z&4}NM2tP&yZL*76F|ylatSNIXl5u^RE zwjy_zoD@@FQYOI;ADCgCU$&7b!KKV~2J@W7Oiy8!XEMLV%0 zo0!oZ%;7#JPtMR7?q?(%xDhM3p~Z;j&?{M5z_0e3SZCr0QMj2Uvutnoy!cowWhDi; zR$)!e=})P^hD(Vvi)){X&$W+bqXOz6aveCNP6O!Xtr>Bwi? zct9SD^mm{ANA6E|`vb<|WAQ**!phZG4%#dT6!Ov|iS z8QQ*RS>}QbsHK*zYWt?PXtt+m*`g?B=MIwJ*L>gn_q=odd(OG{oO|!mj9u=~zJGS? z0?>^-8pdIzz&#oitkf_MtE624g_TjPdC-QrSS{fpfm(qzQCN$I zRXn2MQ9P#MaXg{oNjdE)2~VqdMvm(Q)@w+>vr#Aw;WrG#O@X(x5Jur`4L$IVbi7YszlL5opyFLgc~36neSr@&s7?@ExQ{YE|pN!7tr6z%&jm_qOsQ`tB%i?PD3y$kJ zA>mh?)Nuo|qqjFFbMvA-jzfj%rnq%VlDaJRmzFq6vb?jV zm-wr7x`KHqke)kGM?yErNR2QGeANM8$uvKkv6$E6uL-d4PSjrRQ6a%Csm5v%W8=ul z{rV*LBlL{uj)_*L0!lF&MUF+MD=F2;RQso=(NzRTg>SYmbDFQRJTt#C=r5Nkq*I1Y zZW%+dYXlGba2a9sv?KO1c}$R#F0We`m1Q!H>)FOadzM2?_XSI*`ezc?y_}dr90_KFIQC2Jun~8H)^WbnCQY)>-)ra9}*69+54$0TcL( zFcFjZbQaaEh%Qm6*f<%xHzaAd!p;qI0yknZG;E~q@Uf&~D|JN)%J?!^L*r47sSsE| zix6O|Rq2RSRNyA&K^c81gp{UXx(v%wC1!9qRmn#cZiWdqWiYCFt{HRbAZ8*6OOj%O z7qg^8%)XRyvvCeAs4=|G)}gs{kx#BoV64DAf%yUociUY4NAtgwWA!+XVex4er*;;W zMzpyA2OAbNAzdK75v{P0JzF`IMF=tSA>ss!cth$rhJ|fS?l8JKuMQ)t7X97M>@d2S zvqpHF-NVSK4WWI;HrRHeN3o{?*VLoucH}B3T#xu>eXn9qJ$kn&>)g&hVf3v<;#S0l z(XW}4S6q*4TPUmC&i>LfGThDq9BYKfl;!o9vvSSNU$$l3ROMXNshGn(u!yU_gzJ9?S9~qkd;?qd za>WmDwU2V0&vSicclG71k4H9hmqtpE$o+O3OH24QxSe$-_Rxy|OSvz&6fK>^QaS4g zp&C{@pf({#VA(l1l#ZDxu6FE!?+HdOB<|)>&hFBHk=v0<7~$EDG(s(sSm0B-2cx|1 z&J7qH#`SLJ7{>J%k6d1O>qr~az{QQ0!VhBxU*(c#a{TEZFp7#I% diff --git a/target/classes/jcompiler/compiler/standard/statements/PrintNumber.class b/target/classes/jcompiler/compiler/standard/statements/PrintNumber.class deleted file mode 100644 index ba0c703afcaad68abc69b134199a095a3826cf4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 734 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 F@?Xp!^5p;k literal 4198 zcmbVPTW}NC8UD^n@~&iIjKB^8rw9T;wh*S~l3?Qm;hG>~8?eA&Y(v)a#+H#KRa!YX zr3r0m(`$N9OL`+|TBl8$5)y2P8cZpYCpdto?+5uVYjn*Bg_1YPd0GW)rF57J+4L z=~T|tQ)Z8z%o_xB9qTLtDtjUw$J*_ch93%49Xj0J9XWcaU{b?H0VOdc;2O8l6?+n? zg!zcT=HOCiOC|L^0?xMd5dALiNTiIe{Mew8J*p2TDe-lr<9f13&nD!$Aat4|iJU-7 z$7nn~mPsUyY-4F6(-_jTLyer6#+Z>ZbB#rKB$rDJr=*NIs|AQaeXzc-oT-E9kyL6T zN@lY8xS2?&h;ryd%v7A@!w5uzPn4NInaJi$#-Es1?np>UwViL?Oe7nngeKhSjFHvN zbe0BOW;!Ab@;8m((MSY2#ApV#iW# zS7nYvToK(0vOx>uuiKWY{1f*Q;< z9@WnnUc8CdCH}2@$H(+>p6G@pu}8AQd3li*gkK#^u>mB80=bElsh@3T77o(PGPcmx z6^LZB`hE?Z4NHyPBu8sPQx;t%*EyV_khixMNT5+e&zIW#zG#MvV1%A{hIhUAwWFld+K zxl%#Z3uvtVbN%4~POIkGwTbo33!Bhr+iI_YWLmy*{sL(SRBgK{$F4O$$m$)cgP6F$K(f_xtu|ry~D}hzPrHV9Q zm)V^GvCU^>cu8KbnsNb=6m?8D<0A(9ZCMSr`W5rUL{p|QESrgz(X%;&%a4FXC3mH_ zQl~MN&Q7qu^Yu}@bKb&FIt8n^-m_r6 zoa@#F>qoeLbisNreDbYAtWUmJEE|Ho@>8_f&Q&jMI{3T1VH!$9=qelyTdu(uIFpVPIyi{OZ8xs>puz(9xP6`}REB1!;GM#9s&>r%@N{b;wpwd(zN)d+sdS+i)W^>v~BUwXuxAD`zz0JML_q!2`@~V;4nE-zMLK zQ`p>0PnNLRRh(2fcBwULX!d1vglg2LX07fbDxJIBj@C)6_B(4-=g<^_)uBsJos)1n zcDZZZ7g6nZ`L*k)S8#k1%ls9^#RXMN&b{eu^}DX4L7-XntJe_{xQO@VY>U9V2sdkf ztw7x|zjh6bd*fo}{F=;n0dZl*<&(Tggrsc}%V)5)xNIy2lc8<<(3&KqrU>D|ZL?4` zVxw$H3HZ=mknZ~=qq0J?j&s8edT^1cxwZa^#R*?2oAAE7Pk07R#q72hvpZSJt}a~M zxAQ2ee5^bs=MK`|!XmUihGnT=#}0+(w)2j%++~;IN0cQmp%e1*{sTKX26*+>VPy@`H$=GXv9CU4gbb=d_e6F*@bTNlT<~EsKy?# z2CX81N5w|$6`K(eThJyVXczmjU&L@g3{WSI$Ay6oaRHs;d31>va7aw!i1-(}#eWb} z{5Ym`;<$1ICzKdYDm~~^^5|Ed#eni0PARWKS7tG&yob2*J`6_cH(3bK_rj6-}>#_>0MmtHQ}Gkl zTWQ5nT5$?h*@0t}xkR-RLJwyZvV9fWoyXCK<2b?Q)@$+WDA+g&M*-PaLiQ2aPpv;= z-7OqYF|cz}{pvY{ps66K1AI=Y2wUSR_Rm{b&E<-{;ueHh@n5)a!gUKC6{jtDI7ZDm zRKi^bP9