package org.overture.interpreter.utilities.pattern; import org.overture.ast.analysis.AnalysisException; import org.overture.ast.analysis.AnswerAdaptor; import org.overture.ast.node.INode; import org.overture.ast.patterns.AConcatenationPattern; import org.overture.ast.patterns.AExpressionPattern; import org.overture.ast.patterns.AIdentifierPattern; import org.overture.ast.patterns.AIgnorePattern; import org.overture.ast.patterns.AMapPattern; import org.overture.ast.patterns.AMapUnionPattern; import org.overture.ast.patterns.ASeqPattern; import org.overture.ast.patterns.ASetPattern; import org.overture.ast.patterns.AStringPattern; import org.overture.ast.patterns.AUnionPattern; import org.overture.ast.patterns.PPattern; import org.overture.interpreter.assistant.IInterpreterAssistantFactory; import org.overture.interpreter.assistant.pattern.PPatternAssistantInterpreter; /*************************************** * This class implement a way to find the length of a pattern?!?!? still not sure what this method do. * * @author gkanos ****************************************/ public class LengthFinder extends AnswerAdaptor<Integer> { protected IInterpreterAssistantFactory af; public LengthFinder(IInterpreterAssistantFactory af) { this.af = af; } @Override public Integer caseAConcatenationPattern(AConcatenationPattern pattern) throws AnalysisException { int llen = pattern.getLeft().apply(THIS);// PPatternAssistantInterpreter.getLength(pattern.getLeft()); int rlen = pattern.getRight().apply(THIS);// PPatternAssistantInterpreter.getLength(pattern.getRight()); return llen == PPatternAssistantInterpreter.ANY || rlen == PPatternAssistantInterpreter.ANY ? PPatternAssistantInterpreter.ANY : llen + rlen; } @Override public Integer caseAIdentifierPattern(AIdentifierPattern pattern) throws AnalysisException { return PPatternAssistantInterpreter.ANY; // Special value meaning "any length" } @Override public Integer caseAIgnorePattern(AIgnorePattern pattern) throws AnalysisException { return PPatternAssistantInterpreter.ANY; // Special value meaning "any length" } @Override public Integer caseAExpressionPattern(AExpressionPattern pattern) throws AnalysisException { return PPatternAssistantInterpreter.ANY; // Special value meaning "any length" } @Override public Integer caseAMapPattern(AMapPattern pattern) throws AnalysisException { return pattern.getMaplets().size(); } @Override public Integer caseAMapUnionPattern(AMapUnionPattern pattern) throws AnalysisException { int llen = pattern.getLeft().apply(THIS);// PPatternAssistantInterpreter.getLength(pattern.getLeft()); int rlen = pattern.getRight().apply(THIS);// PPatternAssistantInterpreter.getLength(pattern.getRight()); return llen == PPatternAssistantInterpreter.ANY || rlen == PPatternAssistantInterpreter.ANY ? PPatternAssistantInterpreter.ANY : llen + rlen; } @Override public Integer caseASeqPattern(ASeqPattern pattern) throws AnalysisException { return pattern.getPlist().size(); } @Override public Integer caseASetPattern(ASetPattern pattern) throws AnalysisException { return pattern.getPlist().size(); } @Override public Integer caseAStringPattern(AStringPattern pattern) throws AnalysisException { return pattern.getValue().getValue().length(); } @Override public Integer caseAUnionPattern(AUnionPattern pattern) throws AnalysisException { int llen = pattern.getLeft().apply(THIS); int rlen = pattern.getRight().apply(THIS); return llen == PPatternAssistantInterpreter.ANY || rlen == PPatternAssistantInterpreter.ANY ? PPatternAssistantInterpreter.ANY : llen + rlen; } @Override public Integer defaultPPattern(PPattern node) throws AnalysisException { return 1; } @Override public Integer createNewReturnValue(INode node) throws AnalysisException { // TODO Auto-generated method stub return null; } @Override public Integer createNewReturnValue(Object node) throws AnalysisException { // TODO Auto-generated method stub return null; } }