Author: pkluegl Date: Wed Jan 13 17:30:09 2016 New Revision: 1724465 URL: http://svn.apache.org/viewvc?rev=1724465&view=rev Log: UIMA-4735 - macros for actions and conditions
Added: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/MacroAction.java (with props) uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/MacroCondition.java (with props) uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/condition/MacroConditionTest.java (with props) uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaMacroDeclaration.java (with props) Modified: uima/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaEnvironment.java uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ActionFactory.java uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/AssignAction.java uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ImplicitVariableAssignmentAction.java uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ConditionFactory.java uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/action/MacroActionTest.java uima/ruta/trunk/ruta-docbook/src/docbook/tools.ruta.language.syntax.xml uima/ruta/trunk/ruta-ep-ide-ui/src/main/java/org/apache/uima/ruta/ide/validator/LanguageCheckerVisitor.java uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/RutaExtensionManager.java uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/RutaKeywords.java uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaExpressionList.java uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaStatement.java uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaTypeConstants.java uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaUnaryArithmeticExpression.java uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/StatementFactory.java Modified: uima/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g?rev=1724465&r1=1724464&r2=1724465&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g (original) +++ uima/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g Wed Jan 13 17:30:09 2016 @@ -385,11 +385,22 @@ public void setExternalFactory(RutaExter } - - private void addActionMacro(RutaBlock env, String text, Map<String,String> def, List<AbstractRutaAction> as) { - int i = 0; + + private void addMacroAction(RutaBlock env, String name, Map<String,String> def, List<AbstractRutaAction> as) { + env.getEnvironment().addMacroAction(name, def, as); } - + + private boolean isMacroAction(String name, RutaBlock env) { + return env.getEnvironment().isMacroAction(name); + } + + private void addMacroCondition(RutaBlock env, String name, Map<String,String> def, List<AbstractRutaCondition> cs) { + env.getEnvironment().addMacroCondition(name, def, cs); + } + + private boolean isMacroCondition(String name, RutaBlock env) { + return env.getEnvironment().isMacroCondition(name); + } private Map<String,String> temporaryVariables = new HashMap<>(); @@ -415,6 +426,8 @@ public void setExternalFactory(RutaExter } } + + } @rulecatch { @@ -479,8 +492,8 @@ statement returns [RutaStatement stmt = : ( stmtDecl = declaration {stmt = stmtDecl;} | stmtVariable = variableDeclaration {stmt = stmtVariable;} - | stmtCM = conditionMacroDeclaration {stmt = stmtCM;} - | stmtAM = actionMacroDeclaration {stmt = stmtAM;} + | stmtCM = macroConditionDeclaration {stmt = stmtCM;} + | stmtAM = macroActionDeclaration {stmt = stmtAM;} | stmtRule = simpleStatement {stmt = stmtRule;} | stmtBlock = blockDeclaration {stmt = stmtBlock;} | stmtExternal = externalBlock {stmt = stmtExternal;} @@ -571,16 +584,23 @@ List<String> vars = new ArrayList<String ; -conditionMacroDeclaration returns [RutaStatement stmt = null] - : - type = CONDITION id = Identifier ASSIGN_EQUAL LPAREN cons = conditions RPAREN SEMI - {addVariable($blockDeclaration::env, id.getText(), type.getText()); - AbstractRutaCondition condition = ConditionFactory.createConditionAnd(cons,$blockDeclaration::env); - setValue($blockDeclaration::env, id.getText(), condition);} +macroConditionDeclaration returns [RutaStatement stmt = null] +@init { +Map<String,String> def = new LinkedHashMap<>(); +} + : + CONDITION name = Identifier + LPAREN + (argType = varTypeToken argName = Identifier {def.put(argName.getText(),argType.getText());} + (COMMA argType = varTypeToken argName = Identifier {def.put(argName.getText(),argType.getText());})*)? + {addTemporaryVariables(def);} + RPAREN ASSIGN_EQUAL cs = conditions SEMI + {removeTemporaryVariables(def);} + {addMacroCondition($blockDeclaration::env, name.getText(), def, cs);} ; -actionMacroDeclaration returns [RutaStatement stmt = null] +macroActionDeclaration returns [RutaStatement stmt = null] @init { Map<String,String> def = new LinkedHashMap<>(); } @@ -592,8 +612,7 @@ Map<String,String> def = new LinkedHashM {addTemporaryVariables(def);} RPAREN ASSIGN_EQUAL as = actions SEMI {removeTemporaryVariables(def);} - {addActionMacro($blockDeclaration::env, name.getText(), def, as);} - + {addMacroAction($blockDeclaration::env, name.getText(), def, as);} ; varTypeToken returns [Token token = null ] @@ -1385,21 +1404,11 @@ condition returns [AbstractRutaConditio | (featureMatchExpression2)=> f = featureMatchExpression2 {c = ConditionFactory.createImplicitCondition(f);} | (booleanExpression)=> b = booleanExpression {c = ConditionFactory.createImplicitCondition(b);} | (c = externalCondition)=> c = externalCondition - -// | c = variableCondition + | (c = macroCondition)=> c = macroCondition ) {result = c;} ; -//variableCondition returns [AbstractRutaCondition condition = null] -// : -// -// id = Identifier -// { -// condition = ConditionFactory.createConditionVariable(id); -// } -// ; - externalCondition returns [AbstractRutaCondition condition = null] : {isConditionExtension(input.LT(1).getText())}? @@ -1409,6 +1418,14 @@ externalCondition returns [AbstractRutaC } ; +macroCondition returns [AbstractRutaCondition condition = null] + : + {isMacroCondition(input.LT(1).getText(), $blockDeclaration::env)}? + id = Identifier LPAREN args = varArgumentList? RPAREN + { + condition = ConditionFactory.createMacroCondition(id, args, $blockDeclaration::env); + } + ; conditionAnd returns [AbstractRutaCondition cond = null] : AND LPAREN conds = conditions RPAREN @@ -1654,6 +1671,7 @@ action returns [AbstractRutaAction resu | a = actionRemoveFilterType | (variableAssignmentAction)=> vae = variableAssignmentAction {a = vae;} | (externalAction)=> a = externalAction + | (macroAction)=> a = macroAction | (featureAssignmentExpression)=> fae = featureAssignmentExpression {a = ActionFactory.createAction(fae);} | (typeExpression)=> te = typeExpression {a = ActionFactory.createAction(te);} @@ -1708,19 +1726,11 @@ rawAction returns [AbstractRutaAction r | a = actionAddFilterType | a = actionRemoveFilterType | (externalAction)=> a = externalAction - -// | a = variableAction + | (macroAction)=> a = macroAction ) {result = a;} ; -//variableAction returns [AbstractRutaAction action = null] -// : -// -// id = Identifier -// { -// action = ActionFactory.createActionVariable(id); -// } -// ; + externalAction returns [AbstractRutaAction action = null] @@ -1732,7 +1742,14 @@ externalAction returns [AbstractRutaActi } ; - +macroAction returns [AbstractRutaAction action = null] + : + {isMacroAction(input.LT(1).getText(), $blockDeclaration::env)}? + id = Identifier LPAREN args = varArgumentList? RPAREN + { + action = ActionFactory.createMacroAction(id, args, $blockDeclaration::env); + } + ; actionCreate returns [AbstractRutaAction action = null] @init { @@ -2600,8 +2617,8 @@ composedBooleanExpression returns [IBool : (e2 = booleanCompare)=> e2 = booleanCompare {expr = e2;} - | (bte = booleanTypeExpression)=> bte = booleanTypeExpression{expr = bte;} | (bne = booleanNumberExpression)=> bne = booleanNumberExpression{expr = bne;} + | (bte = booleanTypeExpression)=> bte = booleanTypeExpression{expr = bte;} | e1 = booleanFunction {expr = e1;} | LPAREN ep = booleanExpression RPAREN {expr = ep;} ; Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaEnvironment.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaEnvironment.java?rev=1724465&r1=1724464&r2=1724465&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaEnvironment.java (original) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaEnvironment.java Wed Jan 13 17:30:09 2016 @@ -35,6 +35,8 @@ import java.util.logging.Level; import java.util.logging.Logger; import org.antlr.runtime.CommonToken; +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.commons.lang3.tuple.Pair; import org.apache.uima.UIMAFramework; import org.apache.uima.UimaContext; import org.apache.uima.cas.CAS; @@ -145,6 +147,10 @@ public class RutaEnvironment { private Map<String, Class<?>> availableListTypes; + private Map<String, Pair<Map<String, String>, List<AbstractRutaCondition>>> macroConditions; + + private Map<String, Pair<Map<String, String>, List<AbstractRutaAction>>> macroActions; + private String[] resourcePaths = null; private CAS cas; @@ -169,6 +175,8 @@ public class RutaEnvironment { variableValues = new HashMap<String, Object>(); variableTypes = new HashMap<String, Class<?>>(); variableGenericTypes = new HashMap<String, Class<?>>(); + macroConditions = new HashMap<>(); + macroActions = new HashMap<>(); availableTypes = new HashMap<String, Class<?>>(); availableTypes.put("ANNOTATION", AnnotationFS.class); availableTypes.put("INT", Integer.class); @@ -644,7 +652,7 @@ public class RutaEnvironment { return tables.get(table); } - public void addVariable(String name, Class<?> type, Class<?> generic) { + private void addVariable(String name, Class<?> type, Class<?> generic) { variableTypes.put(name, type); if (generic != null) { variableGenericTypes.put(name, generic); @@ -688,6 +696,12 @@ public class RutaEnvironment { public void addVariable(String name, String type) { addVariable(name, availableTypes.get(type), availableListTypes.get(type)); } + + public void removeVariable(String name) { + variableTypes.remove(name); + variableGenericTypes.remove(name); + variableValues.remove(name); + } public boolean ownsVariable(String name) { return variableTypes.containsKey(name); @@ -906,4 +920,30 @@ public class RutaEnvironment { this.resourceManager = resourceManager; } + public void addMacroAction(String name, Map<String, String> def, List<AbstractRutaAction> actions) { + macroActions.put(name, new ImmutablePair<Map<String, String>, List<AbstractRutaAction>>(def, + actions)); + } + + public void addMacroCondition(String name, Map<String, String> def, + List<AbstractRutaCondition> conditions) { + macroConditions.put(name, new ImmutablePair<Map<String, String>, List<AbstractRutaCondition>>( + def, conditions)); + } + + public boolean isMacroAction(String name) { + return macroActions.keySet().contains(name); + } + + public boolean isMacroCondition(String name) { + return macroConditions.keySet().contains(name); + } + + public Pair<Map<String, String>, List<AbstractRutaAction>> getMacroAction(String name) { + return macroActions.get(name); + } + + public Pair<Map<String, String>, List<AbstractRutaCondition>> getMacroCondition(String name) { + return macroConditions.get(name); + } } Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java?rev=1724465&r1=1724464&r2=1724465&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java (original) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java Wed Jan 13 17:30:09 2016 @@ -954,8 +954,7 @@ public class RutaStream extends FSIterat } else if (value instanceof IStringExpression) { IStringExpression stringExpr = (IStringExpression) value; String string = stringExpr.getStringValue(context, this); - StringArrayFS array = FSCollectionFactory.createStringArray(cas, - new String[] { string }); + StringArrayFS array = FSCollectionFactory.createStringArray(cas, new String[] { string }); annotation.setFeatureValue(feature, array); } } else if (range.equals(UIMAConstants.TYPE_INTEGER) || range.equals(UIMAConstants.TYPE_LONG) @@ -969,13 +968,12 @@ public class RutaStream extends FSIterat if (value instanceof INumberExpression) { INumberExpression numberExpr = (INumberExpression) value; int v = numberExpr.getIntegerValue(context, this); - IntArrayFS array = FSCollectionFactory.createIntArray(cas, - new int[] { v }); + IntArrayFS array = FSCollectionFactory.createIntArray(cas, new int[] { v }); annotation.setFeatureValue(feature, array); - } else if(value instanceof INumberListExpression) { + } else if (value instanceof INumberListExpression) { INumberListExpression expr = (INumberListExpression) value; List<Number> list = expr.getNumberList(context, this); - IntArrayFS array = FSCollectionFactory.createIntArray(cas,RutaListUtils.toIntArray(list)); + IntArrayFS array = FSCollectionFactory.createIntArray(cas, RutaListUtils.toIntArray(list)); annotation.setFeatureValue(feature, array); } } else if (range.equals(UIMAConstants.TYPE_DOUBLE)) { @@ -988,13 +986,13 @@ public class RutaStream extends FSIterat if (value instanceof INumberExpression) { INumberExpression numberExpr = (INumberExpression) value; double v = numberExpr.getDoubleValue(context, this); - DoubleArrayFS array = FSCollectionFactory.createDoubleArray(cas, - new double[] { v }); + DoubleArrayFS array = FSCollectionFactory.createDoubleArray(cas, new double[] { v }); annotation.setFeatureValue(feature, array); - } else if(value instanceof INumberListExpression) { + } else if (value instanceof INumberListExpression) { INumberListExpression expr = (INumberListExpression) value; List<Number> list = expr.getNumberList(context, this); - DoubleArrayFS array = FSCollectionFactory.createDoubleArray(cas,RutaListUtils.toDoubleArray(list)); + DoubleArrayFS array = FSCollectionFactory.createDoubleArray(cas, + RutaListUtils.toDoubleArray(list)); annotation.setFeatureValue(feature, array); } } else if (range.equals(UIMAConstants.TYPE_FLOAT)) { @@ -1007,13 +1005,13 @@ public class RutaStream extends FSIterat if (value instanceof INumberExpression) { INumberExpression numberExpr = (INumberExpression) value; float v = numberExpr.getFloatValue(context, this); - FloatArrayFS array = FSCollectionFactory.createFloatArray(cas, - new float[] { v }); + FloatArrayFS array = FSCollectionFactory.createFloatArray(cas, new float[] { v }); annotation.setFeatureValue(feature, array); - } else if(value instanceof INumberListExpression) { + } else if (value instanceof INumberListExpression) { INumberListExpression expr = (INumberListExpression) value; List<Number> list = expr.getNumberList(context, this); - FloatArrayFS array = FSCollectionFactory.createFloatArray(cas,RutaListUtils.toFloatArray(list)); + FloatArrayFS array = FSCollectionFactory.createFloatArray(cas, + RutaListUtils.toFloatArray(list)); annotation.setFeatureValue(feature, array); } } else if (range.equals(UIMAConstants.TYPE_BOOLEAN)) { @@ -1031,8 +1029,7 @@ public class RutaStream extends FSIterat } else if (value instanceof IBooleanExpression) { IBooleanExpression expr = (IBooleanExpression) value; Boolean v = expr.getBooleanValue(context, this); - BooleanArrayFS array = FSCollectionFactory.createBooleanArray(cas, - new boolean[] { v }); + BooleanArrayFS array = FSCollectionFactory.createBooleanArray(cas, new boolean[] { v }); annotation.setFeatureValue(feature, array); } } else if (value instanceof AnnotationTypeExpression && !feature.getRange().isPrimitive()) { @@ -1123,38 +1120,38 @@ public class RutaStream extends FSIterat } } - public void assignVariable(String var, IRutaExpression expression, MatchContext context, - RutaStream stream) { + public void assignVariable(String var, IRutaExpression expression, MatchContext context) { RuleElement element = context.getElement(); RutaBlock parent = element.getParent(); RutaEnvironment environment = parent.getEnvironment(); Class<?> clazz = environment.getVariableType(var); if (clazz.equals(Double.class) && expression instanceof INumberExpression) { - double v = ((INumberExpression) expression).getDoubleValue(context, stream); + double v = ((INumberExpression) expression).getDoubleValue(context, this); environment.setVariableValue(var, v); } else if (clazz.equals(Integer.class) && expression instanceof INumberExpression) { - int v = ((INumberExpression) expression).getIntegerValue(context, stream); + int v = ((INumberExpression) expression).getIntegerValue(context, this); environment.setVariableValue(var, v); } else if (clazz.equals(Type.class) && expression instanceof ITypeExpression) { - Type v = ((ITypeExpression) expression).getType(context, stream); + Type v = ((ITypeExpression) expression).getType(context, this); environment.setVariableValue(var, v); } else if (clazz.equals(Boolean.class) && expression instanceof IBooleanExpression) { - boolean v = ((IBooleanExpression) expression).getBooleanValue(context, stream); + boolean v = ((IBooleanExpression) expression).getBooleanValue(context, this); environment.setVariableValue(var, v); } else if (clazz.equals(String.class) && expression instanceof IStringExpression) { - String v = ((IStringExpression) expression).getStringValue(context, stream); + String v = ((IStringExpression) expression).getStringValue(context, this); environment.setVariableValue(var, v); } else if (clazz.equals(AnnotationFS.class) && expression instanceof IAnnotationExpression) { - AnnotationFS v = ((IAnnotationExpression) expression).getAnnotation(context, stream); + AnnotationFS v = ((IAnnotationExpression) expression).getAnnotation(context, this); environment.setVariableValue(var, v); } else if (clazz.equals(List.class)) { Class<?> variableGenericType = environment.getVariableGenericType(var); if (variableGenericType.equals(AnnotationFS.class) && expression instanceof IAnnotationListExpression) { List<AnnotationFS> v = ((IAnnotationListExpression) expression).getAnnotationList(context, - stream); + this); environment.setVariableValue(var, v); } + // TODO assign also other lists } } Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ActionFactory.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ActionFactory.java?rev=1724465&r1=1724464&r2=1724465&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ActionFactory.java (original) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ActionFactory.java Wed Jan 13 17:30:09 2016 @@ -24,6 +24,7 @@ import java.util.Map; import java.util.logging.Level; import org.antlr.runtime.Token; +import org.apache.commons.lang3.tuple.Pair; import org.apache.uima.ruta.RutaBlock; import org.apache.uima.ruta.expression.IRutaExpression; import org.apache.uima.ruta.expression.bool.IBooleanExpression; @@ -36,6 +37,7 @@ import org.apache.uima.ruta.expression.s import org.apache.uima.ruta.expression.string.IStringExpression; import org.apache.uima.ruta.expression.type.AbstractTypeListExpression; import org.apache.uima.ruta.expression.type.ITypeExpression; +import org.apache.uima.ruta.extensions.RutaParseRuntimeException; public class ActionFactory { @@ -59,8 +61,8 @@ public class ActionFactory { } public static AbstractRutaAction createMarkFastAction(ITypeExpression type, - AbstractStringListExpression list, IBooleanExpression ignore, INumberExpression ignoreLength, - IBooleanExpression ignoreWS, RutaBlock env) { + AbstractStringListExpression list, IBooleanExpression ignore, + INumberExpression ignoreLength, IBooleanExpression ignoreWS, RutaBlock env) { return new MarkFastAction(type, list, ignore, ignoreLength, ignoreWS); } @@ -159,8 +161,8 @@ public class ActionFactory { return new UnmarkAction(f, list, b); } - public static AbstractRutaAction createUnmarkAllAction(ITypeExpression f, AbstractTypeListExpression list, - RutaBlock env) { + public static AbstractRutaAction createUnmarkAllAction(ITypeExpression f, + AbstractTypeListExpression list, RutaBlock env) { return new UnmarkAllAction(f, list); } @@ -267,11 +269,11 @@ public class ActionFactory { public static AbstractRutaAction createImplicitVariableAssignmentAction(Token var, Token op, IRutaExpression arg, RutaBlock env) { - String varString = var != null ? var.getText() : null; - String opString = op != null ? op.getText() : "="; + String varString = var != null ? var.getText() : null; + String opString = op != null ? op.getText() : "="; return new ImplicitVariableAssignmentAction(varString, opString, arg); } - + public static AbstractRutaAction createMarkFirstAction(ITypeExpression type, RutaBlock env) { return new MarkFirstAction(type); } @@ -287,6 +289,22 @@ public class ActionFactory { return new SplitAction(type, complete, appendToBegin, appendToEnd); } - + public static AbstractRutaAction createMacroAction(Token id, List<IRutaExpression> args, + RutaBlock env) { + String name = id.getText(); + Pair<Map<String, String>, List<AbstractRutaAction>> macroActionDefinition = env + .getEnvironment().getMacroAction(name); + if (macroActionDefinition == null) { + return null; + } + Map<String, String> definition = macroActionDefinition.getKey(); + List<AbstractRutaAction> actions = macroActionDefinition.getValue(); + if (definition.size() != args.size()) { + throw new RutaParseRuntimeException("Arguments of macro action '" + name + + "' do not match its definition: " + definition.values()); + } + + return new MacroAction(name, definition, actions, args); + } } Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/AssignAction.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/AssignAction.java?rev=1724465&r1=1724464&r2=1724465&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/AssignAction.java (original) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/AssignAction.java Wed Jan 13 17:30:09 2016 @@ -38,7 +38,7 @@ public class AssignAction extends Abstra @Override public void execute(MatchContext context, RutaStream stream, InferenceCrowd crowd) { - stream.assignVariable(var, expression, context, stream); + stream.assignVariable(var, expression, context); } public String getVar() { Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ImplicitVariableAssignmentAction.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ImplicitVariableAssignmentAction.java?rev=1724465&r1=1724464&r2=1724465&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ImplicitVariableAssignmentAction.java (original) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ImplicitVariableAssignmentAction.java Wed Jan 13 17:30:09 2016 @@ -44,7 +44,7 @@ public class ImplicitVariableAssignmentA public void execute(MatchContext context, RutaStream stream, InferenceCrowd crowd) { // only normal assignment is supported right now if(StringUtils.equals(op, "=")) { - stream.assignVariable(var, arg, context, stream); + stream.assignVariable(var, arg, context); } } Added: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/MacroAction.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/MacroAction.java?rev=1724465&view=auto ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/MacroAction.java (added) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/MacroAction.java Wed Jan 13 17:30:09 2016 @@ -0,0 +1,105 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.uima.ruta.action; + +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import org.apache.uima.ruta.RutaBlock; +import org.apache.uima.ruta.RutaEnvironment; +import org.apache.uima.ruta.RutaStream; +import org.apache.uima.ruta.expression.IRutaExpression; +import org.apache.uima.ruta.rule.MatchContext; +import org.apache.uima.ruta.visitor.InferenceCrowd; + +public class MacroAction extends AbstractRutaAction { + + private final String name; + + private final Map<String, String> definition; + + private final List<AbstractRutaAction> actions; + + private final List<IRutaExpression> arguments; + + public MacroAction(String name, Map<String, String> definition, List<AbstractRutaAction> actions, + List<IRutaExpression> arguments) { + super(); + this.name = name; + this.definition = definition; + this.actions = actions; + this.arguments = arguments; + } + + @Override + public void execute(MatchContext context, RutaStream stream, InferenceCrowd crowd) { + prepareEnvironment(context, stream); + for (AbstractRutaAction eachAction : actions) { + crowd.beginVisit(eachAction, null); + eachAction.execute(context, stream, crowd); + crowd.endVisit(eachAction, null); + } + cleanupEnvironment(context, stream); + } + + private void prepareEnvironment(MatchContext context, RutaStream stream) { + RutaBlock parent = context.getParent(); + RutaEnvironment environment = parent.getEnvironment(); + Set<Entry<String, String>> entrySet = definition.entrySet(); + int index = 0; + for (Entry<String, String> entry : entrySet) { + String name = entry.getKey(); + String type = entry.getValue(); + IRutaExpression expression = arguments.get(index); + environment.addVariable(name, type); + stream.assignVariable(name, expression, context); + index++; + } + } + + private void cleanupEnvironment(MatchContext context, RutaStream stream) { + RutaBlock parent = context.getParent(); + RutaEnvironment environment = parent.getEnvironment(); + Set<Entry<String, String>> entrySet = definition.entrySet(); + for (Entry<String, String> entry : entrySet) { + String name = entry.getKey(); + environment.removeVariable(name); + } + } + + public String getName() { + return name; + } + + public Map<String, String> getDefinition() { + return definition; + } + + public List<AbstractRutaAction> getActions() { + return actions; + } + + public List<IRutaExpression> getArguments() { + return arguments; + } + +} Propchange: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/MacroAction.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ConditionFactory.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ConditionFactory.java?rev=1724465&r1=1724464&r2=1724465&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ConditionFactory.java (original) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ConditionFactory.java Wed Jan 13 17:30:09 2016 @@ -20,8 +20,10 @@ package org.apache.uima.ruta.condition; import java.util.List; +import java.util.Map; import org.antlr.runtime.Token; +import org.apache.commons.lang3.tuple.Pair; import org.apache.uima.ruta.RutaBlock; import org.apache.uima.ruta.expression.IRutaExpression; import org.apache.uima.ruta.expression.bool.IBooleanExpression; @@ -32,6 +34,7 @@ import org.apache.uima.ruta.expression.s import org.apache.uima.ruta.expression.string.IStringExpression; import org.apache.uima.ruta.expression.type.AbstractTypeListExpression; import org.apache.uima.ruta.expression.type.ITypeExpression; +import org.apache.uima.ruta.extensions.RutaParseRuntimeException; public class ConditionFactory { @@ -307,4 +310,21 @@ public class ConditionFactory { return new ImplicitCondition(expr); } + public static AbstractRutaCondition createMacroCondition(Token id, List<IRutaExpression> args, RutaBlock env) { + String name = id.getText(); + Pair<Map<String, String>, List<AbstractRutaCondition>> macroConditionDefinition = env + .getEnvironment().getMacroCondition(name); + if (macroConditionDefinition == null) { + return null; + } + Map<String, String> definition = macroConditionDefinition.getKey(); + List<AbstractRutaCondition> conditions = macroConditionDefinition.getValue(); + if (definition.size() != args.size()) { + throw new RutaParseRuntimeException("Arguments of macro action '" + name + + "' do not match its definition: " + definition.values()); + } + + return new MacroCondition(name, definition, conditions, args); + } + } Added: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/MacroCondition.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/MacroCondition.java?rev=1724465&view=auto ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/MacroCondition.java (added) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/MacroCondition.java Wed Jan 13 17:30:09 2016 @@ -0,0 +1,114 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.uima.ruta.condition; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import org.apache.uima.ruta.RutaBlock; +import org.apache.uima.ruta.RutaEnvironment; +import org.apache.uima.ruta.RutaStream; +import org.apache.uima.ruta.expression.IRutaExpression; +import org.apache.uima.ruta.rule.EvaluatedCondition; +import org.apache.uima.ruta.rule.MatchContext; +import org.apache.uima.ruta.visitor.InferenceCrowd; + +public class MacroCondition extends AbstractRutaCondition { + + private final String name; + + private final Map<String, String> definition; + + private final List<AbstractRutaCondition> conditions; + + private final List<IRutaExpression> arguments; + + public MacroCondition(String name, Map<String, String> definition, List<AbstractRutaCondition> conditions, + List<IRutaExpression> arguments) { + super(); + this.name = name; + this.definition = definition; + this.conditions = conditions; + this.arguments = arguments; + } + + + @Override + public EvaluatedCondition eval(MatchContext context, RutaStream stream, InferenceCrowd crowd) { + boolean result = true; + prepareEnvironment(context, stream); + List<EvaluatedCondition> evals = new ArrayList<EvaluatedCondition>(); + for (AbstractRutaCondition each : conditions) { + crowd.beginVisit(each, null); + EvaluatedCondition eval = each.eval(context, stream, crowd); + crowd.endVisit(each, null); + result &= eval.isValue(); + evals.add(eval); + } + cleanupEnvironment(context, stream); + return new EvaluatedCondition(this, result, evals); + } + + private void prepareEnvironment(MatchContext context, RutaStream stream) { + RutaBlock parent = context.getParent(); + RutaEnvironment environment = parent.getEnvironment(); + Set<Entry<String, String>> entrySet = definition.entrySet(); + int index = 0; + for (Entry<String, String> entry : entrySet) { + String name = entry.getKey(); + String type = entry.getValue(); + IRutaExpression expression = arguments.get(index); + environment.addVariable(name, type); + stream.assignVariable(name, expression, context); + index++; + } + } + + private void cleanupEnvironment(MatchContext context, RutaStream stream) { + RutaBlock parent = context.getParent(); + RutaEnvironment environment = parent.getEnvironment(); + Set<Entry<String, String>> entrySet = definition.entrySet(); + for (Entry<String, String> entry : entrySet) { + String name = entry.getKey(); + environment.removeVariable(name); + } + } + + public String getName() { + return name; + } + + public Map<String, String> getDefinition() { + return definition; + } + + public List<AbstractRutaCondition> getActions() { + return conditions; + } + + public List<IRutaExpression> getArguments() { + return arguments; + } + + +} Propchange: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/MacroCondition.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/action/MacroActionTest.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/action/MacroActionTest.java?rev=1724465&r1=1724464&r2=1724465&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/action/MacroActionTest.java (original) +++ uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/action/MacroActionTest.java Wed Jan 13 17:30:09 2016 @@ -28,11 +28,11 @@ public class MacroActionTest { @Test - public void testFeature() { + public void test() { String document = "Test"; String script = "INT j;\n"; - script += "ACTION macro(TYPE t, INT i) = MARK(t),ASSIGN(i,1);\n"; - script += "Document{-> macro(T1,j)};\n"; + script += "ACTION macro(TYPE t, INT inc) = MARK(t),ASSIGN(j,j+inc);\n"; + script += "Document{-> macro(T1,1)};\n"; script += "Document{(j>0)->T2};\n"; @@ -44,8 +44,8 @@ public class MacroActionTest { e.printStackTrace(); } -// RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "Test"); -// RutaTestUtils.assertAnnotationsEquals(cas, 2, 1, "Test"); + RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "Test"); + RutaTestUtils.assertAnnotationsEquals(cas, 2, 1, "Test"); cas.release(); } Added: uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/condition/MacroConditionTest.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/condition/MacroConditionTest.java?rev=1724465&view=auto ============================================================================== --- uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/condition/MacroConditionTest.java (added) +++ uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/condition/MacroConditionTest.java Wed Jan 13 17:30:09 2016 @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.uima.ruta.condition; + +import org.apache.uima.cas.CAS; +import org.apache.uima.ruta.engine.Ruta; +import org.apache.uima.ruta.engine.RutaTestUtils; +import org.junit.Test; + +public class MacroConditionTest { + + + @Test + public void test() { + String document = "Test"; + String script = "INT j;\n"; + script += "CONDITION macro(TYPE t, INT i) = IS(t),(j==i);\n"; + script += "Document{-> T1, j=1};\n"; + script += "Document{macro(T1,0)-> T2};\n"; + script += "Document{macro(T1,1)-> T3};\n"; + + + CAS cas = null; + try { + cas = RutaTestUtils.getCAS(document); + Ruta.apply(cas, script); + } catch (Exception e) { + e.printStackTrace(); + } + + RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "Test"); + RutaTestUtils.assertAnnotationsEquals(cas, 2, 0); + RutaTestUtils.assertAnnotationsEquals(cas, 3, 1, "Test"); + + cas.release(); + } +} Propchange: uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/condition/MacroConditionTest.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: uima/ruta/trunk/ruta-docbook/src/docbook/tools.ruta.language.syntax.xml URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-docbook/src/docbook/tools.ruta.language.syntax.xml?rev=1724465&r1=1724464&r2=1724465&view=diff ============================================================================== --- uima/ruta/trunk/ruta-docbook/src/docbook/tools.ruta.language.syntax.xml (original) +++ uima/ruta/trunk/ruta-docbook/src/docbook/tools.ruta.language.syntax.xml Wed Jan 13 17:30:09 2016 @@ -103,7 +103,10 @@ BasicAnnotationType -> ('COLON'| 'SW' | | 'SPACE' | 'BREAK') BlockDeclaration -> "BLOCK" "(" Identifier ")" RuleElementWithCA "{" Statements "}"]]></programlisting> - +actionDeclaration -> "ACTION" Identifier "(" VarType Identifier ("," VarType Identifier)*")" + "=" Action ( "," Action)* ";" +conditionDeclaration-> "CONDITION" Identifier "(" VarType Identifier ("," VarType Identifier)*")" + "=" Condition ( "," Condition)* ";" Syntax of statements and rule elements: <programlisting><![CDATA[SimpleStatement -> SimpleRule | RegExpRule | ConjunctRules | DocumentActionRule Modified: uima/ruta/trunk/ruta-ep-ide-ui/src/main/java/org/apache/uima/ruta/ide/validator/LanguageCheckerVisitor.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-ide-ui/src/main/java/org/apache/uima/ruta/ide/validator/LanguageCheckerVisitor.java?rev=1724465&r1=1724464&r2=1724465&view=diff ============================================================================== --- uima/ruta/trunk/ruta-ep-ide-ui/src/main/java/org/apache/uima/ruta/ide/validator/LanguageCheckerVisitor.java (original) +++ uima/ruta/trunk/ruta-ep-ide-ui/src/main/java/org/apache/uima/ruta/ide/validator/LanguageCheckerVisitor.java Wed Jan 13 17:30:09 2016 @@ -71,6 +71,7 @@ import org.apache.uima.ruta.ide.parser.a import org.apache.uima.ruta.ide.parser.ast.RutaImportStatement; import org.apache.uima.ruta.ide.parser.ast.RutaImportTypesStatement; import org.apache.uima.ruta.ide.parser.ast.RutaListExpression; +import org.apache.uima.ruta.ide.parser.ast.RutaMacroDeclaration; import org.apache.uima.ruta.ide.parser.ast.RutaPackageDeclaration; import org.apache.uima.ruta.ide.parser.ast.RutaRegExpRule; import org.apache.uima.ruta.ide.parser.ast.RutaRule; @@ -196,7 +197,7 @@ public class LanguageCheckerVisitor exte private boolean packageChecked = false; private Collection<String> currentLabels = new HashSet<>(); - + public LanguageCheckerVisitor(IProblemReporter problemReporter, ISourceLineTracker linetracker, ISourceModule sourceModule, ClassLoader classLoader) { super(); @@ -221,7 +222,7 @@ public class LanguageCheckerVisitor exte IPath location = sourceModule.getResource().getLocation(); try { IPath packagePath = RutaProjectUtils.getPackagePath(location, project); - if(packagePath != null) { + if (packagePath != null) { packagePathString = packagePath.toPortableString().replaceAll("/", "."); } } catch (CoreException e) { @@ -241,6 +242,26 @@ public class LanguageCheckerVisitor exte checkPackage(s); return false; } + if (s instanceof RutaMacroDeclaration) { + RutaMacroDeclaration decl = (RutaMacroDeclaration) s; + Map<Token, Token> definition = decl.getDefinition(); + String name = decl.getName(); + int kind = decl.getKind(); + if(kind == RutaTypeConstants.RUTA_TYPE_A) { + actionExtensions.put(name, null); + } else if(kind == RutaTypeConstants.RUTA_TYPE_C) { + conditionExtensions.put(name, null); + } + Set<Entry<Token,Token>> entrySet = definition.entrySet(); + Map<String, Integer> map = new HashMap<>(); + for (Entry<Token, Token> entry : entrySet) { + String varName = entry.getKey().getText(); + String varType = entry.getValue().getText(); + int vt = getType(varType); + map.put(varName, vt); + } + knownLocalVariables.push(map); + } if (s instanceof RutaImportTypesStatement) { RutaImportTypesStatement stmt = (RutaImportTypesStatement) s; SimpleReference tsExpr = (SimpleReference) stmt.getExpression(); @@ -288,7 +309,7 @@ public class LanguageCheckerVisitor exte IPath typeSystemDescriptorPath = RutaProjectUtils.getTypeSystemDescriptorPath( file.getLocation(), referredProject); TypeSystemDescription tsDesc = importCompleteTypeSystem(typeSystemDescriptorPath, url); - + List<String> checkDuplicateShortNames = checkOnAmbiguousShortNames(tsDesc); if (!checkDuplicateShortNames.isEmpty()) { pr.reportProblem(problemFactory.createDuplicateShortNameInImported(sRef, localPath, @@ -414,8 +435,8 @@ public class LanguageCheckerVisitor exte } } } - if(s instanceof RutaRule) { - collectAllLabels((RutaRule)s); + if (s instanceof RutaRule) { + collectAllLabels((RutaRule) s); } return true; } @@ -431,7 +452,7 @@ public class LanguageCheckerVisitor exte } private void checkPackage(ASTNode node) { - if(!StringUtils.equals(packageName, packagePathString) && !packageChecked) { + if (!StringUtils.equals(packageName, packagePathString) && !packageChecked) { pr.reportProblem(problemFactory.createWrongPackageProblem(node)); } packageChecked = true; @@ -608,7 +629,7 @@ public class LanguageCheckerVisitor exte if (isFeatureMatch(name) != null) { return false; } - if(isLabel(name)) { + if (isLabel(name)) { return false; } if (name.indexOf(".") != -1) { @@ -618,8 +639,7 @@ public class LanguageCheckerVisitor exte return false; } } - - + pr.reportProblem(problemFactory.createTypeProblem(ref, sourceModule)); return false; } @@ -637,7 +657,8 @@ public class LanguageCheckerVisitor exte String[] keywords = RutaKeywordsManager.getKeywords(IRutaKeywords.ACTION); List<String> asList = Arrays.asList(keywords); if (!StringUtils.isEmpty(actionName) && !"-".equals(actionName) - && !asList.contains(actionName) && !implicitString.equals(tma.getName())) { + && !asList.contains(actionName) && !implicitString.equals(tma.getName()) + && !actionExtensions.keySet().contains(actionName)) { IProblem problem = problemFactory.createUnknownActionProblem(tma); pr.reportProblem(problem); } @@ -720,7 +741,8 @@ public class LanguageCheckerVisitor exte String[] keywords = RutaKeywordsManager.getKeywords(IRutaKeywords.CONDITION); List<String> asList = Arrays.asList(keywords); if (!StringUtils.isEmpty(conditionName) && !"-".equals(conditionName) - && !asList.contains(conditionName) && !implicitString.equals(cond.getName())) { + && !asList.contains(conditionName) && !implicitString.equals(cond.getName()) + && !conditionExtensions.keySet().contains(cond)) { IProblem problem = problemFactory.createUnknownConditionProblem(cond); pr.reportProblem(problem); } @@ -750,11 +772,11 @@ public class LanguageCheckerVisitor exte } } } - if(conditionName.equals("CONTAINS")) { + if (conditionName.equals("CONTAINS")) { List<?> args = cond.getChilds(); boolean valid = checkContainsArguments(args); } - + } if (s instanceof RutaFunction) { RutaFunction f = (RutaFunction) s; @@ -787,48 +809,48 @@ public class LanguageCheckerVisitor exte private boolean checkContainsArguments(List<?> args) { if (args.size() == 1) { Object arg = args.get(0); -// if (arg instanceof ITypeExpression) { - return true; -// } + // if (arg instanceof ITypeExpression) { + return true; + // } } else if (args.size() == 2) { Object arg1 = args.get(0); Object arg2 = args.get(1); -// if (arg1 instanceof ListExpression) { - return true; -// } + // if (arg1 instanceof ListExpression) { + return true; + // } } else if (args.size() == 3) { Object arg1 = args.get(0); Object arg2 = args.get(1); Object arg3 = args.get(2); -// if (arg1 instanceof ITypeExpression && arg2 instanceof INumberExpression -// && arg3 instanceof INumberExpression) { - return true; -// } + // if (arg1 instanceof ITypeExpression && arg2 instanceof INumberExpression + // && arg3 instanceof INumberExpression) { + return true; + // } } else if (args.size() == 4) { Object arg1 = args.get(0); Object arg2 = args.get(1); Object arg3 = args.get(2); Object arg4 = args.get(3); -// if (arg1 instanceof ITypeExpression && arg2 instanceof INumberExpression -// && arg3 instanceof INumberExpression && arg4 instanceof IBooleanExpression) { - return true; -// } + // if (arg1 instanceof ITypeExpression && arg2 instanceof INumberExpression + // && arg3 instanceof INumberExpression && arg4 instanceof IBooleanExpression) { + return true; + // } } else if (args.size() == 5) { Object arg1 = args.get(0); Object arg2 = args.get(1); Object arg3 = args.get(2); Object arg4 = args.get(3); Object arg5 = args.get(3); -// if (arg1 instanceof ListExpression && arg3 instanceof INumberExpression -// && arg4 instanceof INumberExpression && arg5 instanceof IBooleanExpression) { - return true; -// } + // if (arg1 instanceof ListExpression && arg3 instanceof INumberExpression + // && arg4 instanceof INumberExpression && arg5 instanceof IBooleanExpression) { + return true; + // } } return false; } private boolean isLabel(String name) { - return currentLabels.contains(name); + return currentLabels.contains(name); } private String expand(String shortName) { @@ -894,13 +916,17 @@ public class LanguageCheckerVisitor exte if (s instanceof RutaDeclareDeclarationsStatement) { parentTypeInDeclaration = null; } - if(!packageChecked) { + if (s instanceof RutaMacroDeclaration) { + RutaMacroDeclaration decl = (RutaMacroDeclaration) s; + knownLocalVariables.pop(); + } + if (!packageChecked) { checkPackage(null); } - if(s instanceof RutaRule) { + if (s instanceof RutaRule) { currentLabels.clear(); } - + return super.endvisit(s); } @@ -1363,10 +1389,10 @@ public class LanguageCheckerVisitor exte CoreException { IPath descriptorPath = RutaProjectUtils.getTypeSystemDescriptorPath(sourceModule.getResource() .getLocation(), sourceModule.getScriptProject().getProject()); - if(descriptorPath == null) { + if (descriptorPath == null) { return null; } - + TypeSystemDescription typeSysDescr = null; if (descriptorPath.toFile().exists()) { typeSysDescr = UIMAFramework.getXMLParser().parseTypeSystemDescription( @@ -1412,4 +1438,42 @@ public class LanguageCheckerVisitor exte } return name; } + + private int getType(String name) { + if (name == null) { + return 0; + } + // TODO reuse field in constants + if (name.equals("STRING")) { + return RutaTypeConstants.RUTA_TYPE_S; + } else if (name.equals("STRINGLIST")) { + return RutaTypeConstants.RUTA_TYPE_SL; + } else if (name.equals("INT")) { + return RutaTypeConstants.RUTA_TYPE_I; + } else if (name.equals("INTLIST")) { + return RutaTypeConstants.RUTA_TYPE_NL; + } else if (name.equals("DOUBLE")) { + return RutaTypeConstants.RUTA_TYPE_D; + } else if (name.equals("DOUBLELIST")) { + return RutaTypeConstants.RUTA_TYPE_NL; + } else if (name.equals("FLOAT")) { + return RutaTypeConstants.RUTA_TYPE_F; + } else if (name.equals("FLOATLIST")) { + return RutaTypeConstants.RUTA_TYPE_NL; + } else if (name.equals("BOOLEAN")) { + return RutaTypeConstants.RUTA_TYPE_B; + } else if (name.equals("BOOLEANLIST")) { + return RutaTypeConstants.RUTA_TYPE_BL; + } else if (name.equals("TYPE")) { + return RutaTypeConstants.RUTA_TYPE_AT; + } else if (name.equals("TYPELIST")) { + return RutaTypeConstants.RUTA_TYPE_TL; + } else if (name.equals("ANNOTATION")) { + return RutaTypeConstants.RUTA_TYPE_UA; + } else if (name.equals("ANNOTATIONLIST")) { + return RutaTypeConstants.RUTA_TYPE_UAL; + } + return 0; + } + } Modified: uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g?rev=1724465&r1=1724464&r2=1724465&view=diff ============================================================================== --- uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g (original) +++ uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g Wed Jan 13 17:30:09 2016 @@ -30,6 +30,7 @@ package org.apache.uima.ruta.ide.core.pa import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Stack; @@ -335,6 +336,8 @@ statement returns [List<Statement> stmts : ( stmts1 = declaration {stmts.addAll(stmts1);} | stmtVariable = variableDeclaration {stmts.addAll(stmtVariable);} + | stmtCM = macroConditionDeclaration {stmts.add(stmtCM);} + | stmtAM = macroActionDeclaration {stmts.add(stmtAM);} | stmt3 = blockDeclaration {stmts.add(stmt3);} | (externalBlock)=> stmt4 = externalBlock {stmts.add(stmt4);} | stmt2 = simpleStatement {stmts.add(stmt2);} @@ -342,7 +345,42 @@ statement returns [List<Statement> stmts ) ; - + +macroConditionDeclaration returns [Statement stmt = null] +@init { +Map<Token,Token> def = new LinkedHashMap<>(); +} + : + kind = CONDITION name = Identifier + LPAREN + (argType = varTypeToken argName = Identifier {def.put(argName,argType);} + (COMMA argType = varTypeToken argName = Identifier {def.put(argName,argType);})*)? + RPAREN ASSIGN_EQUAL cs = conditions SEMI + {stmt = StatementFactory.createMacroStatement(kind, name, def, cs);} + ; + + +macroActionDeclaration returns [Statement stmt = null] +@init { +Map<Token,Token> def = new LinkedHashMap<>(); +} + : + kind = ACTION name = Identifier + LPAREN + (argType = varTypeToken argName = Identifier {def.put(argName,argType);} + (COMMA argType = varTypeToken argName = Identifier {def.put(argName,argType);})*)? + RPAREN ASSIGN_EQUAL as = actions SEMI + {stmt = StatementFactory.createMacroStatement(kind, name, def, as);} + ; + +varTypeToken returns [Token token = null ] + : + t = (ANNOTATION | ANNOTATIONLIST | StringString | STRINGLIST + | BooleanString | BOOLEANLIST | IntString | INTLIST + | DoubleString | DOUBLELIST | FloatString | FLOATLIST + | TypeString | TYPELIST) {token = t;} + ; + importStatement returns [Statement stmt = null] : im = TypeSystemString Modified: uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/RutaExtensionManager.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/RutaExtensionManager.java?rev=1724465&r1=1724464&r2=1724465&view=diff ============================================================================== --- uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/RutaExtensionManager.java (original) +++ uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/RutaExtensionManager.java Wed Jan 13 17:30:09 2016 @@ -70,7 +70,7 @@ public class RutaExtensionManager { if (infos == null) { return new IRutaLanguageExtension[0]; } - List extensions = new ArrayList(); + List<Object> extensions = new ArrayList<>(); for (int i = 0; i < infos.length; i++) { Object object = manager.getInitObject(infos[i]); if (object instanceof IRutaLanguageExtension) { @@ -83,7 +83,7 @@ public class RutaExtensionManager { public ISourceElementRequestVisitorExtension[] getSourceElementRequestoVisitorExtensions() { IRutaLanguageExtension[] extensions = getExtensions(); - List result = new ArrayList(); + List<ISourceElementRequestVisitorExtension> result = new ArrayList<>(); for (int i = 0; i < extensions.length; i++) { ISourceElementRequestVisitorExtension visitorExtension = extensions[i] .createSourceElementRequestVisitorExtension(); @@ -97,7 +97,7 @@ public class RutaExtensionManager { public IMixinBuildVisitorExtension[] getMixinVisitorExtensions() { IRutaLanguageExtension[] extensions = getExtensions(); - List result = new ArrayList(); + List<IMixinBuildVisitorExtension> result = new ArrayList<>(); for (int i = 0; i < extensions.length; i++) { IMixinBuildVisitorExtension visitorExtension = extensions[i] .createMixinBuildVisitorExtension(); @@ -111,7 +111,7 @@ public class RutaExtensionManager { public IMatchLocatorExtension[] getMatchLocatorExtensions() { IRutaLanguageExtension[] extensions = getExtensions(); - List result = new ArrayList(); + List<IMatchLocatorExtension> result = new ArrayList<>(); for (int i = 0; i < extensions.length; i++) { IMatchLocatorExtension visitorExtension = extensions[i].createMatchLocatorExtension(); if (visitorExtension != null) { @@ -123,7 +123,7 @@ public class RutaExtensionManager { public ICompletionExtension[] getCompletionExtensions() { IRutaLanguageExtension[] extensions = getExtensions(); - List result = new ArrayList(); + List<ICompletionExtension> result = new ArrayList<>(); for (int i = 0; i < extensions.length; i++) { ICompletionExtension visitorExtension = extensions[i].createCompletionExtension(); if (visitorExtension != null) { @@ -135,7 +135,7 @@ public class RutaExtensionManager { public ISelectionExtension[] getSelectionExtensions() { IRutaLanguageExtension[] extensions = getExtensions(); - List result = new ArrayList(); + List<ISelectionExtension> result = new ArrayList<>(); for (int i = 0; i < extensions.length; i++) { ISelectionExtension visitorExtension = extensions[i].createSelectionExtension(); if (visitorExtension != null) { Modified: uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/RutaKeywords.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/RutaKeywords.java?rev=1724465&r1=1724464&r2=1724465&view=diff ============================================================================== --- uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/RutaKeywords.java (original) +++ uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/RutaKeywords.java Wed Jan 13 17:30:09 2016 @@ -29,7 +29,7 @@ public class RutaKeywords implements IRu private static String[] declaration = { "WORDLIST", "DECLARE", "BOOLEAN", "PACKAGE", "TYPE", "TYPESYSTEM", "INT", "DOUBLE", "FLOAT", "STRING", "SCRIPT", "WORDTABLE", "ENGINE", "BLOCK", "BOOLEANLIST", "INTLIST", "DOUBLELIST", "FLOATLIST", "STRINGLIST", "TYPELIST", - "UIMAFIT", "IMPORT" , "FROM", "AS", "null", "ANNOTATION", "ANNOTATIONLIST" }; + "UIMAFIT", "IMPORT" , "FROM", "AS", "null", "ANNOTATION", "ANNOTATIONLIST", "ACTION", "CONDITION" }; private static String[] action = { "DEL", "CALL", "MARK", "MARKSCORE", "COLOR", "LOG", "REPLACE", "FILLOBJECT", "RETAINTYPE", "SETFEATURE", "ASSIGN", "PUTINLIST", "ATTRIBUTE", "MARKFAST", Modified: uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaExpressionList.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaExpressionList.java?rev=1724465&r1=1724464&r2=1724465&view=diff ============================================================================== --- uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaExpressionList.java (original) +++ uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaExpressionList.java Wed Jan 13 17:30:09 2016 @@ -30,14 +30,14 @@ import org.eclipse.dltk.ast.statements.S import org.eclipse.dltk.utils.CorePrinter; public class RutaExpressionList extends Expression { - private List<Expression> expressions; + private List<? extends Expression> expressions; /** * Statement with bounds from first to last expression. * * @param expressions */ - public RutaExpressionList(List<Expression> expressions) { + public RutaExpressionList(List<? extends Expression> expressions) { if (!expressions.isEmpty()) { // First Expression first = expressions.get(0); @@ -69,7 +69,7 @@ public class RutaExpressionList extends } } - public List<Expression> getExpressions() { + public List<? extends Expression> getExpressions() { return this.expressions; } @@ -109,7 +109,7 @@ public class RutaExpressionList extends public void printNode(CorePrinter output) { if (this.expressions != null) { output.formatPrintLn(""); - Iterator i = this.expressions.iterator(); + Iterator<? extends Expression> i = this.expressions.iterator(); while (i.hasNext()) { ASTNode node = (ASTNode) i.next(); node.printNode(output); @@ -122,7 +122,7 @@ public class RutaExpressionList extends public String toString() { String value = ""; if (this.expressions != null) { - Iterator i = this.expressions.iterator(); + Iterator<? extends Expression> i = this.expressions.iterator(); while (i.hasNext()) { ASTNode node = (ASTNode) i.next(); value += node.toString(); Added: uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaMacroDeclaration.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaMacroDeclaration.java?rev=1724465&view=auto ============================================================================== --- uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaMacroDeclaration.java (added) +++ uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaMacroDeclaration.java Wed Jan 13 17:30:09 2016 @@ -0,0 +1,43 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.uima.ruta.ide.parser.ast; + +import java.util.Map; + +import org.antlr.runtime.Token; +import org.eclipse.dltk.ast.expressions.Expression; +import org.eclipse.dltk.ast.references.SimpleReference; + +public class RutaMacroDeclaration extends RutaVariableDeclaration { + + private final Map<Token, Token> definition; + + public RutaMacroDeclaration(String name, int nameStart, int nameEnd, int declStart, int declEnd, + SimpleReference ref, int type, Map<Token, Token> definition, Expression initExpression) { + super(name, nameStart, nameEnd, declStart, declEnd, ref, type, initExpression); + this.definition = definition; + } + + public Map<Token, Token> getDefinition() { + return definition; + } + + +} Propchange: uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaMacroDeclaration.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaStatement.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaStatement.java?rev=1724465&r1=1724464&r2=1724465&view=diff ============================================================================== --- uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaStatement.java (original) +++ uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaStatement.java Wed Jan 13 17:30:09 2016 @@ -110,7 +110,7 @@ public class RutaStatement extends State public void printNode(CorePrinter output) { if (this.expressions != null) { output.formatPrintLn(""); - Iterator i = this.expressions.iterator(); + Iterator<Expression> i = this.expressions.iterator(); while (i.hasNext()) { ASTNode node = (ASTNode) i.next(); node.printNode(output); @@ -123,7 +123,7 @@ public class RutaStatement extends State public String toString() { String value = ""; if (this.expressions != null) { - Iterator i = this.expressions.iterator(); + Iterator<Expression> i = this.expressions.iterator(); while (i.hasNext()) { ASTNode node = (ASTNode) i.next(); value += node.toString(); Modified: uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaTypeConstants.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaTypeConstants.java?rev=1724465&r1=1724464&r2=1724465&view=diff ============================================================================== --- uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaTypeConstants.java (original) +++ uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaTypeConstants.java Wed Jan 13 17:30:09 2016 @@ -124,7 +124,7 @@ public final class RutaTypeConstants { typeStringOfInt.put(RUTA_TYPE_NL, "NUMBERLIST"); typeStringOfInt.put(RUTA_TYPE_SL, "STRINGLIST"); typeStringOfInt.put(RUTA_TYPE_TL, "TYPELIST"); - typeStringOfInt.put(RUTA_TYPE_AT, "ANNOTATION_TYPE"); + typeStringOfInt.put(RUTA_TYPE_AT, "TYPE"); typeStringOfInt.put(RUTA_TYPE_G, "GENERIC"); } Modified: uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaUnaryArithmeticExpression.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaUnaryArithmeticExpression.java?rev=1724465&r1=1724464&r2=1724465&view=diff ============================================================================== --- uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaUnaryArithmeticExpression.java (original) +++ uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaUnaryArithmeticExpression.java Wed Jan 13 17:30:09 2016 @@ -49,8 +49,8 @@ public class RutaUnaryArithmeticExpressi @Override public String getOperator() { Map<String, Integer> map = RutaExpressionConstants.opIDs; - for (Iterator iterator = map.keySet().iterator(); iterator.hasNext();) { - String key = (String) iterator.next(); + for (Iterator<String> iterator = map.keySet().iterator(); iterator.hasNext();) { + String key = iterator.next(); Integer intID = map.get(key); if (intID.equals(opID)) { return key; Modified: uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/StatementFactory.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/StatementFactory.java?rev=1724465&r1=1724464&r2=1724465&view=diff ============================================================================== --- uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/StatementFactory.java (original) +++ uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/StatementFactory.java Wed Jan 13 17:30:09 2016 @@ -21,6 +21,7 @@ package org.apache.uima.ruta.ide.parser. import java.util.ArrayList; import java.util.List; +import java.util.Map; import org.antlr.runtime.CommonToken; import org.antlr.runtime.Token; @@ -273,12 +274,13 @@ public class StatementFactory extends Ab declBounds[0], declBounds[1], ref, eachTO); } - @SuppressWarnings("unchecked") + @SuppressWarnings({ "rawtypes" }) public static Statement createDeclareDeclarationsStatement(Token declareToken, List declarations, ASTNode parent) { return createDeclareDeclarationsStatement(declareToken, declarations, parent, new ArrayList<RutaFeatureDeclaration>(0)); } + @SuppressWarnings({ "unchecked", "rawtypes" }) public static Statement createDeclareDeclarationsStatement(Token declareToken, List declarations, ASTNode parent, List<RutaFeatureDeclaration> features) { List<RutaAbstractDeclaration> decls = declarations; @@ -304,7 +306,7 @@ public class StatementFactory extends Ab } - @SuppressWarnings("unchecked") + @SuppressWarnings({ "rawtypes", "unchecked" }) public static Statement createDeclarationsStatement(Token declareToken, List declarations, Expression init) { List<RutaAbstractDeclaration> decls = declarations; @@ -325,15 +327,15 @@ public class StatementFactory extends Ab init, declBounds[0], declBounds[1]); } - @SuppressWarnings("unchecked") + + @SuppressWarnings("rawtypes") public static Statement createDeclarationsStatement(Token declareToken, List declarations) { return createDeclarationsStatement(declareToken, declarations, null); } - @SuppressWarnings("unchecked") public static Statement createDeclarationsStatement(Token declareToken, RutaAbstractDeclaration declaration, Expression init) { - List decl = new ArrayList<RutaAbstractDeclaration>(); + List<RutaAbstractDeclaration> decl = new ArrayList<>(); return createDeclarationsStatement(declareToken, decl, init); } @@ -368,6 +370,19 @@ public class StatementFactory extends Ab return new ComponentDeclaration(nameBounds[0], nameBounds[0] + text.length(), text); } + public static Statement createMacroStatement(Token kind, Token name, Map<Token, Token> def, + List<? extends Expression> elements) { + int declBounds[] = getBounds(kind, elements.get(elements.size()-1)); + int nameBounds[] = getBounds(name); + int k = kind.equals("CONDITION") ? RutaTypeConstants.RUTA_TYPE_C : RutaTypeConstants.RUTA_TYPE_A; + // FieldDeclaration + SimpleReference ref = new RutaVariableReference(nameBounds[0], nameBounds[1], name.getText(), + k); + RutaExpressionList expr = new RutaExpressionList(elements); + return new RutaVariableDeclaration(name.getText(), nameBounds[0], nameBounds[1], declBounds[0], + declBounds[1], ref, k, expr); + } + }