1 package org.jicengine.expression; 2 3 import org.jicengine.operation.MethodInvocationOperation; 4 import org.jicengine.operation.ObjectInstantiationOperation; 5 import org.jicengine.operation.ArrayConstructionOperation; 6 import org.jicengine.operation.Operation; 7 import java.util.*; 8 9 20 21 public class InvocationParser implements Parser { 22 23 private static final String NEW_OPERATOR = "new "; 24 private static final String ARGUMENTS_PART_START = "("; 25 private static final String ARGUMENTS_PART_END = ")"; 26 private static final String ARRAY_BRACKET_START = "["; 27 private static final String ARRAY_BRACKET_END = "]"; 28 private static final String DOT = "."; 29 30 private Parser elementParser; 31 32 public InvocationParser(Parser elementParser) 33 { 34 this.elementParser = elementParser; 35 } 36 37 public Operation parse(String expression) throws SyntaxException 38 { 39 int argumentsPartStart; 40 41 if( expression.startsWith(NEW_OPERATOR) ){ 42 46 argumentsPartStart = expression.indexOf(ARGUMENTS_PART_START); 47 48 if ( argumentsPartStart != -1 ){ 49 String className = expression.substring(4,argumentsPartStart); 52 String argumentsList = extractArguments(expression,argumentsPartStart); 53 return new ObjectInstantiationOperation(expression, elementParser.parse(className), parseArguments(this.elementParser, argumentsList)); 54 } 55 else { 56 int arrayLengthStart = expression.indexOf(ARRAY_BRACKET_START); 57 58 if( arrayLengthStart != -1 ){ 59 String componentType = expression.substring(4,arrayLengthStart); 61 String length = expression.substring(arrayLengthStart+1, expression.lastIndexOf(ARRAY_BRACKET_END)); 62 return new ArrayConstructionOperation(expression, elementParser.parse(componentType), elementParser.parse(length)); 63 } 64 else { 65 throw new SyntaxException("expected 'new full.class.name(parameters)' or 'new full.class.name[arraySize]', got '" + expression + "'"); 66 } 67 } 68 } 69 else if( (argumentsPartStart = expression.indexOf(ARGUMENTS_PART_START) ) != -1 ){ 70 73 String beforeMethodArguments = expression.substring(0, argumentsPartStart); 75 76 int lastDotIndex = beforeMethodArguments.lastIndexOf(DOT); 78 String actorName = beforeMethodArguments.substring(0,lastDotIndex); 79 String method = beforeMethodArguments.substring(lastDotIndex+1); 80 81 Operation actor = elementParser.parse(actorName); 82 83 Operation[] arguments = parseArguments(this.elementParser, extractArguments(expression, argumentsPartStart)); 84 85 return new MethodInvocationOperation(expression, actor, method, arguments); 86 } 87 else { 88 return null; 89 } 90 } 91 92 public static Operation[] parseArguments(Parser parser, String argumentsExpression) throws SyntaxException { 93 94 String [] params = Utils.parseArgumentlist(argumentsExpression); 95 Operation[] paramsAsOperations = new Operation[params.length]; 96 for (int i = 0; i < params.length; i++) { 97 paramsAsOperations[i] = parser.parse(params[i]); 98 } 99 return paramsAsOperations; 100 } 101 102 106 private static String extractArguments(String expression, int argumentsPartStart) throws SyntaxException 107 { 108 try { 109 return expression.substring(argumentsPartStart+1, expression.lastIndexOf(ARGUMENTS_PART_END)); 110 } catch (StringIndexOutOfBoundsException e){ 111 throw new SyntaxException("Expression '" + expression + "' doesn't have valid arguments-part enclosed inside ()"); 112 } 113 } 114 115 } 116 | Popular Tags |