Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public static Object[] evaluateIfExpression(String expression, int opCount, int[] iValues, String[] sValues, long[] lValues,
- int intLocals, int stringLocals, int longLocals, String[] variableNames, HashMap<String, LocalVariable> variables, String[] lines, int index, int switchBlocksCount, HashMap<Integer, HashMap<Integer, Integer>> switchBlocks) {
- ArrayList<CS2Instruction> instructions = new ArrayList<>();
- boolean hasBlock = expression.endsWith("{");
- Pattern pattern = Pattern.compile("else(\\{)?");
- Matcher matcher = pattern.matcher(expression.replaceAll("\\s", ""));
- System.out.println("Evaluating if: "+expression);
- int elseIndex = -1;
- if(expression.contains("else if(") || expression.contains("else if (")) {
- elseIndex = opCount++;
- instructions.add(CS2Instruction.GOTO);
- }
- if(!matcher.matches()) {
- System.out.println(expression+" does not match else( \\{)?");
- String ifExpression = expression.substring(expression.indexOf("(") + 1, expression.lastIndexOf(")"));
- Object[] comparison = getComparison(ifExpression);
- if (comparison == null)
- throw new CompilerException("Unable to evaluate if statement: " + ifExpression);
- CS2Instruction instruction = (CS2Instruction) comparison[1];
- String[] split = ifExpression.split(" ?" + (String) comparison[0] + " ?");
- for (String ex : split) {
- Object[] values = evaluateParameter(ex, opCount, iValues,
- sValues, lValues, intLocals,
- stringLocals, longLocals, variableNames, variables, lines, index, switchBlocksCount, switchBlocks);
- instructions.addAll((ArrayList<CS2Instruction>) values[0]);
- opCount = (int) values[1];
- iValues = (int[]) values[2];
- sValues = (String[]) values[3];
- lValues = (long[]) values[4];
- intLocals = (int) values[5];
- stringLocals = (int) values[6];
- longLocals = (int) values[7];
- if (values[8] != null)
- variableNames = (String[]) values[8];
- variables = (HashMap<String, LocalVariable>) values[9];
- index = (int) values[10];
- switchBlocksCount = (int) values[11];
- switchBlocks = (HashMap<Integer, HashMap<Integer, Integer>>) values[12];
- }
- instructions.add(instruction);
- iValues[opCount++] = 1;
- }
- instructions.add(CS2Instruction.GOTO);
- int sizeIndex = opCount++;
- if (!hasBlock) {
- String nextLine = lines[index++];
- Object[] values = evaluateExpression(
- nextLine, opCount,
- iValues, sValues, lValues,
- intLocals, stringLocals, longLocals, variableNames, variables, lines, index, switchBlocksCount, switchBlocks);
- instructions.addAll((ArrayList<CS2Instruction>) values[0]);
- opCount = (int) values[1];
- iValues = (int[]) values[2];
- sValues = (String[]) values[3];
- lValues = (long[]) values[4];
- intLocals = (int) values[5];
- stringLocals = (int) values[6];
- longLocals = (int) values[7];
- if (values[8] != null)
- variableNames = (String[]) values[8];
- variables = (HashMap<String, LocalVariable>) values[9];
- index = (int) values[10];
- switchBlocksCount = (int) values[11];
- switchBlocks = (HashMap<Integer, HashMap<Integer, Integer>>) values[12];
- iValues[sizeIndex] = opCount - sizeIndex - 1;
- } else {
- while(!(expression = lines[index++]).equals("}")) {
- Object[] values = evaluateExpression(expression, opCount, iValues, sValues, lValues, intLocals,
- stringLocals, longLocals, variableNames, variables, lines, index, switchBlocksCount, switchBlocks);
- instructions.addAll((ArrayList<CS2Instruction>) values[0]);
- opCount = (int) values[1];
- iValues = (int[]) values[2];
- sValues = (String[]) values[3];
- lValues = (long[]) values[4];
- intLocals = (int) values[5];
- stringLocals = (int) values[6];
- longLocals = (int) values[7];
- if (values[8] != null)
- variableNames = (String[]) values[8];
- variables = (HashMap<String, LocalVariable>) values[9];
- index = (int) values[10];
- switchBlocksCount = (int) values[11];
- switchBlocks = (HashMap<Integer, HashMap<Integer, Integer>>) values[12];
- }
- iValues[sizeIndex] = opCount - sizeIndex-1;
- }
- String nextLine = lines[index].replaceAll("\\t", "").replaceAll(" {4}", "");
- System.out.println("Next Line: "+nextLine);
- if(nextLine.startsWith("else")) {
- iValues[sizeIndex]++;
- Object[] values = evaluateIfExpression(lines[index++], opCount, iValues, sValues, lValues, intLocals,
- stringLocals, longLocals, variableNames, variables, lines, index, switchBlocksCount, switchBlocks);
- instructions.addAll((ArrayList<CS2Instruction>) values[0]);
- opCount = (int) values[1];
- iValues = (int[]) values[2];
- sValues = (String[]) values[3];
- lValues = (long[]) values[4];
- intLocals = (int) values[5];
- stringLocals = (int) values[6];
- longLocals = (int) values[7];
- if (values[8] != null)
- variableNames = (String[]) values[8];
- variables = (HashMap<String, LocalVariable>) values[9];
- index = (int) values[10];
- switchBlocksCount = (int) values[11];
- switchBlocks = (HashMap<Integer, HashMap<Integer, Integer>>) values[12];
- }
- if (elseIndex != -1) {
- iValues[elseIndex] = opCount - elseIndex-1;
- System.out.println("ElseIndex: "+elseIndex);
- }
- return new Object[] { instructions, opCount, iValues, sValues, lValues, intLocals, stringLocals, longLocals,
- variableNames, variables, index, switchBlocksCount, switchBlocks };
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement