diff --git a/src/main/java/avatartranslator/AvatarAttribute.java b/src/main/java/avatartranslator/AvatarAttribute.java index 2bc7c2f551eead73597a84cbeaec077271d2b109..de1c97c7dc58771e8d5cfb92eb7a8dce24aa41d9 100644 --- a/src/main/java/avatartranslator/AvatarAttribute.java +++ b/src/main/java/avatartranslator/AvatarAttribute.java @@ -71,6 +71,7 @@ public class AvatarAttribute extends AvatarLeftHand implements NameChecker.NameS public AvatarStateMachineOwner getBlock() { return this.block; } + public void setType(AvatarType _type) { type = _type; } public void setInitialValue(String _initialValue) { initialValue = _initialValue; @@ -92,6 +93,11 @@ public class AvatarAttribute extends AvatarLeftHand implements NameChecker.NameS return initialValue; } + public String getProvidedInitialValue() { + if (initialValue == null) return ""; + return initialValue; + } + public AvatarDataType getDataType() { return dataType; } diff --git a/src/main/java/avatartranslator/AvatarDataTypePrimitiveFields.java b/src/main/java/avatartranslator/AvatarDataTypePrimitiveFields.java new file mode 100644 index 0000000000000000000000000000000000000000..6f09385ad4e824c10fcb6401613d962918eb1b78 --- /dev/null +++ b/src/main/java/avatartranslator/AvatarDataTypePrimitiveFields.java @@ -0,0 +1,167 @@ +/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille + * + * ludovic.apvrille AT enst.fr + * + * This software is a computer program whose purpose is to allow the + * edition of TURTLE analysis, design and deployment diagrams, to + * allow the generation of RT-LOTOS or Java code from this diagram, + * and at last to allow the analysis of formal validation traces + * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP + * from INRIA Rhone-Alpes. + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + */ + +package avatartranslator; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +/** + * Class AvatarDataTypePrimitiveFields: sequence of primitive fields that characterizes a datatype. + * + * Such datatype extension can only be produced through the buildMap method that takes a list + * of datatype as input and unroll the nested ones to build the lists of primitive fields. + * The result is a map that links each datatype with its extension. + * + * Creation: 20/06/2024 + * @version 1.0 20/06/2024 + * @author Sophie Coudert + */ +public class AvatarDataTypePrimitiveFields { + private List<AvatarAttribute> fields; + + private AvatarDataTypePrimitiveFields() { + fields = new ArrayList<AvatarAttribute>(); + } + + public int size() { return fields.size(); } + + private boolean addField (String name, AvatarType type) { + if(name == null || type == null) return false; + for(AvatarAttribute f : fields) if (f.getName().equals(name)) return false; + fields.add(new AvatarAttribute(name, type, null, null)); + return true; + } + + public List<AvatarAttribute> getFields() { return fields; } + + public String getName(int i) { return fields.get(i).getName(); } + + public AvatarType getType(int i) { return fields.get(i).getType(); } + + + /** unroll the nested datatype among the one provided as input to build the lists of primitive fields associated + * to each datatype. + * The returned result is a map that links each datatype with its primitive fields extension. + */ + public static HashMap<AvatarDataType, AvatarDataTypePrimitiveFields> buildMap(List<AvatarDataType> dtList, List<String> err) { + HashMap<AvatarDataType, AvatarDataTypePrimitiveFields> map = new HashMap<AvatarDataType, AvatarDataTypePrimitiveFields>(); + for(AvatarDataType dt : dtList) buildPrimitiveFields(dt, map, new ArrayList<AvatarAttribute>(), err); + return map; + } + + // IMPLEMENTATION + + /** + * unroll the fields of datatype dt to build its associated list of primitive fields. + * @param dt the datatype to unroll + * @param map the mapping of datatypes to their unrolled version, i.e. primitive fields + * @param l the list of containing datatype fields (ancestors when unrolling). Technical: to detect recursive datatypes. + * @param err to put encountered errors. + */ + private static void buildPrimitiveFields (AvatarDataType dt, HashMap<AvatarDataType, AvatarDataTypePrimitiveFields> map, + List<AvatarAttribute> l, List<String> err) { + + if (map.get(dt) != null) return; // the job is already done (function may be called directly or recursively for nested datatype) + + AvatarDataTypePrimitiveFields primitiveFields = new AvatarDataTypePrimitiveFields(); // create primitive-field-list structure + + AvatarAttribute aa; // to iterate on datatype original fields + int size = dt.attributeNb(); + for(int i = 0; i < size; i++) { // iterate: keep primitive-typed and extend datatype-typed (nested -> recursive call) + aa = dt.getAttributes().get(i); + if (aa.getType() == AvatarType.INTEGER) // atomic primitive : keep unchanged + primitiveFields.addField(aa.getName(), AvatarType.INTEGER); + else if (aa.getType() == AvatarType.BOOLEAN) // atomic primitive : keep unchanged + primitiveFields.addField(aa.getName(), AvatarType.BOOLEAN); + else if (aa.getType() == AvatarType.TIMER) { // forbidden + if (err != null) err.add("type timer unauthorized for field " + aa.getName() + " in datatype " + dt.getName() + + "(set to integer)"); + // recover + primitiveFields.addField(aa.getName(), AvatarType.INTEGER); + } + else { // datatype + AvatarDataType adt = aa.getDataType(); + // verify that datatype is well-defined + if (adt == null) { + if (err != null) err.add("type of field " + aa.getName() + " in datatype " + dt.getName() + " is undefined (set to integer)"); + primitiveFields.addField(aa.getName(), AvatarType.INTEGER); + continue; + } + // detect recursive datatype + int bug; + int len = l.size(); + for(bug = 0; bug < len; bug++) { // search datatype in ancestor fields types + if (l.get(bug).getDataType() == adt) break; + } + if (bug != len) { // datatype found => error: recursive datatypes not allowed + + // builds the textual representation of the detected cycle to provide a precise error message + StringBuffer path = new StringBuffer(); + bug++; + int endpath = l.size(); + while(bug < endpath) { path.append(l.get(bug).getName() + "."); bug++; } + path.append(aa.getName()); + + // register error message + if (err != null) err.add("datatype " + adt.getName() + " is recursive through field " + path.toString() + " (set to integer)"); + + // recover by breaking the cycle + primitiveFields.addField(aa.getName(), AvatarType.INTEGER); + continue; + } + + // unrolling nested datatype + + l.add(aa); // update ancestor list before a nested call + buildPrimitiveFields(adt, map, l, err); // nested call to build adt's primitive fields (if not already done). + l.remove(l.size() - 1); // restore ancestor list after a nested call + + // extend aa w.r.t adt's primitive fields + AvatarDataTypePrimitiveFields fields = map.get(adt); + for (int j = 0; j < fields.size(); j++) { + primitiveFields.addField(aa.getName() + "__" + fields.getName(j), fields.getType(j)); + } + } + } + // register the new "datatype -> primitive-fields" link. + map.put(dt, primitiveFields); + } +} + diff --git a/src/main/java/avatartranslator/AvatarQueryOnSignal.java b/src/main/java/avatartranslator/AvatarQueryOnSignal.java index 321b1790d0d0b30dd3567e7ff5d508e52e8acd4a..b2504d82dafa245788be4e7371743c4d748439b0 100644 --- a/src/main/java/avatartranslator/AvatarQueryOnSignal.java +++ b/src/main/java/avatartranslator/AvatarQueryOnSignal.java @@ -91,7 +91,7 @@ public class AvatarQueryOnSignal extends AvatarStateMachineElement { public String getExtendedName() { if ((getSignal() == null) || (getAttribute() == null)) { - String s = getName() + " refobjt=" + referenceObject.toString(); + String s = getName() + " refobjt=" + referenceObject; TraceManager.addDev("Null signal" + " res=" + s); return s; } diff --git a/src/main/java/avatartranslator/AvatarSpecification.java b/src/main/java/avatartranslator/AvatarSpecification.java index a5954b2217c2faca6cd4fea78dff6fdf9f4e3e23..5eff2ba1aea028c9b219d8d4f6fbbab3b0256fef 100644 --- a/src/main/java/avatartranslator/AvatarSpecification.java +++ b/src/main/java/avatartranslator/AvatarSpecification.java @@ -37,7 +37,7 @@ */ package avatartranslator; - +import avatartranslator.tosysmlv2.*; import avatartranslator.intboolsolver.AvatarIBSolver; import common.CanBeTagged; import common.Tag; @@ -1777,8 +1777,8 @@ public class AvatarSpecification extends AvatarElement implements IBSParamSpec { // SysML V2 public static AvatarSpecification makeFromSysMLV2(String pathToFile) { - AvatarSpecification as = new AvatarSpecification(pathToFile, null); - return as; + AvatarFromSysML builder = new AvatarFromSysML(); + return builder.sysMLtoSpec(pathToFile); } public List<String> getExtraTypes() { diff --git a/src/main/java/avatartranslator/AvatarSyntaxChecker.java b/src/main/java/avatartranslator/AvatarSyntaxChecker.java index 6cc9ca3dcad44d85fa00bfe1dcfbbdd90c917516..351d5c44a6ba4265e89503900d64388e55f6c7d8 100644 --- a/src/main/java/avatartranslator/AvatarSyntaxChecker.java +++ b/src/main/java/avatartranslator/AvatarSyntaxChecker.java @@ -569,22 +569,24 @@ public class AvatarSyntaxChecker { error.firstAvatarElement = aaos; error.error = 14; errors.add(error); - } else if (sig.isIn() || param.getType() == AvatarType.UNDEFINED) { - AvatarAttribute aa = block.getAvatarAttributeWithName(value); - if (aa == null) { - AvatarError error = new AvatarError(avspec); - error.block = block; - error.firstAvatarElement = aaos; - error.error = 17; - errors.add(error); - } else { - // We check the type of the two is equivalent - if (aa.getType() != param.getType()) { + } else if (param.getType() == AvatarType.UNDEFINED) { + if (sig.isIn()) { + AvatarAttribute aa = block.getAvatarAttributeWithName(value); + if (aa == null) { AvatarError error = new AvatarError(avspec); error.block = block; error.firstAvatarElement = aaos; error.error = 17; errors.add(error); + } else { + // We check the type of the two is equivalent + if (aa.getType() != param.getType()) { + AvatarError error = new AvatarError(avspec); + error.block = block; + error.firstAvatarElement = aaos; + error.error = 17; + errors.add(error); + } } } } else { diff --git a/src/main/java/avatartranslator/tosysmlv2/AVATAR2SysMLV2.java b/src/main/java/avatartranslator/tosysmlv2/AVATAR2SysMLV2.java index 10ea1ffb830e9c2f3146a610362b0546279541c7..496227d5538ddbfcb469418a5b9ab6a5fec672b7 100644 --- a/src/main/java/avatartranslator/tosysmlv2/AVATAR2SysMLV2.java +++ b/src/main/java/avatartranslator/tosysmlv2/AVATAR2SysMLV2.java @@ -165,9 +165,9 @@ public class AVATAR2SysMLV2 { avspec.removeCompositeStates(); avspec.removeLibraryFunctionCalls(); - avspec.removeTimers(); + //avspec.removeTimers(); // Reset parser - AvatarIBSolver.clearAttributes(); +/* AvatarIBSolver.clearAttributes(); //TraceManager.addDev("AVATAR2CPOSIX avspec=" + avspec); @@ -180,7 +180,8 @@ public class AVATAR2SysMLV2 { return indent(sysml); - +*/ Avatar2SysML newGen = new Avatar2SysML(avspec); + return(newGen.avatar2SysML()); } public boolean isExcluded(String key) { diff --git a/src/main/java/avatartranslator/tosysmlv2/Avatar2SysML.java b/src/main/java/avatartranslator/tosysmlv2/Avatar2SysML.java new file mode 100644 index 0000000000000000000000000000000000000000..a2e58bc000ecbe5cc3bb74c799bd47eecf2f5067 --- /dev/null +++ b/src/main/java/avatartranslator/tosysmlv2/Avatar2SysML.java @@ -0,0 +1,1547 @@ +/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille + * + * ludovic.apvrille AT enst.fr + * + * This software is a computer program whose purpose is to allow the + * edition of TURTLE analysis, design and deployment diagrams, to + * allow the generation of RT-LOTOS or Java code from this diagram, + * and at last to allow the analysis of formal validation traces + * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP + * from INRIA Rhone-Alpes. + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + */ +package avatartranslator.tosysmlv2; + +import avatartranslator.*; + +import static avatartranslator.AvatarTransition.*; +import static avatartranslator.tosysmlv2.Avatar2SysMLNames.*; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.ArrayList; +import java.util.function.BiConsumer; + + +/** + * Class Avatar2SysMLV2 + * Creation: 20/06/2024 + * + * @author Sophie Coudert + * @version 0.1 20/06/2024 + */ +public class Avatar2SysML { + /** the source Avatar Specification */ + private AvatarSpecification avspec; + /** the buffer in which theSysML Model is written (returned at the end of the generation process) */ + private StringBuffer avsysml; + /** signals concerned by AvatarQueryOnSignal (collected at beginning because require some specific handling)*/ + private HashSet<AvatarSignal> fifoSet = new HashSet<AvatarSignal>(); + /** infos about methods and signals collected while generation declarations and used while generating state machines */ + private HashMap<AvatarMethod, MethodInfo> methodMap = new HashMap<AvatarMethod, MethodInfo>(); + /** path from top level to the block (block sequence) being currently handled */ + private ArrayList<String> blockChain = new ArrayList<String>(); + /** SysML code to make inner blocks visible at top level. Contains one declaration per inner block */ + private StringBuffer blockLinks; + /** the standard indentation step string */ + private final String indentStep = " "; + /** size of the standard indentation step */ + private final int indentStepSize = 4; + /** the current indentation string */ + private String indentation; + + /** (fixed) header for any Avatar SysML model instance */ + private final String header = "package AvatarInstance {\n" + + indentStep + "private import AvatarGeneral::*;\n" + + indentStep + "private import AvatarBlockTypes::*;\n" + + indentStep + "private import AvatarCommunication::*;\n" + + indentStep + "private import AvatarTransitionServer::*;\n"; + + /** the single constructor */ + public Avatar2SysML(AvatarSpecification _avspec) { avspec = _avspec; } + + /** the generator. Builds the SysML model of the specification provided to the constructor */ + public StringBuffer avatar2SysML() { + fifoSet.clear(); + methodMap.clear(); + blockChain.clear(); + indentation = ""; + blockLinks = new StringBuffer(indentStep + "// Block Shortcut Links $$$$$$$$$$$$\n"); + avsysml = new StringBuffer(header); + indent(1); + searchCountSignals();; + dataTypes2SysML(); + communications2SysML(); + blocks2SysML(); + avsysml.append(blockLinks); + avsysml.append("}\n"); + return avsysml; + } + + /** increase indentation */ + private void indent(int n) { for (int i= 0; i < n; i++) indentation += indentStep; } + /** decrease indentation */ + private void unindent(int n) { indentation = indentation.substring(n * indentStepSize); } + + /** infos collected while generating declarations of methods and signals, to be used later. + * + * Used when generating state machine description, for example when handling ActionsOnSignal. */ + static private class MethodInfo { + private String name; // method name + private String msgtype; // null for methods that are not signals + private ArrayList<String> fieldNames; // names of parameters + private ArrayList<AvatarType> fieldTypes; // int, bool or undefined + private ArrayList<AvatarDataType> dataTypes; // datatype for "undefined" fieldType, otherwise null. + private AvatarType returnType; // int, bool or undefined + private AvatarDataType returnDataType; // datatype if returnType is "undefined", otherwise null. + + /** for void methods (without return type) */ + MethodInfo(String _name) { + name = _name; + msgtype = null; + fieldNames = new ArrayList<String>(); + fieldTypes = new ArrayList<AvatarType>(); + dataTypes = new ArrayList<AvatarDataType>(); + returnType = null; + returnDataType = null; + } + + /** for non-void methods (with return type) */ + MethodInfo(String _name, AvatarType _returnType, AvatarDataType dt) { + name = _name; + msgtype = null; + fieldNames = new ArrayList<String>(); + fieldTypes = new ArrayList<AvatarType>(); + dataTypes = new ArrayList<AvatarDataType>(); + returnType = _returnType; + if (_returnType != AvatarType.UNDEFINED) + returnDataType = null; + else + returnDataType = dt; + } + + /** for signals */ + MethodInfo(String _name, String _msgtype) { + name = _name; + msgtype = _msgtype; + fieldNames = new ArrayList<String>(); + fieldTypes = new ArrayList<AvatarType>(); + dataTypes = new ArrayList<AvatarDataType>(); + returnType = null; + returnDataType = null; + } + + /** add parameter at the end. + * @param _dt datatype, only relevant if _type is UNDEFINED + */ + public void addField(String _fieldName, AvatarType _type, AvatarDataType _dt){ + if (_type == AvatarType.UNDEFINED) + dataTypes.add(_dt); + else if (!(_type == AvatarType.BOOLEAN || _type == AvatarType.INTEGER)) + return; // unknown type... TO CHANGE ? ... + else + dataTypes.add(null); + fieldNames.add(_fieldName); + fieldTypes.add(_type); + } + + /** number of parameters */ + public int getArity() { return fieldNames.size(); } + + /** SysML name */ + public String getName(){ return name; } + + /** SysML name for message type describing profile */ + public String getMessageType(){ return msgtype; } + + /** method Avatar return type (null if none)*/ + public AvatarType getReturnType(){ return returnType; } + + /** method Avatar return datatype (null if no return type or return primitive type)*/ + public AvatarDataType getReturnDataType(){ return returnDataType; } + + /** ith parameter SysML name */ + public String getFieldName(int i){ return fieldNames.get(i); } + + /** ith parameter Avatar type */ + public AvatarType getFieldType(int i){ return fieldTypes.get(i); } + + /** ith parameter Avatar datatype (null if primitive type)*/ + public AvatarDataType getDataType(int i){ return dataTypes.get(i); } + } + + /** + * Memorized while naming states, to be reused for generating states + */ + static private class StateInfo { + /** SysML name */ + private String name; + + /** Sysml name of the state that is technically added before this (if exists) */ + private String prename = ""; + + /** for states that havn't technically added state before them + * @param _name SysML name + */ + StateInfo(String _name) { + name = _name; + } + + /** for states that have a technically added state before them + * @param _name SysML name of the state + * @param _prename SysML name of the technically added state before + */ + StateInfo(String _name, String _prename) { name = _name; prename = _prename; } + + /** SysML name of the state */ + public String getName(){ return name; } + + /** SysML name of the technically added state before */ + public String getPreName(){ return prename; } + } + + /** Collect (in fifoSet) all signals that are used in an AvatarQueryOnSignal element of the specification. + * + * (they require some specific handling while generating...) + */ + private void searchCountSignals() { + for(AvatarBlock block: avspec.getListOfBlocks()) { + for(AvatarStateMachineElement sme : block.getStateMachine().getListOfElements()) { + if(sme instanceof AvatarQueryOnSignal) + fifoSet.add(((AvatarQueryOnSignal) sme).getSignal()); + } + } + } + + /** update path blockChain when entering the block-handling procedure for a a block / sub-block + * @param _block: the block /sub-block to handle + */ + private void chainBlock(String _block) { blockChain.add(_block); } + + /** update path blockChain when exiting the block-handling procedure for a a block / sub-block */ + private void unchainBlock() { if(blockChain.size() > 0) blockChain.remove(blockChain.size() - 1); } + + /** generate SysML code to make a block visible at top level through its name (and not its path). + * + * Links block name to block path (updates blockLinks which is added to avsysml at the end of + * the generation process). Consistent because all blocks have different names. + */ + private void blocklink() { + int size = blockChain.size(); + if (size < 2) return; + StringBuffer chain = new StringBuffer(); + for (int i=0; i < size-1; i++){ + chain.append(blockChain.get(i) + "."); + } + chain.append(blockChain.get(size - 1)); + blockLinks.append( indentStep + "part " + blockChain.get(size - 1) + + " : '#AvatarBlock' :> " + chain.toString() + " = " + chain.toString() + ";\n" ); + } + + /** generates SysML datatype declarations and put them at the current position (end) of avsysml */ + private void dataTypes2SysML(){ + if (avspec.getDataTypes() == null || avspec.getDataTypes().size() == 0) return; + avsysml.append("\n" + indentation + "// DATATYPES $$$$$$$$$$$$$$$$$$$$$$$$\n"); + for(AvatarDataType dt : avspec.getDataTypes()){ + // put Header + avsysml.append("\n" + indentation + "attribute def " + dataTypeSysMLname(dt.getName()) + " :> '#AvatarDataType'"); + // handle fields + int nbFields = dt.attributeNb(); + if (nbFields == 0) + avsysml.append(";\n"); + else { // put fields. + // Note: SysML has no default values thus default values are explicitely set + avsysml.append(" { \n"); + indent(1); + for (int i = 0; i < nbFields; i++) { + AvatarAttribute aa = dt.getAttribute(i); + avsysml.append( indentation + "attribute " + fieldSysMLname(aa.getName()) + " : " ); + if (aa.getType() == AvatarType.BOOLEAN) { + avsysml.append("Boolean"); + if (aa.hasInitialValue()) + avsysml.append(" := " + aa.getInitialValue().trim() + ";\n"); + else + avsysml.append(" default := " + AvatarType.BOOLEAN.getDefaultInitialValue().trim() + ";\n"); + } + else if (aa.getType() == AvatarType.INTEGER) { + avsysml.append("Integer"); + if (aa.hasInitialValue()) + avsysml.append(" := " + aa.getInitialValue().trim() + ";\n"); + else + avsysml.append(" default := " + AvatarType.INTEGER.getDefaultInitialValue().trim() + ";\n"); + } + else + avsysml.append(aa.getDataType().getName() + ";\n"); // datatypes don't have default values + } + unindent(1); + avsysml.append(indentation + "}\n"); + } + } + } + /** generates SysML declarations of communication structures and put them at the current position (end) of avsysml. + * + * Communication structures are + * <ul> + * <li> Relations, corresponding to Avatar relations </li> + * <li> Channels declarations (a channel is an inSignal/outSignal connection inside a relation) </li> + * <li> Binding of block signals to channels, to complete channel's characterization </li> + * <li> in/out Messages (structures) declarations, linking them to channels. This providing signals with profiles </li> + * </ul> + */ + private void communications2SysML(){ + int nbfiforelNumber = 0; + int bfiforelNumber = 0; + int syncrelNumber = 0; + + if (avspec.getRelations() == null || avspec.getRelations().size() == 0) return; + + avsysml.append("\n" + indentation + "// COMMUNICATIONS $$$$$$$$$$$$$$$$$$$$$$$$\n"); + for(AvatarRelation ar: avspec.getRelations()) { + + // declare some parameters depending on relation type ============== + int relationType; // SYNC, FIFO or BFIFO + int relationNumber; // to distinguish relations with same characteristics + String relationConstructor; // #Sync_Rel, #Bfifo_Rel, #NBfifo_Rel (c.f. Avatar SysML library) + String relationParameters; // for the call of SysML constructors of relation parts + String channelConstructor; // #Sync, #Bfifo, #NBfifo (c.f. Avatar SysML library) + + // compute parameters depending on relation type ============== + // if (ar.isAMS()) ... TODO + String blk1 = ar.getBlock1().getName(); + String blk2 = ar.getBlock2().getName(); + String blk1SysMLname = blockSysMLname(blk1); + String blk2SysMLname = blockSysMLname(blk2); + relationParameters = "('@block1' = " + blk1SysMLname + ", '@block2' = " + blk2SysMLname; + if (! ar.isAsynchronous()) { // sync relation + relationType = SYNC; + relationNumber = syncrelNumber++; + relationConstructor = "'#Sync_Rel'"; + channelConstructor = "'#Sync'"; + if(ar.isPrivate()) relationParameters += ", '@private'=true)"; // default is false in Avatar SysML library + } + else { // fifo relation + if(ar.isPrivate()) // default: false in Avatar SysML library + if(ar.isLossy()) // default: false in Avatar SysML library + if(ar.getSizeOfFIFO() > 1) // default size: 1 in Avatar SysML library + relationParameters += ", '@private'=true, '@lossy'=true, '@max_size'=" + ar.getSizeOfFIFO() + ")"; + else + relationParameters += ", '@private'=true, '@lossy'=true)"; + else + if(ar.getSizeOfFIFO() > 1) // default size: 1 in Avatar SysML library + relationParameters += ", '@private'=true, '@max_size'=" + ar.getSizeOfFIFO() + ")"; + else + relationParameters += ", '@private'=true)"; + else + if(ar.isLossy()) // default: false in Avatar SysML library + if(ar.getSizeOfFIFO() > 1) // default size: 1 in Avatar SysML library + relationParameters += ", '@lossy'=true, '@max_size'=" + ar.getSizeOfFIFO() + ")"; + else + relationParameters += ", '@lossy'=true)"; + else + if(ar.getSizeOfFIFO() > 1) // default size: 1 in Avatar SysML library + relationParameters += ", '@max_size'=" + ar.getSizeOfFIFO() + ")"; + + if (ar.isBlocking()) { // blocking fifo relation + relationType = BFIFO; + relationNumber = bfiforelNumber++; + relationConstructor = "'#Bfifo_Rel'"; + channelConstructor = "'#Bfifo'"; + } + else { // non blocking fifo relation + relationType = NBFIFO; + relationNumber = nbfiforelNumber++; + relationConstructor = "'#NBfifo_Rel'"; + channelConstructor = "'#NBfifo'"; + } + } + + // general generation (using parameters above) : put declaration to avsysml ============== + + String relationSYSMLname = relationSysMLname(blk1, blk2, relationType, relationNumber); + + // relation declaration -------------------- + + avsysml.append("\n" + indentation + "// Relation " + relationSYSMLname + "=============\n"); + avsysml.append(indentation + "part " + relationSYSMLname + ": " + relationConstructor); + if(relationParameters != null) + avsysml.append(" = " + relationConstructor + relationParameters); + avsysml.append(";\n"); + + // Channels and associated Messages declarations ---------------- + + int relationSize = ar.getSignals1().size(); + for(int i=0; i<relationSize; i++) { // iterate on signal connections + AvatarSignal sig1 = ar.getSignals1().get(i); + AvatarSignal sig2 = ar.getSignals2().get(i); + boolean out2in = (sig1.getInOut() == AvatarSignal.OUT); + + String channelSYSMLname = channelSysMLname(channelName(blk1, blk2, sig1.getName(), sig2.getName(), out2in), relationType); + String sig1SYSMLname = signalSysMLname(sig1.getName()); + String sig2SYSMLname = signalSysMLname(sig2.getName()); + String message1SYSMLname = messageSysMLname(blk1,sig1.getName()); + String message2SYSMLname = messageSysMLname(blk2,sig2.getName()); + MethodInfo sig1Info = new MethodInfo(sig1SYSMLname, message1SYSMLname); // to collect info + MethodInfo sig2Info = new MethodInfo(sig2SYSMLname, message2SYSMLname); // to collect info + + // Channel declaration ......................... + + avsysml.append("\n" + indentation + "// Channel " + channelSYSMLname + "-------------\n"); + avsysml.append(indentation + "part " + channelSYSMLname + " : " + channelConstructor + " = " + + channelConstructor + "('@relation' = " + relationSYSMLname + ");\n"); + + // Binding block signals to the channel ................ + + if (out2in) { // depends on direction. symetric. + avsysml.append(indentation + "binding : '#OutSignalBinding' bind " + blk1SysMLname + "." + sig1SYSMLname + " = " + channelSYSMLname + + ";\n"); + avsysml.append(indentation + "binding : '#InSignalBinding' bind " + blk2SysMLname + "." + sig2SYSMLname + " = " + channelSYSMLname + + ";\n"); + } else { + avsysml.append(indentation + "binding : '#InSignalBinding' bind " + blk1SysMLname + "." + sig1SYSMLname + " = " + channelSYSMLname + ";\n"); + avsysml.append(indentation + "binding : '#OutSignalBinding' bind " + blk2SysMLname + "." + sig2SYSMLname + " = " + channelSYSMLname + ";\n"); + } + + // Message declarations ......................... + // one Message per direction, parallel build in two buffers msg1Buf and msg2Buf + + // put declaration headers + StringBuffer msg1Buf = new StringBuffer(indentation + "\n// Message of signal " + blk1SysMLname + "." + sig1SYSMLname + "............\n"); + StringBuffer msg2Buf = new StringBuffer(indentation + "\n// Message of signal " + blk2SysMLname + "." + sig2SYSMLname + "............\n"); + if (out2in) { + msg1Buf.append(indentation + "part def " + message1SYSMLname + " :> '#OutMessage', " + message2SYSMLname + " {\n"); + msg2Buf.append(indentation + "part def " + message2SYSMLname + " :> '#InMessage' {\n" + + indentation + indentStep + "private part '@channel' : '#Channel' = " + channelSYSMLname + ";\n"); + } else { + msg1Buf.append(indentation + "part def " + message1SYSMLname + " :> '#InMessage' {\n" + + indentation + indentStep + "private part '@channel' : '#Channel' = " + channelSYSMLname + ";\n"); + msg2Buf.append(indentation + "part def " + message2SYSMLname + " :> '#OutMessage', " + message1SYSMLname + " {\n"); + } + indent(1); + + // handle message fields. in-message fields redefine out-message fields + int nbFields = sig1.getListOfOriginalAttributes().size(); + // parameters for handling a field + AvatarType type; + String attributeType; // SysML name associated to type + String fieldName1; + String fieldName2; + int j=0; + while (j < nbFields ) { // browse channels' fielsd + AvatarAttribute aa1 = sig1.getListOfOriginalAttributes().get(j); + + // compute parameters for handling this field + + // compute field type parameters + AvatarDataType dataType = null; + if (aa1.isDataType()) { + dataType = aa1.getDataType(); + attributeType = dataTypeSysMLname(dataType.getName()) + ";\n"; + type = AvatarType.UNDEFINED; + } + else if (aa1.isBool()) { + attributeType = "Boolean;\n"; + type = AvatarType.BOOLEAN; + } + else if (aa1.isInt()) { + attributeType = "Integer;\n"; + type = AvatarType.INTEGER; + } else { attributeType = "Integer;\n"; type = AvatarType.INTEGER; } // TODO : error: SHOULD NOT BE TIMER + + // compute field names + fieldName1 = fieldSysMLname(aa1.getName()); + fieldName2 = fieldSysMLname(sig2.getListOfOriginalAttributes().get(j).getName()); + + // put field declaration + if (out2in) { // depends on direction. symetric. + msg1Buf.append(indentation + "attribute " + fieldName1 + " redefines " + fieldName2 + ";\n"); + msg2Buf.append(indentation + "attribute " + fieldName2 + " : " + attributeType); + } else { + msg1Buf.append(indentation + "attribute " + fieldName1 + " : " + attributeType); + msg2Buf.append(indentation + "attribute " + fieldName2 + " redefines " + fieldName1 + ";\n"); + } + + // collect info to be used later + sig1Info.addField(fieldName1, type, dataType); + sig2Info.addField(fieldName2, type, dataType); + + j++; + } + unindent(1); + msg1Buf.append(indentation + "}\n"); + msg2Buf.append(indentation + "}\n"); + + // put declarations to avsysml + if (out2in) { // order only relevant for the aesthetics + avsysml.append(msg2Buf); + avsysml.append(msg1Buf); + } else { + avsysml.append(msg1Buf); + avsysml.append(msg2Buf); + } + + // memorize collected info + methodMap.put(sig1,sig1Info); + methodMap.put(sig2,sig2Info); + } + } + } + /** generates SysML declarations for block methods. + * To be called while generating block declarations. Directly put generated text in avsysml. + */ + private void method2SysML(AvatarMethod am){ + + MethodInfo methodInfo; // to collect info + + // compute return type (null for void methods).................... + + String returnType; // SysML name of return type, or null + List<AvatarAttribute> returns = am.getListOfOriginalReturnAttributes(); // size must be <= 1 + if(returns.size() == 0) { // void method + returnType = null; + methodInfo = new MethodInfo(methodSysMLname(am.getName())); + } + else { + if (returns.get(0).isDataType()) { + AvatarDataType returnDataType = returns.get(0).getDataType(); + returnType = dataTypeSysMLname(returns.get(0).getDataType().getName()); + methodInfo = new MethodInfo(methodSysMLname(am.getName()), AvatarType.UNDEFINED, returnDataType); + + } + else if (returns.get(0).isBool()) { + returnType = "Boolean"; + methodInfo = new MethodInfo(methodSysMLname(am.getName()), AvatarType.BOOLEAN, null); + } else if (returns.get(0).isInt()) { + returnType = "Integer"; + methodInfo = new MethodInfo(methodSysMLname(am.getName()), AvatarType.INTEGER, null); + } else { // ERROR : TIMER, should not happen + returnType = "Integer"; + methodInfo = new MethodInfo(methodSysMLname(am.getName()), AvatarType.INTEGER, null); + } + } + + // put header (different for void and non-void methods)..................... + + if (returnType == null) + avsysml.append(indentation + "action " + methodSysMLname(am.getName()) + ": '#AvatarVoidMethod'"); + else + avsysml.append(indentation + "calc " + methodSysMLname(am.getName()) + ": '#AvatarCalcMethod'"); + + // put parameters and return type as fields ....................... + // collect corresponding info + + int nbFields = am.getListOfOriginalAttributes().size(); + if (nbFields == 0 && returnType == null) + avsysml.append(";\n"); + else { + avsysml.append(" {\n"); + indent(1); + + int j = 0; + // iterate on method parameters, put corresponding fields + while (j < nbFields) { + AvatarAttribute aa = am.getListOfOriginalAttributes().get(j); + if (aa.isDataType()) { + avsysml.append(indentation + "attribute " + fieldSysMLname(aa.getName()) + + " : " + dataTypeSysMLname(aa.getDataType().getName()) + ";\n"); + methodInfo.addField(fieldSysMLname(aa.getName()), AvatarType.UNDEFINED, aa.getDataType()); + } else if (aa.isInt()) { + avsysml.append(indentation + "attribute " + fieldSysMLname(aa.getName()) + " : Integer;\n"); + methodInfo.addField(fieldSysMLname(aa.getName()), AvatarType.INTEGER, null); + } else if (aa.isBool()) { + avsysml.append(indentation + "attribute " + fieldSysMLname(aa.getName()) + " : Boolean;\n"); + methodInfo.addField(fieldSysMLname(aa.getName()), AvatarType.BOOLEAN, null); + } else { // ERROR should not happen + avsysml.append(indentation + "attribute " + fieldSysMLname(aa.getName()) + " : Integer;\n"); + methodInfo.addField(fieldSysMLname(aa.getName()), AvatarType.INTEGER, null); + } + j++; + } + // put return field for non-void methods + if (returnType != null) + avsysml.append(indentation + "return : " + returnType + ";\n"); + + unindent(1); + avsysml.append(indentation + "}\n"); + } + methodMap.put(am, methodInfo); // memorize collected info + } + + /** generates SysML declarations for block signals. + * To be called while generating block declarations. Directly put generated text in avsysml. Signals used in AvatarQueryOnSignal elements must + * be typed as fifos (other ones are not constrained). Thus, fifoSet must have been computed before calling this method. + */ + private void signal2SysML(AvatarSignal as){ + avsysml.append(indentation + "part " + methodMap.get(as).getName() + " : " + + (fifoSet.contains(as) ? "'#Fifo'" : "'#Channel'") + ";\n"); + } + + /** generates SysML declarations for all blocks: iterate on specification block list */ + private void blocks2SysML(){ + avsysml.append("\n" + indentation + "// BLOCKS $$$$$$$$$$$$$$$$$$$$$$$$\n"); + for(AvatarBlock block: avspec.getListOfBlocks()) + if (block.getFather() == null) block2SysML(block); + } + + /** generates SysML declarations for a blocks and direct access to inner blocks through their name (not their full path) */ + private void block2SysML(AvatarBlock block){ + String blockSYSMLname = blockSysMLname(block.getName()); + // to memorize timers while iterating on attributes (delayed declarations) + ArrayList<AvatarAttribute> timerList = new ArrayList<AvatarAttribute>(); + chainBlock(blockSYSMLname); + blocklink(); // to directly access inner blocks through their (short) name + + // put block header -------------------- + avsysml.append("\n" + indentation + "// Block " + blockSYSMLname + "=============\n"); + avsysml.append(indentation + "part " + blockSYSMLname + " : '#AvatarBlock' {\n"); + indent(1); + + // put attribute declarations ---------------------------- + // no default value in SysML, thus default values are set explicitly + // timer attributes are memorized to be declared later + + if (block.getAttributes() != null && block.getAttributes().size() != 0) { + avsysml.append("\n" + indentation + "// Attributes ---------------------\n"); + int j = 0; + int nbAttributes = block.getOriginalAttributes().size(); + while(j < nbAttributes) { // iterate on block's attributes + AvatarAttribute aa = block.getOriginalAttributes().get(j); + if (aa.isDataType()) { + avsysml.append(indentation + "attribute " + attributeSysMLname(aa.getName()) + + " : " + dataTypeSysMLname(aa.getDataType().getName()) + ";\n"); + } + else if (aa.isInt()) { + avsysml.append(indentation + "attribute " + attributeSysMLname(aa.getName()) + " : Integer"); + if (aa.hasInitialValue()) + avsysml.append(" := " + aa.getInitialValue().trim()); + else + avsysml.append(" default := " + AvatarType.INTEGER.getDefaultInitialValue().trim()); + avsysml.append(";\n"); + } + else if (aa.isBool()) { + avsysml.append(indentation + "attribute " + attributeSysMLname(aa.getName()) + " : Boolean"); + if (aa.hasInitialValue()) + avsysml.append(" := " + aa.getInitialValue().trim()); + else + avsysml.append(" default := " + AvatarType.BOOLEAN.getDefaultInitialValue().trim()); + avsysml.append(";\n"); + } + else if (aa.isTimer()) { + timerList.add(aa); + } else {} // TODO : should not happen. to remove if not possible + j++; + } + } + + // put constant declarations -------------------- + if (block.getConstants() != null && block.getConstants().size() != 0) { + avsysml.append("\n" + indentation + "// Constants ---------------------\n"); + int j = 0; + int nbConstants = block.getConstants().size(); + while(j < nbConstants) { // iterate on block's constants + AvatarAttribute aa = block.getOriginalAttributes().get(j); + if (aa.isDataType()) { + avsysml.append(indentation + "readolny attribute " + attributeSysMLname(aa.getName()) + + " : " + dataTypeSysMLname(aa.getDataType().getName()) + ";\n"); + } + else if (aa.isInt()) { + avsysml.append(indentation + "readolny attribute " + attributeSysMLname(aa.getName()) + " : Integer"); + if (aa.hasInitialValue()) + avsysml.append(" := " + aa.getInitialValue().trim()); + else + avsysml.append(" default := " + AvatarType.INTEGER.getDefaultInitialValue().trim()); + avsysml.append(";\n"); + } + else if (aa.isBool()) { + avsysml.append(indentation + "readolny attribute " + attributeSysMLname(aa.getName()) + " : Boolean"); + if (aa.hasInitialValue()) + avsysml.append(" := " + aa.getInitialValue().trim()); + else + avsysml.append(" default := " + AvatarType.BOOLEAN.getDefaultInitialValue().trim()); + avsysml.append(";\n"); + } + else {} // TODO ? error should not happen (timers arn't constants...) + j++; + } + } + + // put method declarations -------------------- + if (block.getMethods() != null && block.getMethods().size() != 0) { + avsysml.append("\n" + indentation + "// Methods ---------------------\n"); + for (AvatarMethod am : block.getMethods()) method2SysML(am); + } + + // put signal declarations -------------------- + if (block.getSignals() != null && block.getSignals().size() != 0) { + avsysml.append("\n" + indentation + "// Signals ---------------------\n"); + for (AvatarSignal as : block.getSignals()) signal2SysML(as); + } + + // put timer declarations ------------------- + if (timerList != null && timerList.size() != 0) { + avsysml.append("\n" + indentation + "// Timers ---------------------\n"); + for (AvatarAttribute timer : timerList) + avsysml.append(indentation + "part " + timerBlockSysMLname(timer.getName()) + ": '#AvatarTimer' = '#AvatarTimer'();\n"); + } + + // put state-machine description -------------------- + avsysml.append("\n" + indentation + "// state-machine -------------------\n"); + statemachine2SysML(block.getStateMachine()); + + // sub-blocks ------------------- + List<AvatarBlock> subBlockList = new ArrayList<AvatarBlock>(); + for(AvatarBlock blk: avspec.getListOfBlocks()) { if (blk.getFather() == block) subBlockList.add(blk); } + if (subBlockList.size() != 0) { + avsysml.append("\n" + indentation + "// Sub-Blocks øøøøøøøøøøøøøøøøøøøøøøø\n"); + for (AvatarBlock blk : subBlockList) block2SysML(blk); + } + + unindent(1); + avsysml.append(indentation + "}\n"); + unchainBlock(); + } + + + /** generates state information for each state machine element of the specification and technically + * added states (before some communication elements). Put this information in a map which is returned. + */ + private HashMap<AvatarStateMachineElement, StateInfo> computeStateInfo(AvatarStateMachine asm) { + + // the map to fill and return + HashMap<AvatarStateMachineElement, StateInfo> stateMap = new HashMap<AvatarStateMachineElement, StateInfo>(); + + // associate names to future SysML states......................... + + // number to identify states in an unambigous way + int randomNumber = 0; + int countNumber = 0; + int sendNumber = 0; + int receiveNumber = 0; + int setNumber = 0; + int resetNumber = 0; + int expireNumber = 0; + + // produces and memorize stateinfo structure (couple name, prename) for all state machine element + for (AvatarStateMachineElement asme : asm.getListOfElements()) { + StateInfo stateinfo; + // states without communication hav just a name. + if (asme instanceof AvatarStartState) + stateinfo = new StateInfo(startStateSysMLname()); + else if (asme instanceof AvatarStopState) + stateinfo = new StateInfo(stopStateSysMLname()); + else if (asme instanceof AvatarState) + stateinfo = new StateInfo(standardStateSysMLname(asme.getName())); + else if (asme instanceof AvatarQueryOnSignal) + stateinfo = new StateInfo(countStateSysMLname(((AvatarQueryOnSignal) asme).getSignal().getName(), countNumber++)); + else if (asme instanceof AvatarRandom) + stateinfo = new StateInfo(randomStateSysMLname(randomNumber++)); + // next cases rely on communication and thus, are subject to the introduction of an additional "preceding" state. + else if (asme instanceof AvatarActionOnSignal) { + if (((AvatarActionOnSignal) asme).isSending()) + stateinfo = new StateInfo( + sendStateSysMLname(((AvatarActionOnSignal) asme).getSignal().getName(), sendNumber), + presendStateSysMLname(((AvatarActionOnSignal) asme).getSignal().getName(), sendNumber++)); + else + stateinfo = new StateInfo(receiveStateSysMLname(((AvatarActionOnSignal) asme).getSignal().getName(), receiveNumber), + prereceiveStateSysMLname(((AvatarActionOnSignal) asme).getSignal().getName(), receiveNumber++)); + } else if (asme instanceof AvatarSetTimer) { + stateinfo = new StateInfo(setTimerStateSysMLname(((AvatarTimerOperator) asme).getTimer().getName(), setNumber), + presetTimerStateSysMLname(((AvatarTimerOperator) asme).getTimer().getName(), setNumber++)); + } else if (asme instanceof AvatarResetTimer) { + stateinfo = new StateInfo(resetTimerStateSysMLname(((AvatarTimerOperator) asme).getTimer().getName(), resetNumber), + preresetTimerStateSysMLname(((AvatarTimerOperator) asme).getTimer().getName(), resetNumber++)); + } else if (asme instanceof AvatarExpireTimer) { + stateinfo = new StateInfo(expireTimerStateSysMLname(((AvatarTimerOperator) asme).getTimer().getName(), expireNumber), + preexpireTimerStateSysMLname(((AvatarTimerOperator) asme).getTimer().getName(), expireNumber++)); + + } else continue; // TODO ? curious states "AvatarEmpty" not handled + stateMap.put(asme, stateinfo); + } + return stateMap; + } + + /** generates SysML description of state machine */ + private void statemachine2SysML(AvatarStateMachine asm) { + HashMap<AvatarStateMachineElement, StateInfo> stateMap = computeStateInfo(asm); + + // put state-machine header to avsysml............................. + avsysml.append(indentation + "exhibit state '@statemachine' : '#AvatarStateMachine' {\n"); + indent(1); + + // put SysML states descriptions with associated transition descriptions......... + stateMap.forEach(new State2SysML(stateMap)); + + unindent(1); + avsysml.append(indentation + "}\n"); + } + + /** buffer to build SysML declarations of outgoing transitions from one state(filled by method transitionsAndRequests) */ + private StringBuffer sysMLtransitions = new StringBuffer(); + /** buffer to build in-a-state requests associated to the outgoing transitions of this state (filled by method transitionsAndRequests) */ + private StringBuffer sysMLrequests = new StringBuffer(); + /** communication (and timer) states that require an added state before (as they have incomming transitions with action, from the currently + * handled state) (filled by method transitionsAndRequests) */ + private List<AvatarStateMachineElement> requirePreCom = new ArrayList<AvatarStateMachineElement>(); + + /** to iterate on the state machine elements of one block. An iteration puts a state declaration in avsysml, followed by the declarations of + * its outgoing transitions. If the needed technically added pre-communication are detected while handling these transitions. The declarations + * of these added states are added after the transition declarations, followed by their own single outgoing transition. + */ + private class State2SysML implements BiConsumer<AvatarStateMachineElement, StateInfo> { + /** provides all states with name information */ + HashMap<AvatarStateMachineElement, StateInfo> stateMap; + + /** false untill stopState has been encountered (as it can be encountered several times but generated only once) */ + Boolean stopStateDone; + + public State2SysML(HashMap<AvatarStateMachineElement, StateInfo> _stateMap) { + stateMap = _stateMap; + stopStateDone = false; + } + + /** puts a state declaration in avsysml, followed by the declarations of + * its outgoing transitions. If the needed technically added pre-communication are detected while handling these transitions. The declarations + * of these added states are added after the transition declarations, followed by their own single outgoing transition. + */ + public void accept(AvatarStateMachineElement asme, StateInfo info) { + // compute transition declarations and request descriptions for the outgoing transitions of the state + // identify states that require an added pre-communication state + indent(1); + transitionsAndRequests(info.getName(), asme.getNexts(), ((asme instanceof AvatarState) ? "'@pool'" : "'@request'"), stateMap); + unindent(1); + + String requests = sysMLrequests.toString(); // to put after state declaration + + // put state Descriptions ................................ + // depending on state type + + if(asme instanceof AvatarState){ + avsysml.append("\n" + indentation + "state " + info.getName() + " : '#AvatarStandardState'"); + if (requests.equals("")) + avsysml.append(";\n"); + else + avsysml.append(" = '#AvatarStandardState'(\n" + requests + "\n" + indentation + ");\n"); + } else + + if(asme instanceof AvatarRandom){ // specific: assign a random value to a variable + avsysml.append("\n" + indentation + "state " + info.getName() + " : '#AvatarRandomState' = '#AvatarRandomState'(\n"); + if (!requests.equals("")) avsysml.append(requests + ",\n"); // put request description (none means default request) + indent(1); + avsysml.append(indentation + "'@state_action' = '#Assignment'(\n"); + indent(1); + // the variable to be assigned + avsysml.append(indentation + "'@target' = " + attributeSysMLname(((AvatarRandom)asme).getVariable()) + ",\n"); + // the random value to assign + avsysml.append(indentation + "'@value' = '#bound_random'(" + + expr2SysML(((AvatarRandom)asme).getMinValue().replaceAll("__",".")) + ", " + + expr2SysML(((AvatarRandom)asme).getMaxValue().replaceAll("__",".")) +")\n"); + unindent(1); + avsysml.append(indentation + ")\n"); + unindent(1); + avsysml.append(indentation + ");\n"); + } else + + if(asme instanceof AvatarQueryOnSignal){ // specific: assign the content size of a signal to a variable + avsysml.append("\n" + indentation + "state " + info.getName() + " : '#AvatarCountState' = '#AvatarCountState'(\n"); + if (!requests.equals("")) avsysml.append(requests + ",\n"); // put request description (none means default request) + indent(1); + avsysml.append(indentation + "'@state_action' = '#Assignment'(\n"); + indent(1); + // the variable to assign + avsysml.append(indentation + "'@target' = " + attributeSysMLname(((AvatarQueryOnSignal)asme).getAttribute().getName()) + ",\n"); + // the size of the content of the concerned signal + avsysml.append(indentation + "'@value' = " + methodMap.get(((AvatarQueryOnSignal)asme).getSignal()).getName() + ".'@amount'()\n"); + unindent(1); + avsysml.append(indentation + ")\n"); + unindent(1); + avsysml.append(indentation + ");\n"); + } else + + if(asme instanceof AvatarActionOnSignal){ + if(((AvatarActionOnSignal)asme).isSending()) { + avsysml.append("\n" + indentation + "state " + info.getName() + " : '#AvatarSendState'"); + if (requests.equals("")) // default request + avsysml.append(";\n"); + else // put requests description + avsysml.append(" = '#AvatarSendState'(\n" + requests + "\n" + indentation + ");\n"); + } else { + avsysml.append("\n" + indentation + "state " + info.getName() + " : '#AvatarReceiveState'"); + if (requests.equals("")) // default request + avsysml.append(";\n"); + else + avsysml.append(" = '#AvatarReceiveState'(\n" + requests + "\n" + indentation + ");\n"); + } + } else + + if(asme instanceof AvatarStartState){ + avsysml.append("\n" + indentation + "entry action " + info.getName() + " :'#AvatarStartState'"); + if (requests.equals("")) // default request + avsysml.append(";\n"); + else // put requests description + avsysml.append(" = '#AvatarStartState'(\n" + requests + "\n" + indentation + ");\n"); + } else + + if(asme instanceof AvatarStopState){ // specific mandatory empty request list (implicite) + if(!stopStateDone) + avsysml.append("\n" + indentation + "exit action " + info.getName() + " :'#AvatarStopState';\n"); + stopStateDone = true; + } else + + if(asme instanceof AvatarSetTimer){ + avsysml.append("\n" + indentation + "state " + info.getName() + " : '#AvatarSetTimerState'"); + if (requests.equals("")) // default request + avsysml.append(";\n"); + else // put requests description + avsysml.append(" = '#AvatarSetTimerState'(\n" + requests + "\n" + indentation + ");\n"); + } else + + if(asme instanceof AvatarResetTimer){ + avsysml.append("\n" + indentation + "state " + info.getName() + " : '#AvatarResetTimerState'"); + if (requests.equals("")) // default request + avsysml.append(";\n"); + else // put requests description + avsysml.append(" = '#AvatarResetTimerState'(\n" + requests + "\n" + indentation + ");\n"); + } else + + if(asme instanceof AvatarExpireTimer){ + avsysml.append("\n" + indentation + "state " + info.getName() + " : '#AvatarExpireTimerState'"); + if (requests.equals("")) // default request + avsysml.append(";\n"); + else // put requests description + avsysml.append(" = '#AvatarExpireTimerState'(\n" + requests + "\n" + indentation + ");\n"); + } + + // put transition declarations ................................................. + avsysml.append(sysMLtransitions); + + // put pre-communication states to add and their single outgoing transition + for (AvatarStateMachineElement aos: requirePreCom) { + // the name of an added states is obtained by StateInfo.getPreName() + // the target of its outgoing transition is the communication state itself (StateInfo.getName()) + // endTransition adds distribution law information at the end of the transition declarations + StateInfo stateinfo = stateMap.get(aos); + if (aos instanceof AvatarActionOnSignal) { + MethodInfo signalinfo = methodMap.get(((AvatarActionOnSignal)aos).getSignal()); + + if (((AvatarActionOnSignal)aos).isSending()) { + // put pre-communication State + avsysml.append("\n" + indentation + "state " + stateinfo.getPreName() + " : '#AvatarPreSendState' = '#AvatarPreSendState' (\n"); + indent(1); + avsysml.append(indentation + "'@request' = {\n"); + indent(1); + // sending request from pre-send state to send state + avsysml.append(sendRequest2SysML(1, "0", "0", signalinfo, ((AvatarActionOnSignal)aos).getOriginalValues()) + "\n"); + unindent(1); + avsysml.append(indentation + "}\n"); + unindent(1); + avsysml.append(indentation + ");\n"); + // transition from pre-send state to send state + avsysml.append("\n" + indentation + "transition : '#AvatarTransition' first " + stateinfo.getPreName() + + " then " + stateinfo.getName() + + endTransition(0,"","", 1)); + } else { + // put pre-communication State + avsysml.append("\n" + indentation + "state " + stateinfo.getPreName() + " : '#AvatarPreReceiveState' = '#AvatarPreReceiveState' (\n"); + indent(1); + avsysml.append(indentation + "'@request' = {\n"); + indent(1); + // receiving request from pre-receive state to receive state + avsysml.append(receiveRequest2SysML(1, "0", "0", signalinfo.getName()) + "\n"); + unindent(1); + avsysml.append(indentation + "}\n"); + unindent(1); + avsysml.append(indentation + ");\n"); + // transition from pre-receive state to receive state + avsysml.append("\n" + indentation + "transition : '#AvatarTransition' first " + stateinfo.getPreName() + "\n"); + indent(1); + // updating target variables with received values + String doAction = receiveActions2SysML(signalinfo, ((AvatarActionOnSignal)aos).getOriginalValues()); + if (doAction.length() == 0) // receive simple signal (without carried value) + avsysml.append(indentation + "then " + stateinfo.getName() + + endTransition(0,"","", 1)); + else { // put updating action + avsysml.append(doAction); + avsysml.append(" then " + stateinfo.getName() + + endTransition(0,"","", 1)); + } + unindent(1); + } + } else if (aos instanceof AvatarSetTimer) { // a special kind of send request + // put pre-communication State + avsysml.append("\n" + indentation + "state " + stateinfo.getPreName() + " : '#AvatarPreSendState' = '#AvatarPreSendState' (\n"); + indent(1); + avsysml.append(indentation + "'@request' =\n"); + indent(1); + // put the specific sending request, carrying a value + avsysml.append(setTimerRequest2SysML(1, "0", "0", + timerBlockSysMLname(((AvatarSetTimer) aos).getTimer().getName()) , + ((AvatarSetTimer)aos).getTimerValue()) + "\n"); + unindent(2); + avsysml.append(indentation + ");\n"); + // put the associated transition + avsysml.append("\n" + indentation + "transition : '#AvatarTransition' first " + stateinfo.getPreName() + + " then " + stateinfo.getName() + + endTransition(0,"","", 1)); + + } else if (aos instanceof AvatarResetTimer) { // a special kind of send request + // put pre-communication State + avsysml.append("\n" + indentation + "state " + stateinfo.getPreName() + " : '#AvatarPreSendState' = '#AvatarPreSendState' (\n"); + indent(1); + avsysml.append(indentation + "'@request' =\n"); + indent(1); + // put the specific sending request, carrying no value + avsysml.append(resetTimerRequest2SysML(1, "0", "0", + timerBlockSysMLname(((AvatarResetTimer) aos).getTimer().getName())) + "\n"); + unindent(2); + avsysml.append(indentation + ");\n"); + // put the associated transition + avsysml.append("\n" + indentation + "transition : '#AvatarTransition' first " + stateinfo.getPreName() + + " then " + stateinfo.getName() + + endTransition(0,"","", 1)); + + } else if (aos instanceof AvatarExpireTimer) { // a special kind of send request + // put pre-communication State + avsysml.append("\n" + indentation + "state " + stateinfo.getPreName() + " : '#AvatarPreReceiveState' = '#AvatarPreReceiveState' (\n"); + indent(1); + avsysml.append(indentation + "'@request' =\n"); + indent(1); + // put the specific receiving request, carrying no value + avsysml.append(expireTimerRequest2SysML(1, "0", "0", + timerBlockSysMLname(((AvatarExpireTimer) aos).getTimer().getName())) + "\n"); + unindent(2); + avsysml.append(indentation + ");\n"); + // put the associated transition + avsysml.append("\n" + indentation + "transition : '#AvatarTransition' first " + stateinfo.getPreName() + + endTransition(0,"","", 1)); + indent(1); + avsysml.append(indentation + "then " + stateinfo.getName() + ";\n"); + unindent(1); + } + } + + } + } + + /** distribution law information, to put at the end of associated the transition declarations */ + private String endTransition(int delayDistributionLaw, String delayExtra1, String delayExtra2, double probability){ + + if (delayDistributionLaw == DELAY_UNIFORM_LAW && probability == 1) return ";\n"; // nothing because default + + StringBuffer result = new StringBuffer(" {\n"); + indent(1); + + // put distribution law + result.append(indentation + "attribute '@delayDistributionLaw' : String = \"" + DISTRIBUTION_LAWS[delayDistributionLaw] + "\";\n"); + + // put distribution law first parameter (if exists) + if (NB_OF_EXTRA_ATTRIBUTES[delayDistributionLaw] > 0) + result.append(indentation + "attribute '" + LABELS_OF_EXTRA_ATTRIBUTES_1[delayDistributionLaw] + "' : String = \"" + + delayExtra1 + "\";\n"); + + // put distribution law second parameter (if exists) + if (NB_OF_EXTRA_ATTRIBUTES[delayDistributionLaw] > 1) + result.append(indentation + "attribute '" + LABELS_OF_EXTRA_ATTRIBUTES_2[delayDistributionLaw] + "' : String = \"" + + delayExtra2 + "\";\n"); + + // put probability (if different from the default one) + if (probability != DEFAULT_PROBABILITY) + result.append(indentation + "attribute '@weight' : Real = " + probability + ";\n"); + + unindent(1); + result.append(indentation + "}\n"); + return result.toString(); + } + + /** computes transition declarations and request descriptions for the outgoing transitions of the state. Put the corresponding + * texts in the sysMLtransitions and sysMLrequests StringBuffers. While doing this, identify communication states that require + * an added pre-communication state. + * @param srcName name of the source state + * @param nexts outgoing transitions from the source state + * @param poolName "pool" or "request" depending on the number of allowed outgoing transitions + * @param stateMap to find state names + */ + private void transitionsAndRequests(String srcName, List<AvatarStateMachineElement> nexts, String poolName, + HashMap<AvatarStateMachineElement, StateInfo> stateMap) { + // initialization + requirePreCom.clear(); + sysMLtransitions.delete(0, sysMLtransitions.length()); + sysMLrequests.delete(0, sysMLrequests.length()); + + int nb = nexts.size(); + if (nb == 0) { // no transition + sysMLrequests.append(indentation + poolName + " = { null }\n"); + return; + } + if (nb == 1) { // no parenthesis required + indent(1); + // handle the single transition + transitionAndRequest(srcName, (AvatarTransition)nexts.get(0), 0, stateMap); + unindent(1); + + if(sysMLrequests.toString().trim().equals("'#immediate_request'")) { // remove because it is the default + sysMLrequests.delete(0, sysMLrequests.length()); + return; + } + // wrap without parenthesis + sysMLrequests.insert(0, indentation + poolName + " = {\n"); + sysMLrequests.append("\n" + indentation + "}"); + return; + } + // more than one request -> list between parenthesis + indent(1); + // put list + for(int i=0; i<nb; i++){ + transitionAndRequest(srcName, (AvatarTransition)nexts.get(i), i+1, stateMap); + if(i != nb-1) + sysMLrequests.append(",\n"); + else + sysMLrequests.append("\n"); + } + unindent(1); + // wrap with parenthesis + sysMLrequests.insert(0, indentation + poolName + " = {(\n"); + sysMLrequests.append(indentation + ")}"); + } + + /** remove wrapping brackets of a guard (if exist)*/ + private String clean_guard(String _guard) { + int open = _guard.indexOf('['); + int close = _guard.lastIndexOf(']'); + if (open != -1 && close != -1 && close > open) + return _guard.substring(open+1, close); + else return _guard; + } + + /** add a transition declaration in sysMLtransitions and the associated request description in sysMLrequests. Ii the the + * transition has actions and the transition's target is a communication, then this target is identified as requiring an + * added pre-communication state (added to requirePreCom). In the produced SysML model, transitions are ordered with indexes + * beginning at 1. + * + * @param srcName source of the transition + * @param at the transition to handle + * @param index index of the transition, or 0 if transition is alone (real index is 1) + * @param stateMap to make state names available + */ + private void transitionAndRequest(String srcName, AvatarTransition at, int index, HashMap<AvatarStateMachineElement, StateInfo> stateMap){ + int transindex = ((index == 0) ? 1 : index); // true index + + // identify cases and instantiate case specific parameters for the parametrized handling that follows ................ + + // declare parameters + boolean guarded = !at.hasNonDeterministicGuard(); + AvatarStateMachineElement target = at.getNext(0); + String tgtName; // SysML name of transition's target (in SysML model, may differ from Avatar model, due to added states) + int requestType = 0; // 0:trivial, 1:Send, 2:Receive, 3:SetTimer, 4: ResetTimer, 5:ExpireTimer + + // computes parameters + if((at.getActions()!=null && at.getActions().size()!=0) && + (target instanceof AvatarActionOnSignal || target instanceof AvatarTimerOperator)) { + // added pre-communication state required before target (in avatar) which is communication. Type: trivial. + requirePreCom.add(target); + tgtName = stateMap.get(target).getPreName(); // transition's target is the added state + } + else { + tgtName = stateMap.get(target).getName(); // transition's target is the same as in Avatar + + if(target instanceof AvatarActionOnSignal){ // communication + if (((AvatarActionOnSignal)target).isSending()) + requestType = 1; // Send + else + requestType = 2; // Receive + } + else if (target instanceof AvatarSetTimer) + requestType = 3; // SetTimer + else if (target instanceof AvatarResetTimer) + requestType = 4; // ResetTimer + else if (target instanceof AvatarExpireTimer) + requestType = 5; // ExpireTimer + } + + // put transition's request respecting parameters..................................... + + if (guarded) { + sysMLrequests.append(indentation + "if " + + expr2SysML(clean_guard((at).getOriginalGuard())) + " ?\n"); + indent(1); + } + // delay don't depend on parameters + String minDelay = ( at.getOriginalMinDelay().length()==0 ? "0" : expr2SysML(at.getOriginalMinDelay()) ); + String maxDelay = ( at.getOriginalMaxDelay().length()==0 ? "0" : expr2SysML(at.getOriginalMaxDelay()) ); + + // call the type specific compute-request method and put request + if(requestType == 0) // Trivial + sysMLrequests.append(trivialRequest2SysML(transindex, + minDelay, + maxDelay)); + else if (requestType == 1) // Send + sysMLrequests.append(sendRequest2SysML(transindex, + minDelay, + maxDelay, + methodMap.get(((AvatarActionOnSignal)target).getSignal()), + ((AvatarActionOnSignal)target).getOriginalValues())); + else if (requestType == 2) // Receive + sysMLrequests.append(receiveRequest2SysML(transindex, + minDelay, + maxDelay, + methodMap.get(((AvatarActionOnSignal)target).getSignal()).getName())); + else if (requestType == 3) // Set + sysMLrequests.append(setTimerRequest2SysML(transindex, + minDelay, + maxDelay, + timerBlockSysMLname(((AvatarTimerOperator) target).getTimer().getName()), + ((AvatarSetTimer) target).getTimerValue())); + else if (requestType == 4) // Reset + sysMLrequests.append(resetTimerRequest2SysML(transindex, + minDelay, + maxDelay, + timerBlockSysMLname(((AvatarTimerOperator) target).getTimer().getName()))); + else // Expire + sysMLrequests.append(expireTimerRequest2SysML(transindex, + minDelay, + maxDelay, + timerBlockSysMLname(((AvatarTimerOperator) target).getTimer().getName()))); + + if(guarded) { + unindent(1); + sysMLrequests.append("\n" + indentation + "else '#nok_request'(" + transindex + ")"); + } + + // put transition's declaration ........................................ + + unindent(2); // to reach indent level of request declaration + + // compute transition'actions + String doAction; // the SysML action part of the transition + indent(1); + if(requestType == 2) // compute receive specific actions (variable update). No other transition actions thanks to added states. + doAction = receiveActions2SysML(methodMap.get(((AvatarActionOnSignal)target).getSignal()), + ((AvatarActionOnSignal)target).getOriginalValues()); + else // computes actions from the Avatar transition's action list + doAction = transitionActions2SysML(at); + unindent(1); + + // put transition declaration + // header + sysMLtransitions.append("\n" + indentation + "transition : '#AvatarTransition' first " + srcName); + // index + if(index > 0) // not default thus explicit index + sysMLtransitions.append(" if '@index' == " + index + "\n"); + else // default thus implicit index + sysMLtransitions.append("\n"); + // actions + indent(1); + if (doAction == null || doAction.length() == 0) // no action, put target and distribution law information + sysMLtransitions.append(indentation + "then " + tgtName + + endTransition(at.getDelayDistributionLaw(), at.getDelayExtra1(), at.getDelayExtra2(), at.getProbability())); + else { // put actions, target and distribution law information + sysMLtransitions.append(doAction); + sysMLtransitions.append(" then " + tgtName + + endTransition(at.getDelayDistributionLaw(),at.getDelayExtra1(),at.getDelayExtra2(), at.getProbability())); + } + indent(1); + } + + /** computes request to non-communication state + * + * @param index request index + * @param min minimal delay. not null and not empty (must be set to "0" in these cases) + * @param max maximal delay. not null and not empty (must be set to "0" in these cases) + * @return text of the relevant SysML call to the relevant SysML constructor + */ + private String trivialRequest2SysML(int index, String min, String max) { + if (max.equals("0")) // no delay or simple delay + if (min.equals("0")) // no delay + if (index == 1) // default thus implicit + return indentation + "'#immediate_request'"; + else // explicit + return indentation + "'#TrivialRequest'('@index' = " + index + ")"; + else // simple delay + if (index == 1) // default thus implicit + return indentation + "'#TrivialRequest'('@delay' = " + min + ")"; + else // explicit + return indentation + "'#TrivialRequest'('@index' = " + index + ", '@delay' = " + min + ")"; + else if (max.trim().equals(min.trim())) // simple delay (equal bounds) + if(index == 1) // default thus implicit + return indentation + "'#TrivialRequest'('@delay' = " + min + ")"; + else // explicit + return indentation + "'#TrivialRequest'('@index' = " + index + ", '@delay' = " + min + ")"; + else // range delay + if(index == 1) // default thus implicit + return indentation + "'#TrivialRequest'('@delay' = '#bound_random'(" + min + ", " + max + "))"; + else // explicit + return indentation + "'#TrivialRequest'('@index' = " + index + ", '@delay' = '#bound_random'(" + min + ", " + max + "))"; + } + + /** computes request to send state + * + * @param index request index + * @param min minimal delay. not null and not empty (must be set to "0" in these cases) + * @param max maximal delay. not null and not empty (must be set to "0" in these cases) + * @param signalInfo name and profile information about the concerned signal + * @param values strings denoting send parameter values + * @return text of the relevant SysML call to the relevant SysML constructor + */ + private String sendRequest2SysML(int index, String min, String max, MethodInfo signalInfo, List<String> values) { + // request Header (SysML constructor) + StringBuffer result = new StringBuffer(indentation + "'#SendRequest'(\n"); + indent(1); + + // index + if (index != 1) // not default thus explicit + result.append(indentation + "'@index' = " + index + ",\n"); + + // signal (equivalent to channel in SysML) + result.append(indentation + "'@channel'= " + signalInfo.getName() + ",\n"); + + // delay + if (max.equals("0")) { // no delay or simple delay + if (!min.equals("0")) // simple delay + result.append(indentation + "'@delay' = " + min + ",\n"); + } + else if (max.trim().equals(min.trim())) // simple delay (equal bounds) + result.append(indentation + "'@delay' = " + min + ",\n"); + else // range delay + result.append(indentation + "'@delay' = '#bound_random'(" + min + ", " + max + "),\n"); + + // payload + int nbFields = signalInfo.getArity(); + if (nbFields == 0) // simple SysML constructor call + result.append(indentation + "'@payload' = " + signalInfo.getMessageType() + "()\n"); + else { // SysML constructor call with parameters + result.append(indentation + "'@payload' = " + signalInfo.getMessageType() + "(\n"); + indent(1); + int j = 0; + while (j < nbFields) { // iterate on parameters + result.append(indentation + expr2SysML(values.get(j)) + ",\n"); + j++; + } + result.replace(result.length()-2, result.length(), " )\n"); + unindent(1); + } + + unindent(1); + result.append(indentation + ")"); + return result.toString(); + } + + + /** computes request to set-timer state + * + * @param index request index + * @param min minimal delay. not null and not empty (must be set to "0" in these cases) + * @param max maximal delay. not null and not empty (must be set to "0" in these cases) + * @param timer name of the concerned timer + * @param value string denoting the duration until timer expiration (countdown) + * @return text of the relevant SysML call to the relevant SysML constructor + */ + private String setTimerRequest2SysML(int index, String min, String max, String timer, String value) { + // request Header (SysML constructor) + StringBuffer result = new StringBuffer(indentation + "'#AvatarSetTimerRequest'(\n"); + indent(1); + + // index + if (index != 1) // not default thus explicit + result.append(indentation + "'@index' = " + index + ",\n"); + + // setting a timer is sending a message on a dedicated "@set" channel of the timer block + result.append(indentation + "'@channel'= " + timer + ".'@set'" + ",\n"); + + // delay + if (max.equals("0")) { // no delay or simple delay + if (!min.equals("0")) // simple delay + result.append(indentation + "'@delay' = " + min + ",\n"); + } + else if (max.equals(min)) // simple delay (equal bounds) + result.append(indentation + "'@delay' = " + min + ",\n"); + else // range delay + result.append(indentation + "'@delay' = '#bound_random'(" + min + ", " + max + "),\n"); + + // payload + result.append(indentation + "'@payload' = '#TimerSetMsg'(" + value + ")\n"); + + unindent(1); + result.append(indentation + ")"); + return result.toString(); + } + + /** computes request to reset-timer state + * + * @param index request index + * @param min minimal delay. not null and not empty (must be set to "0" in these cases) + * @param max maximal delay. not null and not empty (must be set to "0" in these cases) + * @param timer name of the concerned timer + * @return text of the relevant SysML call to the relevant SysML constructor + */ + private String resetTimerRequest2SysML(int index, String min, String max, String timer) { + // request Header (SysML constructor) + StringBuffer result = new StringBuffer(indentation + "'#AvatarResetTimerRequest'(\n"); + indent(1); + + //index + if (index != 1) // not default thus explicit + result.append(indentation + "'@index' = " + index + ",\n"); + + // resetting a timer is sending a message on a dedicated "@reset" channel of the timer block + result.append(indentation + "'@channel'= " + timer + ".'@reset'" + ",\n"); + + // delay + if (max.equals("0")) { // no delay or simple delay + if (!min.equals("0")) // simple delay + result.append(indentation + "'@delay' = " + min + ",\n"); + } + else if (max.equals(min)) // simple delay (equal bounds) + result.append(indentation + "'@delay' = " + min + ",\n"); + else // range delay + result.append(indentation + "'@delay' = '#bound_random'(" + min + ", " + max + "),\n"); + + // payload (simple message without value) + result.append(indentation + "'@payload' = '#TimerResetMsg'()\n"); + + unindent(1); + result.append(indentation + ")"); + return result.toString(); + } + + /** computes request to send state + * + * @param index request index + * @param min minimal delay. not null and not empty (must be set to "0" in these cases) + * @param max maximal delay. not null and not empty (must be set to "0" in these cases) + * @param signalName name of the concerned signal + * @return text of the relevant SysML call to the relevant SysML constructor + */ + private String receiveRequest2SysML(int index, String min, String max, String signalName) { + // request Header (SysML constructor) + StringBuffer result = new StringBuffer(indentation + "'#ReceiveRequest'(\n"); + indent(1); + + // index + if (index != 1) // not default thus explicit + result.append(indentation + "'@index' = " + index + ",\n"); + + // signal (equivalent to channel in SysML) + result.append(indentation + "'@channel'= " + signalName); + + // delay + if (max.equals("0")) // no delay or simple delay + if (!min.equals("0")) // simple delay + result.append(",\n" + indentation + "'@delay' = " + min + "\n"); + else // no delay + result.append("\n"); + else if (max.equals(min)) // simple delay (equal bounds) + result.append(indentation + "'@delay' = " + min + ",\n"); + else // range delay + result.append(",\n" + indentation + "'@delay' = '#bound_random'(" + min + ", " + max + ")\n"); + + unindent(1); + result.append(indentation + ")"); + return result.toString(); + } + + private String expireTimerRequest2SysML(int index, String min, String max, String chname) { + // request Header (SysML constructor) + StringBuffer result = new StringBuffer(indentation + "'#AvatarExpireTimerRequest'(\n"); + indent(1); + + // index + if (index != 1) // not default thus explicit + result.append(indentation + "'@index' = " + index + ",\n"); + + // timer expiration is detected by receiving a message on a dedicated "@expire" channel of the timer block + result.append(indentation + "'@channel'= " + chname + ".'@expire'"); + + // delay + if (max.equals("0")) // no delay or simple delay + if (!min.equals("0")) // simple delay + result.append(",\n" + indentation + "'@delay' = " + min + "\n"); + else // no delay + result.append("\n"); + else if (max.equals(min)) // simple delay (equal bounds) + result.append(indentation + "'@delay' = " + min + ",\n"); + else // range delay + result.append(",\n" + indentation + "'@delay' = '#bound_random'(" + min + ", " + max + ")\n"); + + unindent(1); + result.append(indentation + ")"); + return result.toString(); + } + + /** computes the action part of the SysML transition associated to an Avatar transition */ + String transitionActions2SysML(AvatarTransition at) { + StringBuffer result; + + int size = at.getNbOfAction(); + if (size == 0) return null; + + // header + result = new StringBuffer(indentation + "do action : '#TransitionAction' {\n" + indentation + indentStep + "first start;\n"); + indent(1); + for(int i = 0; i < size; i++) { // iterate on actions of the Avatar transition + String ac = at.getOriginalAction(i); + int eq = ac.indexOf("="); + if(eq != -1) { // assignment action + String lh = leftHandSysMLname(ac.substring(0,eq).trim()); // lefthand + String rh = expr2SysML(ac.substring(eq+1).trim()); // righthand + result.append(indentation + "then assign " + lh + ":= " + rh + ";\n"); + } + else { // method call + result.append(indentation + "then action = " + expr2SysML(ac) + ";\n"); + } + } + result.append(indentation + "then done;\n"); + + unindent(1); + result.append(indentation + "}"); + return result.toString(); + } + + /** computes the action part of the SysML transition associated to an Avatar transition leading to a receive state. Due to the introduction of + * pre-communication states (when required), there are no other actions than the updating of variables w.r.t. the received message */ + String receiveActions2SysML(MethodInfo signalInfo, List<String> values) { + if (values == null || values.size() == 0) return ""; // simple signal without value + + StringBuffer result = new StringBuffer(indentation + "do action : '#ReceiveAction' {\n"); + indent(1); + + // put access to the received message + result.append(indentation + "item '@msg' : " + signalInfo.getMessageType() + " = '@payload' as " + signalInfo.getMessageType() + + ";\n" + indentation + "first start;\n"); + + int nbFields = signalInfo.getArity(); + int j = 0; + while (j < nbFields) { // iterate on message fields + result.append(indentation + "then assign " + leftHandSysMLname(values.get(j)) + + " := '@msg'." + signalInfo.getFieldName(j) + ";\n"); + j++; + } + result.append(indentation + "then done;\n"); + + unindent(1); + result.append(indentation + "}"); + return result.toString(); + } +} diff --git a/src/main/java/avatartranslator/tosysmlv2/Avatar2SysMLLexer.java b/src/main/java/avatartranslator/tosysmlv2/Avatar2SysMLLexer.java new file mode 100644 index 0000000000000000000000000000000000000000..b68c5c39bdc6e733aab1d0a83374b0e59dd98cb8 --- /dev/null +++ b/src/main/java/avatartranslator/tosysmlv2/Avatar2SysMLLexer.java @@ -0,0 +1,706 @@ +/* The following code was generated by JFlex 1.4.3 on 26/09/2024 17:01 */ + +/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille + * + * ludovic.apvrille AT enst.fr + * + * This software is a computer program whose purpose is to allow the + * edition of TURTLE analysis, design and deployment diagrams, to + * allow the generation of RT-LOTOS or Java code from this diagram, + * and at last to allow the analysis of formal validation traces + * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP + * from INRIA Rhone-Alpes. + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + */ + +package avatartranslator.tosysmlv2; +import java_cup.runtime.*; + + +/** + * This class is a scanner generated by + * <a href="http://www.jflex.de/">JFlex</a> 1.4.3 + * on 26/09/2024 17:01 from the specification file + * <code>__Avatar2SysMLLexer__.jflex</code> + */ +public class Avatar2SysMLLexer implements java_cup.runtime.Scanner { + + /** This character denotes the end of file */ + public static final int YYEOF = -1; + + /** initial size of the lookahead buffer */ + private static final int ZZ_BUFFERSIZE = 16384; + + /** lexical states */ + public static final int YYINITIAL = 0; + + /** + * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l + * ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l + * at the beginning of a line + * l is of the form l = 2*k, k a non negative integer + */ + private static final int ZZ_LEXSTATE[] = { + 0, 0 + }; + + /** + * Translates characters to character classes + */ + private static final String ZZ_CMAP_PACKED = + "\11\0\1\1\1\1\1\0\2\1\22\0\1\1\1\30\3\0\1\22"+ + "\1\23\1\0\1\34\1\35\1\20\1\16\1\36\1\17\1\5\1\21"+ + "\1\2\11\3\2\0\1\32\1\31\1\33\2\0\32\4\4\0\1\4"+ + "\1\0\1\13\2\4\1\25\1\11\1\12\5\4\1\14\1\4\1\24"+ + "\1\27\2\4\1\7\1\15\1\6\1\10\5\4\1\0\1\26\uff83\0"; + + /** + * Translates characters to character classes + */ + private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED); + + /** + * Translates DFA states to action switch labels. + */ + private static final int [] ZZ_ACTION = zzUnpackAction(); + + private static final String ZZ_ACTION_PACKED_0 = + "\1\0\1\1\1\2\2\3\4\4\1\5\1\6\1\7"+ + "\1\10\1\11\1\1\1\4\1\1\1\4\1\12\1\1"+ + "\1\13\1\14\1\15\1\16\1\17\3\4\1\20\1\4"+ + "\2\21\1\22\1\23\1\24\1\25\2\4\1\20\1\12"+ + "\1\26\1\4\1\27"; + + private static int [] zzUnpackAction() { + int [] result = new int[43]; + int offset = 0; + offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackAction(String packed, int offset, int [] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int count = packed.charAt(i++); + int value = packed.charAt(i++); + do result[j++] = value; while (--count > 0); + } + return j; + } + + + /** + * Translates a state to a row index in the transition table + */ + private static final int [] ZZ_ROWMAP = zzUnpackRowMap(); + + private static final String ZZ_ROWMAP_PACKED_0 = + "\0\0\0\37\0\37\0\37\0\76\0\135\0\174\0\233"+ + "\0\272\0\37\0\37\0\37\0\37\0\37\0\331\0\370"+ + "\0\u0117\0\u0136\0\u0155\0\u0174\0\u0193\0\u01b2\0\37\0\37"+ + "\0\37\0\u01d1\0\u01f0\0\u020f\0\37\0\u022e\0\37\0\135"+ + "\0\37\0\37\0\37\0\37\0\u024d\0\u026c\0\135\0\135"+ + "\0\135\0\u028b\0\135"; + + private static int [] zzUnpackRowMap() { + int [] result = new int[43]; + int offset = 0; + offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackRowMap(String packed, int offset, int [] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int high = packed.charAt(i++) << 16; + result[j++] = high | packed.charAt(i++); + } + return j; + } + + /** + * The transition table of the DFA + */ + private static final int [] ZZ_TRANS = zzUnpackTrans(); + + private static final String ZZ_TRANS_PACKED_0 = + "\1\2\1\3\1\4\1\5\1\6\1\2\1\7\3\6"+ + "\1\10\1\11\2\6\1\12\1\13\1\14\1\15\1\16"+ + "\1\17\1\20\1\6\1\21\1\22\1\23\1\24\1\25"+ + "\1\26\1\27\1\30\1\31\41\0\2\5\35\0\14\6"+ + "\6\0\2\6\1\0\1\6\11\0\5\6\1\32\6\6"+ + "\6\0\2\6\1\0\1\6\11\0\11\6\1\33\2\6"+ + "\6\0\2\6\1\0\1\6\11\0\14\6\6\0\1\34"+ + "\1\6\1\0\1\6\32\0\1\35\15\0\14\6\6\0"+ + "\2\6\1\0\1\36\35\0\1\37\12\0\5\6\1\40"+ + "\6\6\6\0\2\6\1\0\1\6\40\0\1\41\36\0"+ + "\1\42\36\0\1\43\36\0\1\44\7\0\6\6\1\45"+ + "\5\6\6\0\2\6\1\0\1\6\11\0\12\6\1\46"+ + "\1\6\6\0\2\6\1\0\1\6\11\0\14\6\6\0"+ + "\1\6\1\47\1\0\1\6\11\0\4\6\1\50\7\6"+ + "\6\0\2\6\1\0\1\6\11\0\7\6\1\51\4\6"+ + "\6\0\2\6\1\0\1\6\11\0\13\6\1\52\6\0"+ + "\2\6\1\0\1\6\11\0\7\6\1\53\4\6\6\0"+ + "\2\6\1\0\1\6\7\0"; + + private static int [] zzUnpackTrans() { + int [] result = new int[682]; + int offset = 0; + offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackTrans(String packed, int offset, int [] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int count = packed.charAt(i++); + int value = packed.charAt(i++); + value--; + do result[j++] = value; while (--count > 0); + } + return j; + } + + + /* error codes */ + private static final int ZZ_UNKNOWN_ERROR = 0; + private static final int ZZ_NO_MATCH = 1; + private static final int ZZ_PUSHBACK_2BIG = 2; + + /* error messages for the codes above */ + private static final String ZZ_ERROR_MSG[] = { + "Unkown internal scanner error", + "Error: could not match input", + "Error: pushback value was too large" + }; + + /** + * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code> + */ + private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute(); + + private static final String ZZ_ATTRIBUTE_PACKED_0 = + "\1\0\3\11\5\1\5\11\10\1\3\11\3\1\1\11"+ + "\1\1\1\11\1\1\4\11\7\1"; + + private static int [] zzUnpackAttribute() { + int [] result = new int[43]; + int offset = 0; + offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackAttribute(String packed, int offset, int [] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int count = packed.charAt(i++); + int value = packed.charAt(i++); + do result[j++] = value; while (--count > 0); + } + return j; + } + + /** the input device */ + private java.io.Reader zzReader; + + /** the current state of the DFA */ + private int zzState; + + /** the current lexical state */ + private int zzLexicalState = YYINITIAL; + + /** this buffer contains the current text to be matched and is + the source of the yytext() string */ + private char zzBuffer[] = new char[ZZ_BUFFERSIZE]; + + /** the textposition at the last accepting state */ + private int zzMarkedPos; + + /** the current text position in the buffer */ + private int zzCurrentPos; + + /** startRead marks the beginning of the yytext() string in the buffer */ + private int zzStartRead; + + /** endRead marks the last character in the buffer, that has been read + from input */ + private int zzEndRead; + + /** number of newlines encountered up to the start of the matched text */ + private int yyline; + + /** the number of characters up to the start of the matched text */ + private int yychar; + + /** + * the number of characters from the last newline up to the start of the + * matched text + */ + private int yycolumn; + + /** + * zzAtBOL == true <=> the scanner is currently at the beginning of a line + */ + private boolean zzAtBOL = true; + + /** zzAtEOF == true <=> the scanner is at the EOF */ + private boolean zzAtEOF; + + /** denotes if the user-EOF-code has already been executed */ + private boolean zzEOFDone; + + /* user code: */ + + + + /** + * Creates a new scanner + * There is also a java.io.InputStream version of this constructor. + * + * @param in the java.io.Reader to read input from. + */ + public Avatar2SysMLLexer(java.io.Reader in) { + this.zzReader = in; + } + + /** + * Creates a new scanner. + * There is also java.io.Reader version of this constructor. + * + * @param in the java.io.Inputstream to read input from. + */ + public Avatar2SysMLLexer(java.io.InputStream in) { + this(new java.io.InputStreamReader(in)); + } + + /** + * Unpacks the compressed character translation table. + * + * @param packed the packed character translation table + * @return the unpacked character translation table + */ + private static char [] zzUnpackCMap(String packed) { + char [] map = new char[0x10000]; + int i = 0; /* index in packed string */ + int j = 0; /* index in unpacked array */ + while (i < 100) { + int count = packed.charAt(i++); + char value = packed.charAt(i++); + do map[j++] = value; while (--count > 0); + } + return map; + } + + + /** + * Refills the input buffer. + * + * @return <code>false</code>, iff there was new input. + * + * @exception java.io.IOException if any I/O-Error occurs + */ + private boolean zzRefill() throws java.io.IOException { + + /* first: make room (if you can) */ + if (zzStartRead > 0) { + System.arraycopy(zzBuffer, zzStartRead, + zzBuffer, 0, + zzEndRead-zzStartRead); + + /* translate stored positions */ + zzEndRead-= zzStartRead; + zzCurrentPos-= zzStartRead; + zzMarkedPos-= zzStartRead; + zzStartRead = 0; + } + + /* is the buffer big enough? */ + if (zzCurrentPos >= zzBuffer.length) { + /* if not: blow it up */ + char newBuffer[] = new char[zzCurrentPos*2]; + System.arraycopy(zzBuffer, 0, newBuffer, 0, zzBuffer.length); + zzBuffer = newBuffer; + } + + /* finally: fill the buffer with new input */ + int numRead = zzReader.read(zzBuffer, zzEndRead, + zzBuffer.length-zzEndRead); + + if (numRead > 0) { + zzEndRead+= numRead; + return false; + } + // unlikely but not impossible: read 0 characters, but not at end of stream + if (numRead == 0) { + int c = zzReader.read(); + if (c == -1) { + return true; + } else { + zzBuffer[zzEndRead++] = (char) c; + return false; + } + } + + // numRead < 0 + return true; + } + + + /** + * Closes the input stream. + */ + public final void yyclose() throws java.io.IOException { + zzAtEOF = true; /* indicate end of file */ + zzEndRead = zzStartRead; /* invalidate buffer */ + + if (zzReader != null) + zzReader.close(); + } + + + /** + * Resets the scanner to read from a new input stream. + * Does not close the old reader. + * + * All internal variables are reset, the old input stream + * <b>cannot</b> be reused (internal buffer is discarded and lost). + * Lexical state is set to <code>ZZ_INITIAL</code>. + * + * @param reader the new input stream + */ + public final void yyreset(java.io.Reader reader) { + zzReader = reader; + zzAtBOL = true; + zzAtEOF = false; + zzEOFDone = false; + zzEndRead = zzStartRead = 0; + zzCurrentPos = zzMarkedPos = 0; + yyline = yychar = yycolumn = 0; + zzLexicalState = YYINITIAL; + } + + + /** + * Returns the current lexical state. + */ + public final int yystate() { + return zzLexicalState; + } + + + /** + * Enters a new lexical state + * + * @param newState the new lexical state + */ + public final void yybegin(int newState) { + zzLexicalState = newState; + } + + + /** + * Returns the text matched by the current regular expression. + */ + public final String yytext() { + return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead ); + } + + + /** + * Returns the character at position <code>pos</code> from the + * matched text. + * + * It is equivalent to yytext().charAt(pos), but faster + * + * @param pos the position of the character to fetch. + * A value from 0 to yylength()-1. + * + * @return the character at position pos + */ + public final char yycharat(int pos) { + return zzBuffer[zzStartRead+pos]; + } + + + /** + * Returns the length of the matched text region. + */ + public final int yylength() { + return zzMarkedPos-zzStartRead; + } + + + /** + * Reports an error that occured while scanning. + * + * In a wellformed scanner (no or only correct usage of + * yypushback(int) and a match-all fallback rule) this method + * will only be called with things that "Can't Possibly Happen". + * If this method is called, something is seriously wrong + * (e.g. a JFlex bug producing a faulty scanner etc.). + * + * Usual syntax/scanner level error handling should be done + * in error fallback rules. + * + * @param errorCode the code of the errormessage to display + */ + private void zzScanError(int errorCode) { + String message; + try { + message = ZZ_ERROR_MSG[errorCode]; + } + catch (ArrayIndexOutOfBoundsException e) { + message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR]; + } + + throw new Error(message); + } + + + /** + * Pushes the specified amount of characters back into the input stream. + * + * They will be read again by then next call of the scanning method + * + * @param number the number of characters to be read again. + * This number must not be greater than yylength()! + */ + public void yypushback(int number) { + if ( number > yylength() ) + zzScanError(ZZ_PUSHBACK_2BIG); + + zzMarkedPos -= number; + } + + + /** + * Contains user EOF-code, which will be executed exactly once, + * when the end of file is reached + */ + private void zzDoEOF() throws java.io.IOException { + if (!zzEOFDone) { + zzEOFDone = true; + yyclose(); + } + } + + + /** + * Resumes scanning until the next regular expression is matched, + * the end of input is encountered or an I/O-Error occurs. + * + * @return the next token + * @exception java.io.IOException if any I/O-Error occurs + */ + public java_cup.runtime.Symbol next_token() throws java.io.IOException, Exception { + int zzInput; + int zzAction; + + // cached fields: + int zzCurrentPosL; + int zzMarkedPosL; + int zzEndReadL = zzEndRead; + char [] zzBufferL = zzBuffer; + char [] zzCMapL = ZZ_CMAP; + + int [] zzTransL = ZZ_TRANS; + int [] zzRowMapL = ZZ_ROWMAP; + int [] zzAttrL = ZZ_ATTRIBUTE; + + while (true) { + zzMarkedPosL = zzMarkedPos; + + zzAction = -1; + + zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL; + + zzState = ZZ_LEXSTATE[zzLexicalState]; + + + zzForAction: { + while (true) { + + if (zzCurrentPosL < zzEndReadL) + zzInput = zzBufferL[zzCurrentPosL++]; + else if (zzAtEOF) { + zzInput = YYEOF; + break zzForAction; + } + else { + // store back cached positions + zzCurrentPos = zzCurrentPosL; + zzMarkedPos = zzMarkedPosL; + boolean eof = zzRefill(); + // get translated positions and possibly new buffer + zzCurrentPosL = zzCurrentPos; + zzMarkedPosL = zzMarkedPos; + zzBufferL = zzBuffer; + zzEndReadL = zzEndRead; + if (eof) { + zzInput = YYEOF; + break zzForAction; + } + else { + zzInput = zzBufferL[zzCurrentPosL++]; + } + } + int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ]; + if (zzNext == -1) break zzForAction; + zzState = zzNext; + + int zzAttributes = zzAttrL[zzState]; + if ( (zzAttributes & 1) == 1 ) { + zzAction = zzState; + zzMarkedPosL = zzCurrentPosL; + if ( (zzAttributes & 8) == 8 ) break zzForAction; + } + + } + } + + // store back cached position + zzMarkedPos = zzMarkedPosL; + + switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) { + case 16: + { return new Symbol(Avatar2SysMLSymbols.AND); + } + case 24: break; + case 10: + { return new Symbol(Avatar2SysMLSymbols.NOT); + } + case 25: break; + case 3: + { try { return new Symbol(Avatar2SysMLSymbols.CONSTANT, "" + Integer.parseInt(yytext()));} + catch (NumberFormatException nfe) { throw new Exception ("Lexer : Integer Format : " + yytext()); } + } + case 26: break; + case 8: + { return new Symbol(Avatar2SysMLSymbols.DIV); + } + case 27: break; + case 4: + { return new Symbol(Avatar2SysMLSymbols.IDENT, yytext()); + } + case 28: break; + case 2: + { break; + } + case 29: break; + case 18: + { return new Symbol(Avatar2SysMLSymbols.DIF); + } + case 30: break; + case 23: + { return new Symbol(Avatar2SysMLSymbols.CONSTANT, "false"); + } + case 31: break; + case 11: + { return new Symbol(Avatar2SysMLSymbols.LT); + } + case 32: break; + case 15: + { return new Symbol(Avatar2SysMLSymbols.COMMA); + } + case 33: break; + case 5: + { return new Symbol(Avatar2SysMLSymbols.PLUS); + } + case 34: break; + case 12: + { return new Symbol(Avatar2SysMLSymbols.GT); + } + case 35: break; + case 21: + { return new Symbol(Avatar2SysMLSymbols.GEQ); + } + case 36: break; + case 9: + { return new Symbol(Avatar2SysMLSymbols.MOD); + } + case 37: break; + case 19: + { return new Symbol(Avatar2SysMLSymbols.EQ); + } + case 38: break; + case 14: + { return new Symbol(Avatar2SysMLSymbols.RPAR); + } + case 39: break; + case 17: + { return new Symbol(Avatar2SysMLSymbols.OR); + } + case 40: break; + case 20: + { return new Symbol(Avatar2SysMLSymbols.LEQ); + } + case 41: break; + case 1: + { throw new Exception ("Unknown character in expression"); + } + case 42: break; + case 6: + { return new Symbol(Avatar2SysMLSymbols.MINUS); + } + case 43: break; + case 22: + { return new Symbol(Avatar2SysMLSymbols.CONSTANT, "true"); + } + case 44: break; + case 7: + { return new Symbol(Avatar2SysMLSymbols.MULT); + } + case 45: break; + case 13: + { return new Symbol(Avatar2SysMLSymbols.LPAR); + } + case 46: break; + default: + if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { + zzAtEOF = true; + zzDoEOF(); + { return new java_cup.runtime.Symbol(Avatar2SysMLSymbols.EOF); + } + } + else { + zzScanError(ZZ_NO_MATCH); + } + } + } + } + + +} diff --git a/src/main/java/avatartranslator/tosysmlv2/Avatar2SysMLNames.java b/src/main/java/avatartranslator/tosysmlv2/Avatar2SysMLNames.java new file mode 100644 index 0000000000000000000000000000000000000000..7197b7e6fc9fafa23d8be8cd11bbfa3a5ba681eb --- /dev/null +++ b/src/main/java/avatartranslator/tosysmlv2/Avatar2SysMLNames.java @@ -0,0 +1,209 @@ +/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille + * + * ludovic.apvrille AT enst.fr + * + * This software is a computer program whose purpose is to allow the + * edition of TURTLE analysis, design and deployment diagrams, to + * allow the generation of RT-LOTOS or Java code from this diagram, + * and at last to allow the analysis of formal validation traces + * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP + * from INRIA Rhone-Alpes. + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + */ +/** + * Class Avatar2SysMLNames + * Creation: 20/06/2024 + * + * @author Sophie Coudert + * @version 0.1 20/06/2024 + */ +package avatartranslator.tosysmlv2; +import java_cup.runtime.ComplexSymbolFactory; + +import java.io.StringReader; +import java.util.List; + +/** + * Class Avatar2SysMLNames + * Creation: 20/06/2024 + * + * Generation of SysML idents from Avatar names. + * + * <p> This ensures that the identifiers used in the Avatar Model don't clash + * with the SysML keywords or some fieldName in the used SysML libraries. + * The parsing of AvatarFromSysML recovers the original Avatar names from these identifiers. + * "name" parameters for these name generators are intended to be the original Avatar names. + * Except for attributes, all the parameter names are short names (Avatar names without "."). + * </p> + * <p> Some name generators require an integer as last parameter. This parameter is used to be + * able to produce different identifiers for the same values of the other parameters</p> + * + * @author Sophie Coudert + * @version 0.1 20/06/2024 + */ +public class Avatar2SysMLNames { + /** type of synchroneous communications */ + public final static int SYNC = 0; + /** type of blocking-fifo communications */ + public final static int BFIFO = 1; + /** type of non-blocking-fifo communications */ + public final static int NBFIFO = 2; + + + public static String dataTypeSysMLname(String name){ return "'@dt:" + name.trim() + "'"; } + + public static String blockSysMLname(String name){ return "'@blk:" + name.trim() + "'"; } + + /** attribute names may be chained using "." as separator */ + public static String attributeSysMLname(String _name){ + if (_name == null) return null; + String name = _name.trim(); + String[] list = name.split("\\."); + StringBuffer result = + ( list.length == 0 ? new StringBuffer("'$" + name + "'") : new StringBuffer("'$" + list[0] + "'")); + int length = list.length; + for(int i = 1; i < length; i++) + result.append(".'" + list[i] + "'"); + return result.toString(); + } + + /** specific... as SysML requires a "::" as first separator (instead of ".") for variable assignment */ + public static String leftHandSysMLname(String name){ + String aname = attributeSysMLname(name); + int found = aname.indexOf("'.'"); + if (found == -1) return aname; + else return ( + aname.substring(0,found) + "'::'" + aname.substring(found+3) + ); + } + /** Note: method name are similar to attribute name (do not change, code rely on this) */ + public static String methodSysMLname(String name){ return "'$" + name.trim() + "'"; } + + public static String fieldSysMLname(String name){ return "'" + name.trim() + "'"; } + + /** Relation names contain information about the kind of communication. + * + * @param b1 bloc name + * @param b2 bloc name + * @param type among SYNC, FIFO and NBFIFO + */ + public static String relationSysMLname(String b1, String b2, int type, int n){ + if (type == NBFIFO) return "'@NBF" + n + ":" + b1.trim() + "-" + b2.trim() + "'"; + if (type == BFIFO) return "'@BF" + n + ":" + b1.trim() + "-" + b2.trim() + "'"; + if (type == SYNC) return "'@SYN" + n + ":" + b1.trim() + "-" + b2.trim() + "'"; + return ""; + } + + /** channelNames are informative substrings of channelSysMLNames. + * + * a channel connects two signals s1 and s2 belonging respectively to blocs b1 and b2 + * + * @param out2in must be true if s1 is an output signal + */ + public static String channelName(String b1, String b2, String s1, String s2, boolean out2in){ + if(out2in) return b1.trim() + "." + s1.trim() + ">" + b2.trim() + "." + s2.trim(); + else return b1.trim() + "." + s1.trim() + "<" + b2.trim() + "." + s2.trim(); + } + + public static String signalSysMLname(String _name){ return "'@sig:" + _name + "'"; } + + /** Channel SysML names contain information about the kind of communication. + * + * @param type among SYNC, FIFO and NBFIFO + */ + public static String channelSysMLname(String _signalname, int type){ + if (type == NBFIFO) return "'@nbf:" + _signalname.trim() + "'"; + if (type == BFIFO) return "'@bf:" + _signalname.trim() + "'"; + if (type == SYNC) return "'@syn:" + _signalname.trim() + "'"; + return ""; + } + + /** messages denote structures that are signal profiles */ + public static String messageSysMLname(String _blockname, String _signalsname){ + return "'@MSG:" + _blockname.trim() + "." + _signalsname.trim() + "'"; + } + + public static String startStateSysMLname(){ return "'@st:start'"; } + + public static String stopStateSysMLname(){ return "'@st:stop'"; } + + /** associated to AvatarStates */ + public static String standardStateSysMLname(String name){ return "'@st:standard." + name.trim() + "'"; } + + /** associated to AvatarRandoms */ + public static String randomStateSysMLname(int number){ return "'@st:random." + number + "'"; } + + /** associated to QueriesOnSignal */ + public static String countStateSysMLname(String sigName, int number){ return "'@st:count." + sigName.trim() + "." + number + "'"; } + + /** associated to sending AvatarActionOnSignal */ + public static String sendStateSysMLname(String sigName, int number){ return "'@st:send." + sigName.trim() + "." + number + "'"; } + + /** associated to receiving AvatarActionOnSignal */ + public static String receiveStateSysMLname(String sigName, int number){ return "'@st:receive." + sigName.trim() + "." + number + "'"; } + + /** (technical) added states before some sending AvatarActionOnSignal */ + public static String presendStateSysMLname(String sigName, int number){ return "'@st:presend." + sigName.trim() + "." + number + "'"; } + + /** (technical) added states before some receiving AvatarActionOnSignal */ + public static String prereceiveStateSysMLname(String sigName, int number){ return "'@st:prereceive." + sigName.trim() + "." + number + "'"; } + + /** associated to AvatarSetTimer */ + public static String setTimerStateSysMLname(String timerName, int number){ return "'@st:set." + timerName.trim() + "." + number + "'"; } + + /** associated to AvatarResetTimer */ + public static String resetTimerStateSysMLname(String timerName, int number){ return "'@st:reset." + timerName.trim() + "." + number + "'"; } + + /** associated to AvatarExpireTimer */ + public static String expireTimerStateSysMLname(String timerName, int number){ return "'@st:expire." + timerName.trim() + "." + number + "'"; } + + /** (technical) added states before some AvatarSetTimer */ + public static String presetTimerStateSysMLname(String timerName, int number){ return "'@st:preset." + timerName.trim() + "." + number + "'"; } + + /** (technical) added states before some AvatarResetTimer */ + public static String preresetTimerStateSysMLname(String timerName, int number){ return "'@st:prereset." + timerName.trim() + "." + number + "'"; } + + /** (technical) added states before some AvatarExpireTimer */ + public static String preexpireTimerStateSysMLname(String timerName, int number){ return "'@st:preexpire." + timerName.trim() + "." + number + "'"; } + + /** associated to Avatar timers (represented by blocks) */ + public static String timerBlockSysMLname(String timerName){ return "'@tmr:" + timerName.trim() + "'"; } + + /** convert an Avatar int/bool expression into a SysML expression */ + public static String expr2SysML(String _expr) { + Avatar2SysMLParser parser = new Avatar2SysMLParser(new Avatar2SysMLLexer(new StringReader (_expr))); + try { + String res = (String)parser.parse().value; + return res; + } + catch (java.lang.Exception e) { + e.printStackTrace(); + return ""; } + } +} + diff --git a/src/main/java/avatartranslator/tosysmlv2/Avatar2SysMLParser.java b/src/main/java/avatartranslator/tosysmlv2/Avatar2SysMLParser.java new file mode 100644 index 0000000000000000000000000000000000000000..5a73d9644e807fbb6632047c505a1f954076dfe9 --- /dev/null +++ b/src/main/java/avatartranslator/tosysmlv2/Avatar2SysMLParser.java @@ -0,0 +1,578 @@ + +//---------------------------------------------------- +// The following code was generated by CUP v0.11b 20210814 (GIT d69c832) +//---------------------------------------------------- + +package avatartranslator.tosysmlv2; + +import java_cup.runtime.*; +import static avatartranslator.tosysmlv2.Avatar2SysMLNames.*; +import java_cup.runtime.XMLElement; + +/** CUP v0.11b 20210814 (GIT d69c832) generated parser. + */ +@SuppressWarnings("unused") +public class Avatar2SysMLParser extends java_cup.runtime.lr_parser { + + @Override + public final Class<?> getSymbolContainer() { + return Avatar2SysMLSymbols.class; +} + + /** Default constructor. */ + @Deprecated + public Avatar2SysMLParser() {super();} + + /** Constructor which sets the default scanner. */ + @Deprecated + public Avatar2SysMLParser(java_cup.runtime.Scanner s) {super(s);} + + /** Constructor which sets the default scanner. */ + public Avatar2SysMLParser(java_cup.runtime.Scanner s, java_cup.runtime.SymbolFactory sf) {super(s,sf);} + + /** Production table. */ + protected static final short _production_table[][] = + unpackFromStrings(new String[] { + "\000\027\000\002\002\005\000\002\002\004\000\002\002" + + "\005\000\002\002\005\000\002\002\005\000\002\002\005" + + "\000\002\002\004\000\002\002\005\000\002\002\005\000" + + "\002\002\004\000\002\002\005\000\002\002\005\000\002" + + "\002\005\000\002\002\005\000\002\002\005\000\002\002" + + "\005\000\002\002\005\000\002\002\005\000\002\002\006" + + "\000\002\002\003\000\002\002\003\000\002\003\003\000" + + "\002\003\005" }); + + /** Access to production table. */ + @Override + public short[][] production_table() {return _production_table;} + + /** Parse-action table. */ + protected static final short[][] _action_table = + unpackFromStrings(new String[] { + "\000\055\000\014\005\007\021\005\022\006\026\010\027" + + "\004\001\002\000\042\002\uffee\004\uffee\005\uffee\006\uffee" + + "\007\uffee\010\uffee\011\uffee\012\uffee\013\uffee\014\uffee\015" + + "\uffee\016\uffee\017\uffee\020\uffee\023\uffee\025\uffee\001\002" + + "\000\014\005\007\021\005\022\006\026\010\027\004\001" + + "\002\000\014\005\007\021\005\022\006\026\010\027\004" + + "\001\002\000\014\005\007\021\005\022\006\026\010\027" + + "\004\001\002\000\044\002\uffed\004\uffed\005\uffed\006\uffed" + + "\007\uffed\010\uffed\011\uffed\012\uffed\013\uffed\014\uffed\015" + + "\uffed\016\uffed\017\uffed\020\uffed\022\045\023\uffed\025\uffed" + + "\001\002\000\036\002\020\004\017\005\012\006\014\007" + + "\022\010\015\011\013\012\026\013\021\014\016\015\025" + + "\016\023\017\027\020\024\001\002\000\014\005\007\021" + + "\005\022\006\026\010\027\004\001\002\000\014\005\007" + + "\021\005\022\006\026\010\027\004\001\002\000\014\005" + + "\007\021\005\022\006\026\010\027\004\001\002\000\014" + + "\005\007\021\005\022\006\026\010\027\004\001\002\000" + + "\014\005\007\021\005\022\006\026\010\027\004\001\002" + + "\000\014\005\007\021\005\022\006\026\010\027\004\001" + + "\002\000\004\002\000\001\002\000\014\005\007\021\005" + + "\022\006\026\010\027\004\001\002\000\014\005\007\021" + + "\005\022\006\026\010\027\004\001\002\000\014\005\007" + + "\021\005\022\006\026\010\027\004\001\002\000\014\005" + + "\007\021\005\022\006\026\010\027\004\001\002\000\014" + + "\005\007\021\005\022\006\026\010\027\004\001\002\000" + + "\014\005\007\021\005\022\006\026\010\027\004\001\002" + + "\000\014\005\007\021\005\022\006\026\010\027\004\001" + + "\002\000\032\002\ufff5\004\017\005\012\006\014\007\022" + + "\010\015\011\ufff5\012\ufff5\013\ufff5\014\ufff5\023\ufff5\025" + + "\ufff5\001\002\000\042\002\ufffa\004\017\005\012\006\014" + + "\007\022\010\015\011\013\012\ufffa\013\021\014\016\015" + + "\025\016\023\017\027\020\024\023\ufffa\025\ufffa\001\002" + + "\000\032\002\ufff7\004\017\005\012\006\014\007\022\010" + + "\015\011\ufff7\012\ufff7\013\ufff7\014\ufff7\023\ufff7\025\ufff7" + + "\001\002\000\032\002\ufff4\004\017\005\012\006\014\007" + + "\022\010\015\011\ufff4\012\ufff4\013\ufff4\014\ufff4\023\ufff4" + + "\025\ufff4\001\002\000\032\002\ufff6\004\017\005\012\006" + + "\014\007\022\010\015\011\ufff6\012\ufff6\013\ufff6\014\ufff6" + + "\023\ufff6\025\ufff6\001\002\000\042\002\ufffd\004\ufffd\005" + + "\ufffd\006\ufffd\007\ufffd\010\ufffd\011\ufffd\012\ufffd\013\ufffd" + + "\014\ufffd\015\ufffd\016\ufffd\017\ufffd\020\ufffd\023\ufffd\025" + + "\ufffd\001\002\000\042\002\ufff3\004\017\005\012\006\014" + + "\007\022\010\015\011\ufff3\012\ufff3\013\ufff3\014\ufff3\015" + + "\025\016\023\017\027\020\024\023\ufff3\025\ufff3\001\002" + + "\000\042\002\001\004\001\005\001\006\014\007\022\010" + + "\015\011\001\012\001\013\001\014\001\015\001\016\001" + + "\017\001\020\001\023\001\025\001\001\002\000\042\002" + + "\ufff2\004\017\005\012\006\014\007\022\010\015\011\ufff2" + + "\012\ufff2\013\ufff2\014\ufff2\015\025\016\023\017\027\020" + + "\024\023\ufff2\025\ufff2\001\002\000\042\002\ufffc\004\ufffc" + + "\005\ufffc\006\ufffc\007\ufffc\010\ufffc\011\ufffc\012\ufffc\013" + + "\ufffc\014\ufffc\015\ufffc\016\ufffc\017\ufffc\020\ufffc\023\ufffc" + + "\025\ufffc\001\002\000\042\002\ufffe\004\ufffe\005\ufffe\006" + + "\ufffe\007\ufffe\010\ufffe\011\ufffe\012\ufffe\013\ufffe\014\ufffe" + + "\015\ufffe\016\ufffe\017\ufffe\020\ufffe\023\ufffe\025\ufffe\001" + + "\002\000\042\002\ufff9\004\017\005\012\006\014\007\022" + + "\010\015\011\ufff9\012\ufff9\013\021\014\016\015\025\016" + + "\023\017\027\020\024\023\ufff9\025\ufff9\001\002\000\042" + + "\002\uffff\004\uffff\005\uffff\006\014\007\022\010\015\011" + + "\uffff\012\uffff\013\uffff\014\uffff\015\uffff\016\uffff\017\uffff" + + "\020\uffff\023\uffff\025\uffff\001\002\000\016\005\007\021" + + "\005\022\006\023\050\026\010\027\004\001\002\000\004" + + "\023\053\001\002\000\040\004\017\005\012\006\014\007" + + "\022\010\015\011\013\012\026\013\021\014\016\015\025" + + "\016\023\017\027\020\024\023\uffec\025\051\001\002\000" + + "\042\002\ufff0\004\ufff0\005\ufff0\006\ufff0\007\ufff0\010\ufff0" + + "\011\ufff0\012\ufff0\013\ufff0\014\ufff0\015\ufff0\016\ufff0\017" + + "\ufff0\020\ufff0\023\ufff0\025\ufff0\001\002\000\014\005\007" + + "\021\005\022\006\026\010\027\004\001\002\000\004\023" + + "\uffeb\001\002\000\042\002\uffef\004\uffef\005\uffef\006\uffef" + + "\007\uffef\010\uffef\011\uffef\012\uffef\013\uffef\014\uffef\015" + + "\uffef\016\uffef\017\uffef\020\uffef\023\uffef\025\uffef\001\002" + + "\000\042\002\ufffb\004\ufffb\005\ufffb\006\ufffb\007\ufffb\010" + + "\ufffb\011\ufffb\012\ufffb\013\ufffb\014\ufffb\015\ufffb\016\ufffb" + + "\017\ufffb\020\ufffb\023\ufffb\025\ufffb\001\002\000\036\004" + + "\017\005\012\006\014\007\022\010\015\011\013\012\026" + + "\013\021\014\016\015\025\016\023\017\027\020\024\023" + + "\056\001\002\000\042\002\ufff1\004\ufff1\005\ufff1\006\ufff1" + + "\007\ufff1\010\ufff1\011\ufff1\012\ufff1\013\ufff1\014\ufff1\015" + + "\ufff1\016\ufff1\017\ufff1\020\ufff1\023\ufff1\025\ufff1\001\002" + + "\000\042\002\ufff8\004\017\005\012\006\014\007\022\010" + + "\015\011\ufff8\012\ufff8\013\021\014\016\015\025\016\023" + + "\017\027\020\024\023\ufff8\025\ufff8\001\002" }); + + /** Access to parse-action table. */ + @Override + public short[][] action_table() {return _action_table;} + + /** <code>reduce_goto</code> table. */ + protected static final short[][] _reduce_table = + unpackFromStrings(new String[] { + "\000\055\000\004\002\010\001\001\000\002\001\001\000" + + "\004\002\056\001\001\000\004\002\054\001\001\000\004" + + "\002\053\001\001\000\002\001\001\000\002\001\001\000" + + "\004\002\043\001\001\000\004\002\042\001\001\000\004" + + "\002\041\001\001\000\004\002\040\001\001\000\004\002" + + "\037\001\001\000\004\002\036\001\001\000\002\001\001" + + "\000\004\002\035\001\001\000\004\002\034\001\001\000" + + "\004\002\033\001\001\000\004\002\032\001\001\000\004" + + "\002\031\001\001\000\004\002\030\001\001\000\004\002" + + "\027\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\002\001\001" + + "\000\002\001\001\000\002\001\001\000\002\001\001\000" + + "\002\001\001\000\006\002\046\003\045\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\006\002" + + "\046\003\051\001\001\000\002\001\001\000\002\001\001" + + "\000\002\001\001\000\002\001\001\000\002\001\001\000" + + "\002\001\001" }); + + /** Access to <code>reduce_goto</code> table. */ + @Override + public short[][] reduce_table() {return _reduce_table;} + + /** Instance of action encapsulation class. */ + protected CUP$Avatar2SysMLParser$actions action_obj; + + /** Action encapsulation object initializer. */ + @Override + protected void init_actions() + { + action_obj = new CUP$Avatar2SysMLParser$actions(this); + } + + /** Invoke a user supplied parse action. */ + @Override + public java_cup.runtime.Symbol do_action( + int act_num, + java_cup.runtime.lr_parser parser, + java.util.Stack<java_cup.runtime.Symbol> stack, + int top) + throws java.lang.Exception + { + /* call code in generated class */ + return action_obj.CUP$Avatar2SysMLParser$do_action(act_num, parser, stack, top); + } + + /** Indicates start state. */ + @Override + public int start_state() {return 0;} + /** Indicates start production. */ + @Override + public int start_production() {return 1;} + + /** <code>EOF</code> Symbol index. */ + @Override + public int EOF_sym() {return 0;} + + /** <code>error</code> Symbol index. */ + @Override + public int error_sym() {return 1;} + + + + + +/** Cup generated class to encapsulate user supplied action code.*/ +class CUP$Avatar2SysMLParser$actions { + private final Avatar2SysMLParser parser; + + /** Constructor */ + CUP$Avatar2SysMLParser$actions(Avatar2SysMLParser parser) { + this.parser = parser; + } + + /** Method 0 with the actual generated action code for actions 0 to 300. */ + public final java_cup.runtime.Symbol CUP$Avatar2SysMLParser$do_action_part00000000( + int CUP$Avatar2SysMLParser$act_num, + java_cup.runtime.lr_parser CUP$Avatar2SysMLParser$parser, + java.util.Stack<java_cup.runtime.Symbol> CUP$Avatar2SysMLParser$stack, + int CUP$Avatar2SysMLParser$top) + throws java.lang.Exception + { + /* Symbol object for return from actions */ + java_cup.runtime.Symbol CUP$Avatar2SysMLParser$result; + + /* select the action based on the action number */ + switch (CUP$Avatar2SysMLParser$act_num) + { + /*. . . . . . . . . . . . . . . . . . . .*/ + case 0: // expr ::= expr PLUS expr + { + String RESULT =null; + int lleft = (CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2)).left; + int lright = (CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2)).right; + String l = CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2).<String>value(); + int rleft = (CUP$Avatar2SysMLParser$stack.peek()).left; + int rright = (CUP$Avatar2SysMLParser$stack.peek()).right; + String r = CUP$Avatar2SysMLParser$stack.peek().<String>value(); + RESULT = l + " + " + r; + CUP$Avatar2SysMLParser$result = parser.getSymbolFactory().newSymbol("expr",0, CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2), CUP$Avatar2SysMLParser$stack.peek(), RESULT); + } + return CUP$Avatar2SysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 1: // $START ::= expr EOF + { + Object RESULT =null; + int start_valleft = (CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-1)).left; + int start_valright = (CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-1)).right; + String start_val = CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-1).<String>value(); + RESULT = start_val; + CUP$Avatar2SysMLParser$result = parser.getSymbolFactory().newSymbol("$START",0, CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-1), CUP$Avatar2SysMLParser$stack.peek(), RESULT); + } + /* ACCEPT */ + CUP$Avatar2SysMLParser$parser.done_parsing(); + return CUP$Avatar2SysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 2: // expr ::= expr MINUS expr + { + String RESULT =null; + int lleft = (CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2)).left; + int lright = (CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2)).right; + String l = CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2).<String>value(); + int rleft = (CUP$Avatar2SysMLParser$stack.peek()).left; + int rright = (CUP$Avatar2SysMLParser$stack.peek()).right; + String r = CUP$Avatar2SysMLParser$stack.peek().<String>value(); + RESULT = l + " - " + r; + CUP$Avatar2SysMLParser$result = parser.getSymbolFactory().newSymbol("expr",0, CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2), CUP$Avatar2SysMLParser$stack.peek(), RESULT); + } + return CUP$Avatar2SysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 3: // expr ::= expr MULT expr + { + String RESULT =null; + int lleft = (CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2)).left; + int lright = (CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2)).right; + String l = CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2).<String>value(); + int rleft = (CUP$Avatar2SysMLParser$stack.peek()).left; + int rright = (CUP$Avatar2SysMLParser$stack.peek()).right; + String r = CUP$Avatar2SysMLParser$stack.peek().<String>value(); + RESULT = l + " * " + r; + CUP$Avatar2SysMLParser$result = parser.getSymbolFactory().newSymbol("expr",0, CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2), CUP$Avatar2SysMLParser$stack.peek(), RESULT); + } + return CUP$Avatar2SysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 4: // expr ::= expr DIV expr + { + String RESULT =null; + int lleft = (CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2)).left; + int lright = (CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2)).right; + String l = CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2).<String>value(); + int rleft = (CUP$Avatar2SysMLParser$stack.peek()).left; + int rright = (CUP$Avatar2SysMLParser$stack.peek()).right; + String r = CUP$Avatar2SysMLParser$stack.peek().<String>value(); + RESULT = l + " / " + r; + CUP$Avatar2SysMLParser$result = parser.getSymbolFactory().newSymbol("expr",0, CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2), CUP$Avatar2SysMLParser$stack.peek(), RESULT); + } + return CUP$Avatar2SysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 5: // expr ::= expr MOD expr + { + String RESULT =null; + int lleft = (CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2)).left; + int lright = (CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2)).right; + String l = CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2).<String>value(); + int rleft = (CUP$Avatar2SysMLParser$stack.peek()).left; + int rright = (CUP$Avatar2SysMLParser$stack.peek()).right; + String r = CUP$Avatar2SysMLParser$stack.peek().<String>value(); + RESULT = l + " % " + r; + CUP$Avatar2SysMLParser$result = parser.getSymbolFactory().newSymbol("expr",0, CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2), CUP$Avatar2SysMLParser$stack.peek(), RESULT); + } + return CUP$Avatar2SysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 6: // expr ::= MINUS expr + { + String RESULT =null; + int eleft = (CUP$Avatar2SysMLParser$stack.peek()).left; + int eright = (CUP$Avatar2SysMLParser$stack.peek()).right; + String e = CUP$Avatar2SysMLParser$stack.peek().<String>value(); + RESULT = "-" + e; + CUP$Avatar2SysMLParser$result = parser.getSymbolFactory().newSymbol("expr",0, CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-1), CUP$Avatar2SysMLParser$stack.peek(), RESULT); + } + return CUP$Avatar2SysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 7: // expr ::= expr OR expr + { + String RESULT =null; + int lleft = (CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2)).left; + int lright = (CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2)).right; + String l = CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2).<String>value(); + int rleft = (CUP$Avatar2SysMLParser$stack.peek()).left; + int rright = (CUP$Avatar2SysMLParser$stack.peek()).right; + String r = CUP$Avatar2SysMLParser$stack.peek().<String>value(); + RESULT = l + " or " + r; + CUP$Avatar2SysMLParser$result = parser.getSymbolFactory().newSymbol("expr",0, CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2), CUP$Avatar2SysMLParser$stack.peek(), RESULT); + } + return CUP$Avatar2SysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 8: // expr ::= expr AND expr + { + String RESULT =null; + int lleft = (CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2)).left; + int lright = (CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2)).right; + String l = CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2).<String>value(); + int rleft = (CUP$Avatar2SysMLParser$stack.peek()).left; + int rright = (CUP$Avatar2SysMLParser$stack.peek()).right; + String r = CUP$Avatar2SysMLParser$stack.peek().<String>value(); + RESULT = l + " and " + r; + CUP$Avatar2SysMLParser$result = parser.getSymbolFactory().newSymbol("expr",0, CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2), CUP$Avatar2SysMLParser$stack.peek(), RESULT); + } + return CUP$Avatar2SysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 9: // expr ::= NOT expr + { + String RESULT =null; + int eleft = (CUP$Avatar2SysMLParser$stack.peek()).left; + int eright = (CUP$Avatar2SysMLParser$stack.peek()).right; + String e = CUP$Avatar2SysMLParser$stack.peek().<String>value(); + RESULT = "not " + e; + CUP$Avatar2SysMLParser$result = parser.getSymbolFactory().newSymbol("expr",0, CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-1), CUP$Avatar2SysMLParser$stack.peek(), RESULT); + } + return CUP$Avatar2SysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 10: // expr ::= expr LT expr + { + String RESULT =null; + int lleft = (CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2)).left; + int lright = (CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2)).right; + String l = CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2).<String>value(); + int rleft = (CUP$Avatar2SysMLParser$stack.peek()).left; + int rright = (CUP$Avatar2SysMLParser$stack.peek()).right; + String r = CUP$Avatar2SysMLParser$stack.peek().<String>value(); + RESULT = l + " < " + r; + CUP$Avatar2SysMLParser$result = parser.getSymbolFactory().newSymbol("expr",0, CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2), CUP$Avatar2SysMLParser$stack.peek(), RESULT); + } + return CUP$Avatar2SysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 11: // expr ::= expr GT expr + { + String RESULT =null; + int lleft = (CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2)).left; + int lright = (CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2)).right; + String l = CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2).<String>value(); + int rleft = (CUP$Avatar2SysMLParser$stack.peek()).left; + int rright = (CUP$Avatar2SysMLParser$stack.peek()).right; + String r = CUP$Avatar2SysMLParser$stack.peek().<String>value(); + RESULT = l + " > " + r; + CUP$Avatar2SysMLParser$result = parser.getSymbolFactory().newSymbol("expr",0, CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2), CUP$Avatar2SysMLParser$stack.peek(), RESULT); + } + return CUP$Avatar2SysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 12: // expr ::= expr LEQ expr + { + String RESULT =null; + int lleft = (CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2)).left; + int lright = (CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2)).right; + String l = CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2).<String>value(); + int rleft = (CUP$Avatar2SysMLParser$stack.peek()).left; + int rright = (CUP$Avatar2SysMLParser$stack.peek()).right; + String r = CUP$Avatar2SysMLParser$stack.peek().<String>value(); + RESULT = l + " <= " + r; + CUP$Avatar2SysMLParser$result = parser.getSymbolFactory().newSymbol("expr",0, CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2), CUP$Avatar2SysMLParser$stack.peek(), RESULT); + } + return CUP$Avatar2SysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 13: // expr ::= expr GEQ expr + { + String RESULT =null; + int lleft = (CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2)).left; + int lright = (CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2)).right; + String l = CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2).<String>value(); + int rleft = (CUP$Avatar2SysMLParser$stack.peek()).left; + int rright = (CUP$Avatar2SysMLParser$stack.peek()).right; + String r = CUP$Avatar2SysMLParser$stack.peek().<String>value(); + RESULT = l + " >= " + r; + CUP$Avatar2SysMLParser$result = parser.getSymbolFactory().newSymbol("expr",0, CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2), CUP$Avatar2SysMLParser$stack.peek(), RESULT); + } + return CUP$Avatar2SysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 14: // expr ::= expr EQ expr + { + String RESULT =null; + int lleft = (CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2)).left; + int lright = (CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2)).right; + String l = CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2).<String>value(); + int rleft = (CUP$Avatar2SysMLParser$stack.peek()).left; + int rright = (CUP$Avatar2SysMLParser$stack.peek()).right; + String r = CUP$Avatar2SysMLParser$stack.peek().<String>value(); + RESULT = l + " == " + r; + CUP$Avatar2SysMLParser$result = parser.getSymbolFactory().newSymbol("expr",0, CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2), CUP$Avatar2SysMLParser$stack.peek(), RESULT); + } + return CUP$Avatar2SysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 15: // expr ::= expr DIF expr + { + String RESULT =null; + int lleft = (CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2)).left; + int lright = (CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2)).right; + String l = CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2).<String>value(); + int rleft = (CUP$Avatar2SysMLParser$stack.peek()).left; + int rright = (CUP$Avatar2SysMLParser$stack.peek()).right; + String r = CUP$Avatar2SysMLParser$stack.peek().<String>value(); + RESULT = l + " != " + r; + CUP$Avatar2SysMLParser$result = parser.getSymbolFactory().newSymbol("expr",0, CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2), CUP$Avatar2SysMLParser$stack.peek(), RESULT); + } + return CUP$Avatar2SysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 16: // expr ::= LPAR expr RPAR + { + String RESULT =null; + int eleft = (CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-1)).left; + int eright = (CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-1)).right; + String e = CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-1).<String>value(); + RESULT = "(" + e + ")"; + CUP$Avatar2SysMLParser$result = parser.getSymbolFactory().newSymbol("expr",0, CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2), CUP$Avatar2SysMLParser$stack.peek(), RESULT); + } + return CUP$Avatar2SysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 17: // expr ::= IDENT LPAR RPAR + { + String RESULT =null; + int ileft = (CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2)).left; + int iright = (CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2)).right; + String i = CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2).<String>value(); + RESULT = methodSysMLname(i) + "()"; + CUP$Avatar2SysMLParser$result = parser.getSymbolFactory().newSymbol("expr",0, CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2), CUP$Avatar2SysMLParser$stack.peek(), RESULT); + } + return CUP$Avatar2SysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 18: // expr ::= IDENT LPAR exprlist RPAR + { + String RESULT =null; + int ileft = (CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-3)).left; + int iright = (CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-3)).right; + String i = CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-3).<String>value(); + int lleft = (CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-1)).left; + int lright = (CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-1)).right; + String l = CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-1).<String>value(); + RESULT = methodSysMLname(i) + "(" + l + ")"; + CUP$Avatar2SysMLParser$result = parser.getSymbolFactory().newSymbol("expr",0, CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-3), CUP$Avatar2SysMLParser$stack.peek(), RESULT); + } + return CUP$Avatar2SysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 19: // expr ::= CONSTANT + { + String RESULT =null; + int eleft = (CUP$Avatar2SysMLParser$stack.peek()).left; + int eright = (CUP$Avatar2SysMLParser$stack.peek()).right; + String e = CUP$Avatar2SysMLParser$stack.peek().<String>value(); + RESULT = e; + CUP$Avatar2SysMLParser$result = parser.getSymbolFactory().newSymbol("expr",0, CUP$Avatar2SysMLParser$stack.peek(), CUP$Avatar2SysMLParser$stack.peek(), RESULT); + } + return CUP$Avatar2SysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 20: // expr ::= IDENT + { + String RESULT =null; + int eleft = (CUP$Avatar2SysMLParser$stack.peek()).left; + int eright = (CUP$Avatar2SysMLParser$stack.peek()).right; + String e = CUP$Avatar2SysMLParser$stack.peek().<String>value(); + RESULT = attributeSysMLname(e); + CUP$Avatar2SysMLParser$result = parser.getSymbolFactory().newSymbol("expr",0, CUP$Avatar2SysMLParser$stack.peek(), CUP$Avatar2SysMLParser$stack.peek(), RESULT); + } + return CUP$Avatar2SysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 21: // exprlist ::= expr + { + String RESULT =null; + int eleft = (CUP$Avatar2SysMLParser$stack.peek()).left; + int eright = (CUP$Avatar2SysMLParser$stack.peek()).right; + String e = CUP$Avatar2SysMLParser$stack.peek().<String>value(); + RESULT = e; + CUP$Avatar2SysMLParser$result = parser.getSymbolFactory().newSymbol("exprlist",1, CUP$Avatar2SysMLParser$stack.peek(), CUP$Avatar2SysMLParser$stack.peek(), RESULT); + } + return CUP$Avatar2SysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 22: // exprlist ::= expr COMMA exprlist + { + String RESULT =null; + int eleft = (CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2)).left; + int eright = (CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2)).right; + String e = CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2).<String>value(); + int lleft = (CUP$Avatar2SysMLParser$stack.peek()).left; + int lright = (CUP$Avatar2SysMLParser$stack.peek()).right; + String l = CUP$Avatar2SysMLParser$stack.peek().<String>value(); + RESULT = e + ", " + l; + CUP$Avatar2SysMLParser$result = parser.getSymbolFactory().newSymbol("exprlist",1, CUP$Avatar2SysMLParser$stack.elementAt(CUP$Avatar2SysMLParser$top-2), CUP$Avatar2SysMLParser$stack.peek(), RESULT); + } + return CUP$Avatar2SysMLParser$result; + + /* . . . . . .*/ + default: + throw new Exception( + "Invalid action number "+CUP$Avatar2SysMLParser$act_num+"found in internal parse table"); + + } + } /* end of method */ + + /** Method splitting the generated action code into several parts. */ + public final java_cup.runtime.Symbol CUP$Avatar2SysMLParser$do_action( + int CUP$Avatar2SysMLParser$act_num, + java_cup.runtime.lr_parser CUP$Avatar2SysMLParser$parser, + java.util.Stack<java_cup.runtime.Symbol> CUP$Avatar2SysMLParser$stack, + int CUP$Avatar2SysMLParser$top) + throws java.lang.Exception + { + return CUP$Avatar2SysMLParser$do_action_part00000000( + CUP$Avatar2SysMLParser$act_num, + CUP$Avatar2SysMLParser$parser, + CUP$Avatar2SysMLParser$stack, + CUP$Avatar2SysMLParser$top); + } +} + +} diff --git a/src/main/java/avatartranslator/tosysmlv2/Avatar2SysMLSymbols.java b/src/main/java/avatartranslator/tosysmlv2/Avatar2SysMLSymbols.java new file mode 100644 index 0000000000000000000000000000000000000000..ad94b26ae42c286537485ed80a22f6064e5a387f --- /dev/null +++ b/src/main/java/avatartranslator/tosysmlv2/Avatar2SysMLSymbols.java @@ -0,0 +1,62 @@ + +//---------------------------------------------------- +// The following code was generated by CUP v0.11b 20210814 (GIT d69c832) +//---------------------------------------------------- + +package avatartranslator.tosysmlv2; + +/** CUP generated class containing symbol constants. */ +public class Avatar2SysMLSymbols { + /* terminals */ + public static final int GEQ = 14; + public static final int MOD = 6; + public static final int AND = 7; + public static final int LT = 11; + public static final int IDENT = 20; + public static final int PLUS = 2; + public static final int OR = 8; + public static final int CONSTANT = 21; + public static final int NOT = 15; + public static final int GT = 12; + public static final int COMMA = 19; + public static final int EOF = 0; + public static final int MULT = 4; + public static final int DIV = 5; + public static final int MINUS = 3; + public static final int error = 1; + public static final int EQ = 9; + public static final int LEQ = 13; + public static final int RPAR = 17; + public static final int LPAR = 16; + public static final int DIF = 10; + public static final int UMINUS = 18; + public static final String[] terminalNames = new String[] { + "EOF", + "error", + "PLUS", + "MINUS", + "MULT", + "DIV", + "MOD", + "AND", + "OR", + "EQ", + "DIF", + "LT", + "GT", + "LEQ", + "GEQ", + "NOT", + "LPAR", + "RPAR", + "UMINUS", + "COMMA", + "IDENT", + "CONSTANT" + }; + + /* non terminals */ + static final int exprlist = 1; + static final int expr = 0; +} + diff --git a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysML.java b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysML.java new file mode 100644 index 0000000000000000000000000000000000000000..62c4b1fd727add0fde8d63d1a419107ebc089c65 --- /dev/null +++ b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysML.java @@ -0,0 +1,1454 @@ +/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille + * + * ludovic.apvrille AT enst.fr + * + * This software is a computer program whose purpose is to allow the + * edition of TURTLE analysis, design and deployment diagrams, to + * allow the generation of RT-LOTOS or Java code from this diagram, + * and at last to allow the analysis of formal validation traces + * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP + * from INRIA Rhone-Alpes. + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + */ +/** + * Class AvatarFromSysML + * Creation: 20/06/2024 + * + * @author Sophie Coudert + * @version 0.1 20/06/2024 + */ +package avatartranslator.tosysmlv2; + +import java.io.FileReader; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.function.BiConsumer; + +import avatartranslator.*; +import avatartranslator.tosysmlv2.AvatarFromSysMLSyntax.*; +import static java_cup.runtime.ComplexSymbolFactory.*; +import java_cup.runtime.ComplexSymbolFactory; +import myutil.TraceManager; + +import static java.lang.System.out; +import static avatartranslator.AvatarTransition.*; + +/** Class AvatarFromSysML + * Creation: 20/06/2024 + * + * @author Sophie Coudert + * @version 0.1 20/06/2024 + * + * Building Avatar Models from Their SysML V2 description. This Class exports the main function that does this. Technically, + * the class implements the last step of this process, i.e. it builds Avatar models from abstract syntax trees build by AvatarSysMLParser. + */ +public class AvatarFromSysML { + /** the build Avatar specification, returned at the end of the building process */ + private AvatarSpecification avSpec; + /** the source abstract syntax tree, obtained through a call to the parser */ + private StxModel stxSpec; + /** maps signal syntactic elements to their associated avatar signal by the building process */ + private HashMap<StxSignal, AvatarSignal> signalMap; + /** maps block syntactic elements to their associated avatar block by the building process */ + private HashMap<StxBlock, AvatarBlock> blockMap; + /** maps state syntactic elements to their associated avatar state-machine element by the building process (when exists) */ + private HashMap<StxState, AvatarStateMachineElement> stateMap; + /** maps Avatar state-machine elements to their associated set of incoming transitions and their block. + * <p>filled while handling blocks. Used thereafter to check some well-formedness constraints such as reachability... </p> */ + private HashMap<AvatarStateMachineElement, StateTransitions> transitionMap; + /** maps Avatar datatypes extracted from the SysML sourse to their sequence of primitive fields */ + private HashMap<AvatarDataType, AvatarDataTypePrimitiveFields> primitiveFieldsMap; + /** all errors encountered while parsing and building model from parsing-returned abstract syntax tree */ + private List<AvatarFromSysMLError> errors; + + public AvatarFromSysML(){ + avSpec = null; + stxSpec = null; + signalMap = new HashMap<StxSignal, AvatarSignal>(); + blockMap = new HashMap<StxBlock, AvatarBlock>(); + stateMap = new HashMap<StxState, AvatarStateMachineElement>(); + transitionMap = new HashMap<AvatarStateMachineElement, StateTransitions>(); + errors = null; + } + + /** register an error encountered while parsing and building model from parsing-returned abstract syntax tree */ + private void addError(AvatarFromSysMLError _err) { errors.add(_err); } + + /** to memorize the set of transitions of a state and memorize its block with them */ + private class StateTransitions { + private AvatarBlock block; + private List<AvatarTransition> transitions; + public StateTransitions (AvatarBlock _block, List<AvatarTransition> _transitions) { + block = _block; + transitions = _transitions; + } + public AvatarBlock getBlock() { return block; } + public List<AvatarTransition> getTransitions() { return transitions; } + } + + /** Builds an Avatar Specification from an Avatar SysML V2 description provided in a file. + * If errors are found, they are printed using TraceManager.addDev before returning + */ + public AvatarSpecification sysMLtoSpec(String _fileName) { + + // Initialize parser + AvatarFromSysMLParser parser; + try { parser = + new AvatarFromSysMLParser(new AvatarFromSysMLLexer(new FileReader(_fileName)), + new ComplexSymbolFactory()); } + catch (java.lang.Exception e) { + e.printStackTrace(out); + return new AvatarSpecification("DummySpec", null); + } + + // Run parser and get parser errors + TraceManager.addDev("Parsing Model"); + try { stxSpec = parser.parseModel(); } + catch (java.lang.Exception e) { + e.printStackTrace(out); + return new AvatarSpecification("DummySpec", null); + } + if (stxSpec == null) { + for(AvatarFromSysMLError e : parser.getErrors()) + TraceManager.addDev(e.toString()); + return new AvatarSpecification("DummySpec", null); + } + errors = stxSpec.getErrors(); + + // Build Specification from parser-returned abstract syntax tree. + try { + TraceManager.addDev("Building Specification"); + avSpec = new AvatarSpecification("FromSysMLV2_EXAMPLE_SPECIFICATION", null); + signalMap.clear(); + blockMap.clear(); + stateMap.clear(); + TraceManager.addDev("Building DataTypes"); + buildDataTypes(); + TraceManager.addDev("Building Blocks"); + buildBlocks(); + TraceManager.addDev("Building Relations"); + buildRelations(); + } + catch (Exception ex) { + for(AvatarFromSysMLError e : errors) + TraceManager.addDev(e.toString()); + throw ex; + } + // TODO: move error handling + for(AvatarFromSysMLError e : errors) + TraceManager.addDev(e.toString()); + + return avSpec; + } + + /** initialize a state entry in the map that associates outgoing transitions to state-machine elements */ + private void addState(AvatarStateMachineElement e, AvatarBlock b) { + if (transitionMap.get(e) == null){ + ArrayList<AvatarTransition> l = new ArrayList<AvatarTransition>(); + transitionMap.put(e, new StateTransitions(b, l)); + } + } + + /** add an outgoing transition to a state in the map that associates outgoing transitions to state-machine elements */ + private void addTransition(AvatarTransition t, AvatarStateMachineElement e) { + transitionMap.get(e).getTransitions().add(t); + } + + /** get the Avatar block associated to a block syntactic element. Create it if necessary (and create entry in the map) */ + private AvatarBlock getBlock(StxBlock _b) { + AvatarBlock b = blockMap.get(_b); + if (b == null) { + b = new AvatarBlock(_b.getName(), avSpec, null); + blockMap.put(_b, b); + } + return b; + } + + /** get the Avatar signal associated to a signal syntactic element. Create it if necessary (and create entry in the map) */ + private AvatarSignal getSignal(StxSignal _b) { + AvatarSignal b = signalMap.get(_b); + if (b == null) { + if (_b.isInput()) + b = new AvatarSignal(_b.getName(), AvatarSignal.IN, null); + else + b = new AvatarSignal(_b.getName(), AvatarSignal.OUT, null); + signalMap.put(_b, b); + } + return b; + } + + /* not used........... + private AvatarAttribute getOriginalAttributeByName(String _name, AvatarBlock _block) { + List<AvatarAttribute> l = _block.getOriginalAttributes(); + int size = l.size(); + for (int i = 0; i < size; i++) + if(l.get(i).getName().equals(_name)) return l.get(i); + return null; + } + */ + + /** get the basic attribute associated to a name (possibly with "__") in a block */ + private AvatarAttribute getAttributeByName(String _name, AvatarBlock _block) { + List<AvatarAttribute> l = _block.getAttributes(); + int size = l.size(); + for (int i = 0; i < size; i++) + if(l.get(i).getName().equals(_name)) return l.get(i); + return null; + } + + /** get the basic attribute associated to a timer in a block */ + private AvatarAttribute getTimerByName(String _name, AvatarBlock _block) { + AvatarAttribute res = getAttributeByName(_name, _block); + if (res != null && res.getType() == AvatarType.TIMER) return res; + return null; + } + + /** get the Avatar state-machine element associated to a state syntactic element. Create it if necessary (and create entry in the map) + * + * <p> The creation process may use different state-machine element constructors (sub-classes) depending on the type of + * the syntactic state.</p> + * <p> States that have been technically added (STXPRESENDSTATEs and STXPRERECEIVESTATEs) are not handled as they have no correspondant + * state-machine element in the Avatar Model.</p> + * :*/ + private AvatarStateMachineElement getState(StxState _s, AvatarBlock _b) { + AvatarStateMachineElement s = stateMap.get(_s); + if (s == null) { + switch(_s.getType()) { + case AvatarFromSysMLSyntax.STXSTARTSTATE : + s = new AvatarStartState("StartState", null, _b); + break; + case AvatarFromSysMLSyntax.STXSTANDARDSTATE : + s = new AvatarState(_s.getName(), null, _b); + break; + case AvatarFromSysMLSyntax.STXRANDOMSTATE : + s = new AvatarRandom(_s.getName(), null, _b); + break; + case AvatarFromSysMLSyntax.STXCOUNTSTATE : + s = new AvatarQueryOnSignal(_s.getName(), getSignal(_s.getSignal()), + getAttributeByName(_s.getVariable().replaceAll("\\.", "__"),_b), null, _b); + break; + case AvatarFromSysMLSyntax.STXSTOPSTATE : + case AvatarFromSysMLSyntax.STXSENDSTATE : + case AvatarFromSysMLSyntax.STXRECEIVESTATE : + s = new AvatarActionOnSignal(_s.getName(), null, null, _b); + break; + case AvatarFromSysMLSyntax.STXPRESENDSTATE : + case AvatarFromSysMLSyntax.STXPRERECEIVESTATE : + addError(new AvatarFromSysMLError(AvatarFromSysMLError.BUGERROR, null, + "adding precom state (AvatarFromSysML.getState)", null)); + break; + case AvatarFromSysMLSyntax.STXSETTIMERSTATE : + s = new AvatarSetTimer(_s.getName(), null, _b); + break; + case AvatarFromSysMLSyntax.STXRESETTIMERSTATE : + s = new AvatarResetTimer(_s.getName(), null, _b); + break; + case AvatarFromSysMLSyntax.STXEXPIRETIMERSTATE : + s = new AvatarExpireTimer(_s.getName(), null, _b); + } + if (s != null) stateMap.put(_s, s); + } + return s; + } + + // BUILDING DATATYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + /** To be run on the (filled by parsing) maps that associates syntactic datatypes to their names + * + * <p> This creates-and-adds-to-avSpec the AvatarDataType corresponding to the syntactic datatype. </p> + * <p> datatypes associated to datatype-typed fields cannot be set as here, the complete list + * of datatypes (which is required for this) is not + * known. Thus this setting is delayed.</p> + * <p> To make this delayed setting easier, two informations are collected while iterating on entries:</p> + * <ul> + * <li> a mapping of the attribute to be later completed to the name of their expected datatype </li> + * <li> a mapping of the datatype names to the build AvatarDataTypes </li> + * </ul> + * */ + private class BuildDataType implements BiConsumer<String, StxDataType> { + private HashMap<String,AvatarDataType> dataTypeMap; + private HashMap<AvatarAttribute,String> attributeMap; + + /** parameters of the constructor are the maps to fill while iterating on entries */ + public BuildDataType(HashMap<String,AvatarDataType> _dataTypeMap, HashMap<AvatarAttribute,String> _attributeMap) { + dataTypeMap = _dataTypeMap; + attributeMap = _attributeMap; + } + + /** create and add the datatype to avSpec. updates dataTypeMap, and attributeMap for each encountered datatype-typed field. */ + public void accept(String n, StxDataType d) { + AvatarDataType dataType = new AvatarDataType(d.getName(),null); + avSpec.addDataType(dataType); + dataTypeMap.put(d.getName(), dataType); + int nbFields = d.getSize(); + for (int i = 0; i < nbFields; i++) { + StxField f = d.getField(i); + String type = f.getType(); + AvatarAttribute aa; + if(type.equals("Integer")) + aa = new AvatarAttribute(f.getName(),AvatarType.INTEGER,null,null); + else if(type.equals("Boolean")) + aa = new AvatarAttribute(f.getName(),AvatarType.BOOLEAN,null,null); + else { + aa = new AvatarAttribute(f.getName(), AvatarType.UNDEFINED, null, null); + attributeMap.put(aa, type); + } + String initVal = f.getInitialValue().trim(); + if(f.getDefaultValue() && initVal.equals(aa.getType().getDefaultInitialValue())) + aa.setInitialValue(""); + else aa.setInitialValue(initVal); + + dataType.addAttribute(aa); + } + } + } + + /** to be run on the map that maps datatype-typed datatype fields to the name of their typing datatype. Using the (to-constructor) + * provided map from names to Avatar datatypes, accept find the associated datatype and update the field with it. */ + private class CompleteDataTypeAttribute implements BiConsumer<AvatarAttribute,String> { + HashMap<String,AvatarDataType> dataTypeMap; + public CompleteDataTypeAttribute(HashMap<String,AvatarDataType> _dataTypeMap) { dataTypeMap = _dataTypeMap;} + + public void accept(AvatarAttribute aa, String dt) { + AvatarDataType adt = dataTypeMap.get(dt); // find the associated datatype + if (adt == null) { + errors.add(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, "datatype " + dt + " in datatype field " + + aa.getName() + " is undefined")); + aa.setType(AvatarType.INTEGER); // should not be used... + } + else aa.setDataType(adt);} // update the field with it + } + + /** fills avSpec's list of Avatar datatypes from stxSpec's list of syntactic datatypes. Then, computes and updates primitiveFieldsMap. + * + * <p> Process with two steps:</p> + * <ul> + * <li> invoke BuildDataType to build and add the datatypes, but not set the datatype attribute of datatype-typed fields. Memorize + * information to do this later </li> + * <li> invoke CompleteDataTypeAttribute to do this delayed job with provided information: a mapping of these fields to the name of their + * datatype type, and a mapping of these datatype names to their associated AvatarDataType structure. + * </li> + * </ul> + * <p> A mapping of all datatypes to their extended list of basic fields is then computed and assigned to primitiveFieldsMap </p> + * <p> During this process, errors may be collected </p> + */ + private void buildDataTypes(){ + List<AvatarDataType> dtList = avSpec.getDataTypes(); // the list to fill + HashMap<String,AvatarDataType> dataTypeMap = new HashMap<String,AvatarDataType>(); + HashMap<AvatarAttribute,String> attributeMap = new HashMap<AvatarAttribute,String>(); + stxSpec.getDataTypeMap().forEach(new BuildDataType(dataTypeMap, attributeMap)); + attributeMap.forEach(new CompleteDataTypeAttribute(dataTypeMap)); + + List<String> err = new ArrayList<String>(); + primitiveFieldsMap = AvatarDataTypePrimitiveFields.buildMap(dtList, err); + for(String e : err) errors.add(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR,e)); + } + + + // BUILDING BLOCKS (but not statemachines) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + /** To be run on the (filled by parsing) maps that associates block names to syntactic blocks. + * + * <p> this create-and-add-to-avSpec all the corresponding AvatarBlocks and fills their static declarative part (attributes, signals, methods) + * but not their state-machine. Building state-machines requires the static declarations of all hierarchically containing blocks to be up to date + * (to find used signals) and thus is delayed after the iteration of BuildBlock. + * </p> + */ + private class BuildBlock implements BiConsumer<String, StxBlock> { + public BuildBlock(){} + public void accept(String n, StxBlock blk) { + if (!blk.isDeclared()) { + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, + "block " + blk.getName() +"has been used but has not been declared")); + return; + } + + // create and add the block...................................... + AvatarBlock theBlock = getBlock(blk); // create + avSpec.addBlock(theBlock); // add + + // set father...................................... + StxBlock fth = blk.getFather(); + if (fth != null) theBlock.setFather(getBlock(fth)); + + // add Attributes...................................... + int size = blk.getNbAttributes(); + for (int i = 0; i < size; i++) { + + StxAttribute a = blk.getAttribute(i); + String initVal = a.getInit().trim(); + AvatarAttribute aa; // for original attributes + AvatarAttribute ax; // for extended basic attributes + + if (a.getType().equals("Integer")) { + aa = new AvatarAttribute(a.getName(), AvatarType.INTEGER, theBlock, null); + ax = new AvatarAttribute(a.getName(), AvatarType.INTEGER, theBlock, null); + if(a.getDefaultValue() && initVal.equals(AvatarType.INTEGER.getDefaultInitialValue())) + initVal = ""; + aa.setInitialValue(initVal); + ax.setInitialValue(initVal); + theBlock.addAttribute(ax); + ax.setAsConstant(false); + } + else if (a.getType().equals("Boolean")) { + aa = new AvatarAttribute(a.getName(), AvatarType.BOOLEAN, theBlock, null); + ax = new AvatarAttribute(a.getName(), AvatarType.BOOLEAN, theBlock, null); + if(a.getDefaultValue() && initVal.equals(AvatarType.BOOLEAN.getDefaultInitialValue())) + initVal = ""; + aa.setInitialValue(initVal); + ax.setInitialValue(initVal); + theBlock.addAttribute(ax); + ax.setAsConstant(false); + } + else { + aa = new AvatarAttribute(a.getName(), AvatarType.UNDEFINED, theBlock, null); + AvatarDataType adt = avSpec.getDataTypeByName(a.getType()); + aa.setDataType(adt); + String aaName = a.getName() + "__"; + AvatarDataTypePrimitiveFields primitiveFields = primitiveFieldsMap.get(adt); + // add basic attributes corresponding of the extension of the datatype + int dtsize = primitiveFields.size(); + for (int j = 0; j < dtsize; j++) { + ax = new AvatarAttribute(aaName + primitiveFields.getName(j), + primitiveFields.getType(j), theBlock, null); + theBlock.addAttribute(ax); + ax.setAsConstant(false); + } + } + theBlock.addOriginalAttribute(aa); + aa.setAsConstant(false); + } + + // add Constants...................................... + size = blk.getNbConstants(); + for (int i = 0; i < size; i++) { + StxAttribute a = blk.getConstant(i); + String initVal = a.getInit().trim(); + AvatarAttribute aa = null; + AvatarAttribute ax; + if (a.getType().equals("Integer")) { + aa = new AvatarAttribute(a.getName(), AvatarType.INTEGER, theBlock, null); + theBlock.addOriginalAttribute(aa); + aa.setAsConstant(true); + ax = new AvatarAttribute(a.getName(), AvatarType.INTEGER, theBlock, null); + theBlock.addAttribute(ax); + ax.setAsConstant(true); + if(a.getDefaultValue() && initVal.equals(AvatarType.INTEGER.getDefaultInitialValue())) + initVal = ""; + aa.setInitialValue(initVal); + ax.setInitialValue(initVal); + } + else if (a.getType().equals("Boolean")) { + aa = new AvatarAttribute(a.getName(), AvatarType.BOOLEAN, theBlock, null); + theBlock.addOriginalAttribute(aa); + aa.setAsConstant(true); + ax = new AvatarAttribute(a.getName(), AvatarType.BOOLEAN, theBlock, null); + theBlock.addAttribute(ax); + ax.setAsConstant(true); + if(a.getDefaultValue() && initVal.equals(AvatarType.BOOLEAN.getDefaultInitialValue())) + initVal = ""; + aa.setInitialValue(initVal); + ax.setInitialValue(initVal); + } + else + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, + a.getLeft(), "datatype for constants is not supported", null)); + } + + // add Timers...................................... + size = blk.getNbTimers(); + for (int i = 0; i < size; i++) { + AvatarAttribute aa = new AvatarAttribute(blk.getTimer(i).getName(), AvatarType.TIMER, theBlock, null); + theBlock.addOriginalAttribute(aa); + aa.setAsConstant(false); + aa = new AvatarAttribute(blk.getTimer(i).getName(), AvatarType.TIMER, theBlock, null); + theBlock.addAttribute(aa); + aa.setAsConstant(false); + } + + // add Methods...................................... + size = blk.getNbMethods(); + for (int i = 0; i < size; i++) { + + StxMethod sm = blk.getMethod(i); + // create method + AvatarMethod am = new AvatarMethod(sm.getName(),null); + // add method + theBlock.addMethod(am); + // add input parameters to method + buildProfile(sm, am, theBlock); + + // handle return type + String returnType = sm.getReturnType(); + + if (returnType == null || returnType.length() == 0) continue; // no return type, void method + + if (returnType.equals("Integer")) { // return integer + am.addReturnParameter(new AvatarAttribute("return__0", AvatarType.INTEGER, theBlock, null)); + am.addOriginalReturnParameter(new AvatarAttribute("return__", AvatarType.INTEGER, theBlock, null)); + } + else if (returnType.equals("Boolean")) { // return boolean + am.addReturnParameter(new AvatarAttribute("return__0", AvatarType.BOOLEAN, theBlock, null)); + am.addOriginalReturnParameter(new AvatarAttribute("return__", AvatarType.BOOLEAN, theBlock, null)); + } + else { // return datatype + // find datatype + AvatarDataType adt = avSpec.getDataTypeByName(returnType); + if (adt == null) + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, sm.getLeft(), + "unknown type for method return parameter", null)); + AvatarAttribute ret = new AvatarAttribute("return__", AvatarType.UNDEFINED, theBlock, null); + // set datatype + ret.setDataType(adt); + am.addOriginalReturnParameter(ret); + // extend datatype to a list of primitive basic fields + AvatarDataTypePrimitiveFields primitiveFields = primitiveFieldsMap.get(adt); + int dtsize = primitiveFields.size(); + for (int j = 0; j < dtsize; j++) { + ret = new AvatarAttribute("return__" + j, + primitiveFields.getType(j), theBlock, null); + am.addReturnParameter(ret); + } + } + } + + // add Signals .............................. + size = blk.getNbSignals(); + for (int i = 0; i < size; i++) { + StxSignal ss = blk.getSignal(i); + AvatarSignal as = getSignal(ss); // create signal + if (!ss.isDeclared()) { + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, ss.getLeft(), + "signal " + theBlock.getName() + "." + ss.getName() + " has not been declared")); + continue; + } + theBlock.addSignal(as); // add signal + StxChannel ch = ss.getChannel(); + if (ch == null) { + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, ss.getLeft(), + "channel of signal " + ss.getName() + " has not been set")); + continue; + } + if (!ch.isDeclared()) { + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, ss.getLeft(), + "channel of signal " + theBlock.getName() + "." + ss.getName() + " has not been declared")); + continue; + } + if (ss.isInput()) { + StxInMessage im = ss.getChannel().getInProfile(); // profile is channel's in profile + if (im == null) { + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, ss.getLeft(), + "input profile of signal " + ss.getName() + " has not been set")); + continue; + } + buildProfile(im, as, theBlock); // add input signal parameters + } + else { + StxOutMessage om = ss.getChannel().getOutProfile(); // profile is channel's out profile + if (om == null) { + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, ss.getLeft(), + "output profile of signal " + ss.getName() + " has not been set")); + continue; + } + buildProfile(om, as, theBlock); // add output signal parameters + } + } + } + } + /** + * <p></p> */ + + /** To be run on the maps that associates block names to syntactic blocks, after the iteration of BuildBlock (which creates AvatarBlocks + * and fills their static part: attributes, methods, timers, signals). + * + * <p> accept updates the AvatarBlock associated to the handled syntactic block by computing and setting its state-machine. </p> + */ + private class BuildStateMachine implements BiConsumer<String, StxBlock> { + public BuildStateMachine(){} + + /** updates the AvatarBlock associated to the handled StxBlock by computing and setting its state-machine */ + public void accept(String n, StxBlock blk) { + + AvatarBlock theBlock = getBlock(blk); // get relevant block + AvatarStateMachine asm = theBlock.getStateMachine(); // get state-machine to fill + // initialize map that maps states to their sequence of incomming transitions, and block + // filled while handling blocks. Used thereafter to check some well-formedness constraints + transitionMap.clear(); + + AvatarStateMachineElement theSourceState; // technical variable + AvatarStartState startState = null; + Location startStateLocation = null; + + // iterate on syntactic states of the syntactic block + // - build statemachine + // - fills transitionMap for a final check. + StxState[] states = blk.getStates(); + int size = (states == null ? 0 : states.length); + for (int i = 0; i < size; i++) { + + // identify current state type + byte stateType = states[i].getType(); + boolean undeclaredState = false; + if (! states[i].isDeclared()) { // in this case, stateType may be null + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, + "state " + theBlock.getName() + "." + states[i].getName() + " is used but not declared")); + stateType = AvatarFromSysMLSyntax.STXSTANDARDSTATE; + undeclaredState = true; + } + + // handle all states that have a unique corresponding avatar state-machine element (others are handled indirectly) + if (stateType != AvatarFromSysMLSyntax.STXPRESENDSTATE && // STXPRESENDSTATEs disappear in avatar final model + stateType != AvatarFromSysMLSyntax.STXPRERECEIVESTATE && // STXPRERECEIVESTATEs disappear in avatar final model + stateType != AvatarFromSysMLSyntax.STXSTOPSTATE ) { // STXSTOPSTATE: special handling: several associated avatar elements + + if (undeclaredState) { // try to recover and continue + states[i].setType(AvatarFromSysMLSyntax.STXSTANDARDSTATE); + } + + // create the handled state, which is the source state of outgoing transitions that will be handled + theSourceState = getState(states[i], theBlock); + + // two state types that require some specific transition-independent handling + if (stateType == AvatarFromSysMLSyntax.STXRANDOMSTATE) { + ((AvatarRandom) theSourceState).setOriginalValues(states[i].getMinValue(), states[i].getMaxValue()); + ((AvatarRandom) theSourceState).setValues( + states[i].getMinValue().replaceAll("\\.", "__"), + states[i].getMaxValue().replaceAll("\\.", "__")); + ((AvatarRandom) theSourceState).setVariable(states[i].getVariable().replaceAll("\\.", "__")); + } else if (stateType == AvatarFromSysMLSyntax.STXSTARTSTATE) + if (startState == null) { + startState = (AvatarStartState) theSourceState; + startStateLocation = states[i].getLeft(); + asm.setStartState(startState); + } else { + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, states[i].getLeft(), + "several start-states declared, only one is kept", startStateLocation)); + continue; + } + + // add the handled state................. + addState(theSourceState, theBlock); + asm.addElement(theSourceState); + + // build and add transitions......................................... + + // get outgoing transitions list + List<StxTransition> transitions = states[i].getTransitions(); + int tsize = transitions.size(); + if (tsize > 1 && stateType != AvatarFromSysMLSyntax.STXSTANDARDSTATE) { // Avatar well-formedness constraint broken + tsize = 1; // recover to continue + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, states[i].getTransitions().get(1).getLeft(), + "state " + states[i].getName() + " only accept one single outgoing transition", + states[i].getTransitions().get(1).getRleft())); + } + + // iterate on outgoing transitions + for (int j = 0; j < tsize; j++) { + StxTransition transition = transitions.get(j); + + // skip some transition that have not been fully defined during parsing + if (transition == null) { + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, states[i].getLeft(), + "something is wrong in state " + states[i].getName() + " : null transition found")); + continue; + } + if (! transition.isDeclared()) { + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, transition.getRleft(), + "transition request in state " + states[i].getName() + " of block " + theBlock.getName() + + " has no associated declaration" )); + continue; + } + if (! transition.isRequested()) { + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, transition.getLeft(), + "transition has no request in state " + states[i].getName())); + continue; + } + + // create and fills the transition (only added at the end if no critical error occurs) + AvatarTransition theTransition = new AvatarTransition(theBlock,"", null); + + // handle guard + if (transition.getGuard() != null) { + theTransition.setGuard( + "[" + transition.getGuard().replaceAll("\\.", "__") + "]", + "[" + transition.getGuard() + "]"); + } + + // handle delay + String minDelay = transition.getMinDelay().trim(); + String maxDelay = transition.getMaxDelay().trim(); + if (minDelay.equals(maxDelay)) maxDelay = ""; + theTransition.setDelays( + minDelay.replaceAll("\\.", "__"), + maxDelay.replaceAll("\\.", "__"), + minDelay, + maxDelay); + + // handle distribution law and priority + setDistributionLaw(theTransition, transition.getDelayDistributionLaw(),transition.getDelayExtra(), transition); + theTransition.setProbability(transition.getProbability()); + + // handle actions: iterate on them and add them + List<StxAction> actions = transition.getActions(); + int asize = actions.size(); + for (int k = 0; k < asize; k++) { // iterate on transition's actions + + StxAction action = actions.get(k); + + // Assignment action .............. + if(action.getType() == AvatarFromSysMLSyntax.STXASSIGNACTION){ + + // compute left hand + String originalLeftHandStr = action.getTarget(); // get assigned variable + // compute tuple string "(x__field1, ..., x__fieldN)" if variable has a datatype type + String leftHandStr = extendIdent(action.getTarget().replaceAll("\\.", "__"), blk); + + // compute right hand + String originalRightHandStr; + String rightHandStr; // + StxTerm value = action.getValue(); + if (value instanceof StxId) { // value is a variable (potentially field) ident + originalRightHandStr = ((StxId)value).toString(); + rightHandStr = ((StxId)value).toString().replaceAll("\\.", "__"); + } + else if (value instanceof StxExpr){ // value is an int/bool expression + originalRightHandStr = ((StxExpr)value).toString(); + rightHandStr = ((StxExpr)value).toString().replaceAll("\\.", "__"); + } + else { // value is a method call + originalRightHandStr = extendOriginalCall((StxCall)value,blk); // rebuilds original string + rightHandStr = extendCall((StxCall)value,blk); // rebuilds while extending datatype variables + } + // add the action + theTransition.addAction(leftHandStr + "=" + rightHandStr, + originalLeftHandStr + "=" + originalRightHandStr); + } + // method call action ................... + else { // STXMETHODACTION + if (action.getValue() instanceof StxCall) { // else ERROR, action ignored + // rebuilds original string + String originalTermStr = extendOriginalCall((StxCall)action.getValue(),blk); + // rebuilds while extending datatype variables + String termStr = extendCall((StxCall)action.getValue(),blk); + // add the action + theTransition.addAction(termStr, originalTermStr); + } + } + } + + // Handles transition target. + // Depends on target type. + // Also checks compatibility constraints between transition and target types. + + if (transition.getTarget() == null) { // unrecoverable, transition skiped + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, transition.getRleft(), + "something is wrong in transition : no target defined", transition.getLeft())); + continue; + } + + // handle transition to an added state as target that disappear in avatar + // produced transition must then lead to the target of the single outgoing transition of the removed state + + if (transition.getTarget().getType() == AvatarFromSysMLSyntax.STXPRESENDSTATE || + transition.getTarget().getType() == AvatarFromSysMLSyntax.STXPRERECEIVESTATE) { // target must be removed + + if (transition.getTarget().getTransitions().size() == 0 || + transition.getTarget().getTransition(0) == null) { // target has no outgoing transition, unrecoverable + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, transition.getTarget().getLeft(), + "something is wrong in precommunication state " + transition.getTarget().getName() + + " : no outgoing transition")); + continue; + } + + byte type = transition.getTarget().getType(); // type of the state to remove + // get second transition (outgoing from removed target) to complete the single produced avatar transition + transition = transition.getTarget().getTransition(0); + // TODO: check errors: this transition must not have actions, delays,... not verified. if exist, these data are skipped + + // check type compatibility between this transition and its source (the removed state). error -> unrecoverable + if (type == AvatarFromSysMLSyntax.STXPRESENDSTATE & // expects some sending state + ! ( ( transition.getTarget().getType() == AvatarFromSysMLSyntax.STXSENDSTATE && + transition.getType() == AvatarFromSysMLSyntax.STXSENDTRANSITION ) || + ( transition.getTarget().getType() == AvatarFromSysMLSyntax.STXSETTIMERSTATE && + transition.getType() == AvatarFromSysMLSyntax.STXSETTIMERTRANSITION ) || + ( transition.getTarget().getType() == AvatarFromSysMLSyntax.STXRESETTIMERSTATE && + transition.getType() == AvatarFromSysMLSyntax.STXRESETTIMERTRANSITION ) )) { + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, transition.getTarget().getLeft(), + "outgoing transitions from pre-send state must be sending transitions leading to some sending state " + + "(send/set timer /reset timer)", transition.getLeft())); + continue; + } + else if (type == AvatarFromSysMLSyntax.STXPRERECEIVESTATE & // expects some receiving state + ! ( ( transition.getTarget().getType() == AvatarFromSysMLSyntax.STXRECEIVESTATE && + transition.getType() == AvatarFromSysMLSyntax.STXRECEIVETRANSITION ) || + ( transition.getTarget().getType() == AvatarFromSysMLSyntax.STXEXPIRETIMERSTATE && + transition.getType() == AvatarFromSysMLSyntax.STXEXPIRETIMERTRANSITION ) )) { + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, transition.getTarget().getLeft(), + "outgoing transitions from pre-reveive state must be sending transitions leading to some " + + "receivinging state (receive/expire timer)", transition.getLeft())); + continue; + } + } + + // from here, the target of avatar transition under building is the state-machine element associated + // to the target of variable transition + + // handle transition target....... + AvatarStateMachineElement tgtState; // target of Avatar Transition + + if (transition.getTarget().getType() == AvatarFromSysMLSyntax.STXSTOPSTATE) { + // special case: a different Avatar stopstate target for each transition to the unique syntactic stopstate + if (transition.getTarget().getTransitions().size() != 0) { + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, transition.getTarget().getLeft(), + "stopstate should not have outgoing transitions")); + } + tgtState = new AvatarStopState("StopState", null, theBlock); // create the stopstate + } + else // standard case + tgtState = getState(transition.getTarget(), theBlock); + + addState(tgtState, theBlock); // initialize the map-to-incomming-transitions for the target state + + // type dependent transition handling (transition and target types) + error detections + byte tgtType = transition.getTarget().getType(); + + // sending transitions ===================== + if (transition.getType() == AvatarFromSysMLSyntax.STXSENDTRANSITION) { + if(tgtState instanceof AvatarActionOnSignal) { // required + AvatarActionOnSignal state = (AvatarActionOnSignal)tgtState; + + // some unrecovered errors (transition skiped) + if (transition.getSignal() == null) { + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, transition.getRleft(), + "sending transition should have an associated signal", transition.getLeft())); + continue; + } + state.setSignal( getSignal(transition.getSignal())); + if (state.getSignal().isIn()) { + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, transition.getRleft(), + "signal of sending transition must be an output signal", transition.getSignal().getLeft())); + continue; + } + if (! transition.getSignal().isDeclared()) { + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, transition.getRleft(), + "transition uses a signal " + transition.getSignal().getName() + " that has not been declared")); + continue; + } + + ArrayList<StxTerm> sendPayload = transition.getSendPayload(); + if (sendPayload != null) { // add payload info to target state (renamed "state") + int nbParam = sendPayload.size(); + for(int u = 0; u < nbParam; u++) { // iterate on payload parameter list + StxTerm p = sendPayload.get(u); + + if (p instanceof StxId) { // parameter is an attribute (field) identifier + state.addOriginalValue(p.toString()); + String[] ids; + // extends parameter if datatpe: "x__field1, ..., x__fieldN" (if well typed) + String extendedPath = extendPath(p.toString().replaceAll("\\.", "__"), blk); + if (extendedPath == null) { // parameter cannot be typed + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, p.getLeft(), "attribute \"" + + p.toString() + "\" cannot be typed")); + // recover w.r.t. expected type to continue, while providing information + AvatarDataType adt = state.getSignal().getListOfOriginalAttributes().get(u).getDataType(); + if (adt == null) { // basic type, keep parameter unchanged + ids = new String[1]; + ids[0] = p.toString(); + } else { // datatype, extend parameter with fields (although not well typed) + ids = extendName(p.toString().replaceAll("\\.", "__"),adt).split(","); + } + } + else // parameter has been typed (not verified that it is the expected type) + ids = extendedPath.split(","); + + // add parameter to ActionOnSignal state + int isize = ids.length; + for (int w = 0; w < isize; w++) state.addValue(ids[w]); + } + + else if (p instanceof StxExpr) { // parameter is an int/bool expression, basic type + state.addOriginalValue( p.toString() ); + state.addValue( p.toString().replaceAll("\\.", "__")); + } + else { // parameter is a method call + state.addOriginalValue(extendOriginalCall((StxCall)p,blk)); // rebuild original string + state.addValue(extendCall((StxCall)p,blk)); // rebuild while extending datatype-typed variable + } + } + } + } + else { // unrecovered error, skip transition + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, transition.getLeft(), + "sending transition should lead to a send state", transition.getRleft())); + continue; + } + } + + // receiving transitions ===================== + else if (transition.getType() == AvatarFromSysMLSyntax.STXRECEIVETRANSITION) { + if(tgtState instanceof AvatarActionOnSignal) { // expected + AvatarActionOnSignal state = (AvatarActionOnSignal)tgtState; + + // some unrecovered errors (transition skiped) + if (transition.getSignal() == null) { + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, transition.getRleft(), + "receiving transition should have an associated signal", transition.getLeft())); + continue; + } + state.setSignal(getSignal(transition.getSignal())); + + if (! transition.getSignal().isDeclared()) { + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, transition.getRleft(), + "transition uses a signal " + transition.getSignal().getName() + " that has not been declared")); + continue; + } + if (state.getSignal().isOut()) { + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, transition.getRleft(), + "signal of receiving transition must be an input signal", transition.getSignal().getLeft())); + continue; + } + if (transition.getSignal().getChannel() == null) { + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, transition.getRleft(), + "signal of receiving transition doesn't have an associated channel", transition.getSignal().getLeft())); + continue; + } + + // update target state (renamed "state") with assigned attributes (fields) + + List<AvatarAttribute> profile = state.getSignal().getListOfOriginalAttributes(); + if (profile != null && !profile.isEmpty()) { // signal conveys values (otherwise, nothing to do) + + // map that maps parameter names to string denoting the attributes (fields) to assign + HashMap<String, String> receivePayload = transition.getReceivePayload(); + + int nbParams = profile.size(); + for (int k = 0; k < nbParams; k++) { // iterate on receiving profile parameters + AvatarAttribute aa = profile.get(k); // parameter name and type + String value; // to receive name of attribute (field) to assign with parameter + + if (aa == null) { // parameter has not been correctly defined while parsing + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, transition.getLeft(), + "parameter " + k + " of signal " + state.getSignal().getName() + + " is not well defined")); + value = ""; // default, because no way to identify target variable + } else { // parameter well defined + value = receivePayload.get(aa.getName()); + if (value == null) { // target variable undefined + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, transition.getLeft(), + "receiving transition has a missing field")); + value = ""; + } + } + state.addOriginalValue(value); + + // add basic primitive attributesextend value w.r.t + + String[] ids; + // extend value w.r.t its datatype if relevant + String extendedPath = extendPath(value.replaceAll("\\.", "__"), blk); + if (extendedPath == null) { // value cannot be typed + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, transition.getLeft(), "attribute \"" + + value + "\" cannot be typed")); + // recover w.r.t expected type to continue while providing info + AvatarDataType adt = profile.get(k).getDataType(); + if (adt == null) { // primitive type, keep target variable name as it is + ids = new String[1]; + ids[0] = value; + } else { // datatype, extend target variable w.r.t datatype fields (although not well typed) + ids = extendName(value.replaceAll("\\.", "__"),adt).split(","); + } + } + else // value has a type (not verified: is it the expected type?) + ids = extendedPath.split(","); + + // update state with (extended) value as target attribute (fields) + int isize = ids.length; + for (int w = 0; w < isize; w++) state.addValue(ids[w]); + } + } + } + else { // unrecoved error, skip transition + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, transition.getLeft(), + "receiving transition should lead to a receive state", transition.getRleft())); + continue; + } + } + + // set-timer transitions ===================== + else if (transition.getType() == AvatarFromSysMLSyntax.STXSETTIMERTRANSITION) { + if(tgtState instanceof AvatarSetTimer) { + AvatarSetTimer state = (AvatarSetTimer) tgtState; + + // some unrecovered errors (transition skipped) + if (transition.getTimer() == null) { + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, transition.getLeft(), + "set-timer transition has no associated timer", transition.getRleft())); + continue; + } + state.setTimer(getTimerByName(transition.getTimer(), theBlock)); + if (transition.getSendPayload() == null || transition.getSendPayload().size() != 1 + || !(transition.getSendPayload().get(0) instanceof StxExpr)) { + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, transition.getLeft(), + "payload of set-timer transition is not well formed", transition.getRleft())); + continue; + } + + // update target state with its specific parameters + state.setTimerValue(((StxExpr)transition.getSendPayload().get(0)).toString().replaceAll(".","__")); + state.setTimerOriginalValue(((StxExpr)transition.getSendPayload().get(0)).toString()); + } + else { // unrecoved error, skip transition + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, transition.getLeft(), + "set-timer transition should lead to a set-timer state", transition.getRleft())); + continue; + } + } + + // reset-timer transitions ===================== + else if (transition.getType() == AvatarFromSysMLSyntax.STXRESETTIMERTRANSITION) { + if(tgtState instanceof AvatarResetTimer) { + AvatarResetTimer state = (AvatarResetTimer) tgtState; + + // an unrecovered error (transition skipped) + if (transition.getTimer() == null) { + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, transition.getLeft(), + "reset-timer transition has no associated timer", transition.getRleft())); + continue; + } + + // update target state with its specific parameter + state.setTimer(getTimerByName(transition.getTimer(), theBlock)); + } + else { // unrecoved error, skip transition + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, transition.getLeft(), + "reset-timer transition should lead to a reset-timer state", transition.getRleft())); + continue; + } + } + // expire-timer transitions ===================== + else if (transition.getType() == AvatarFromSysMLSyntax.STXEXPIRETIMERTRANSITION) { + if(tgtState instanceof AvatarExpireTimer) { + AvatarExpireTimer state = (AvatarExpireTimer) tgtState; + + // an unrecovered error (transition skipped) + if (transition.getTimer() == null) { + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, transition.getLeft(), + "expire-timer transition has no associated timer", transition.getRleft())); + continue; + } + + // update target state with its specific parameter + state.setTimer(getTimerByName(transition.getTimer(), theBlock)); + } + else { // unrecoved error, skip transition + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, transition.getLeft(), + "expire-timer transition should lead to a expire-timer state", transition.getRleft())); + continue; + } + } + + // standard transitions to non-communicating state ===================== + else if (! (tgtType == AvatarFromSysMLSyntax.STXSTOPSTATE || + tgtType == AvatarFromSysMLSyntax.STXSTANDARDSTATE || + tgtType == AvatarFromSysMLSyntax.STXRANDOMSTATE || + tgtType == AvatarFromSysMLSyntax.STXCOUNTSTATE || + tgtType == AvatarFromSysMLSyntax.STXSTARTSTATE) ) { + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, transition.getLeft(), + "transition type is not consistant with the type of its target state", transition.getTarget().getLeft())); + continue; + } + + // All unrecovered errors have been avoided, the transition can be added + asm.addElement(theTransition); + theSourceState.addNext(theTransition); + theTransition.addNext(tgtState); + addTransition(theTransition, tgtState); // memorize incoming transition for post-processing + } + } + } + // post-processing: verify some constraints on incoming transitions + transitionMap.forEach(new CheckIncommings()); + } + } + + /** makes some verifications relative to incomming edges, not all. In particular, not all unreachable states are removed, but this must ensure at + * least that keeped states are sufficiently well defined to be handled by the graphic representation building process (avoiding crashes) */ + private class CheckIncommings implements BiConsumer<AvatarStateMachineElement, StateTransitions> { + List<AvatarDataType> dataTypeList; + public CheckIncommings(){} + public void accept(AvatarStateMachineElement e, StateTransitions st) { + int s = st.getTransitions().size(); + if (s == 0 && ! (e instanceof AvatarStartState)) { // unreachable state that may be not well defined => to remove + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, "state " + e.getName() + + " of block " + st.getBlock().getName() + " is unreachable --> removed")); + st.getBlock().getStateMachine().removeElement(e); + for(AvatarStateMachineElement x : e.getNexts()) + st.getBlock().getStateMachine().removeElement(x); + } + if (s > 0 && (e instanceof AvatarStartState)) { // start state has input edges => redirected to error stopstate + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, "start state in bloc " + + st.getBlock().getName() + " has some input transition")); + for(int i = 0; i < s; i++) { + st.getTransitions().get(i).getNexts().clear(); + AvatarStopState nw = new AvatarStopState("errorstate",null, st.getBlock()); + st.getTransitions().get(i).addNext(nw); + st.getBlock().getStateMachine().addElement(nw); + } + } + if (s > 1 && !(e instanceof AvatarStartState || e instanceof AvatarStateElement)) { // too much input edges => redirected to error stopstate + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, "state " + e.getName() + " in bloc " + + st.getBlock().getName() + " has more than one incomming transition")); + + for(int i = 1; i < s; i++) { + st.getTransitions().get(i).getNexts().clear(); + AvatarStopState nw = new AvatarStopState("errorstate",null, st.getBlock()); + st.getTransitions().get(i).addNext(nw); + st.getBlock().getStateMachine().addElement(nw); + } + } + } + } + /** create-and-add AvatarBlocks. successive calls of BuildBlock and BuildStateMachine for each syntactic block */ + private void buildBlocks(){ + stxSpec.getBlockMap().forEach(new BuildBlock()); + stxSpec.getBlockMap().forEach(new BuildStateMachine()); + } + + /** complete the parameter transition with distribution law information provided in other parameters. + * + * @param _t the transition to provide with distribution law information + * @param distributionLaw the distribution law name + * @param delayExtra a map of distribution law parameters to values + * @param _st the syntactic transition (provides locations for error messages) + */ + private void setDistributionLaw(AvatarTransition _t, String distributionLaw, HashMap<String,String> delayExtra, StxTransition _st) { + int law = -1; + int size; + + // identify distribution law......... set default DELAY_UNIFORM_LAW when a problem is encountered + if (distributionLaw == null || distributionLaw.equals("")) law = DELAY_UNIFORM_LAW; + else { + size = DISTRIBUTION_LAWS.length; + for (int i = 0; i < size; i++) { // search in defined laws + if (DISTRIBUTION_LAWS[i].equals(distributionLaw)) { + law = i; + break; + } + } + if (law == -1) { // not found + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, _st.getLeft(), + "transition with unknown transition law : " + distributionLaw + " (set to uniform)")); + law = DELAY_UNIFORM_LAW; + } + } + // try to get law parameters............ + // get law parameter names + String extra1 = LABELS_OF_EXTRA_ATTRIBUTES_1[law]; + String extra2 = LABELS_OF_EXTRA_ATTRIBUTES_2[law]; + + size = NB_OF_EXTRA_ATTRIBUTES[law]; + int max = size; + String tmpString; + if (size > 0) { + tmpString = extra1; + extra1 = delayExtra.get(extra1); // try to get value of first parameter through its name + if (extra1 == null) { // not found + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, _st.getLeft(), + "transition law : " + distributionLaw + " requires a " + tmpString + " parameter")); + max--; + } + if (size > 1) { + tmpString = extra2; + extra2 = delayExtra.get(extra2); // try to get value of second parameter through its name + if (extra2 == null) { // not found + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, _st.getLeft(), + "transition law : " + distributionLaw + " requires a " + tmpString + " parameter")); + max--; + } + } + } + if (delayExtra != null && delayExtra.size() > max) { // there is some unexpected parameter value + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, _st.getLeft(), + "transition law : " + distributionLaw + " has irrelevant parameters")); + + } + // complete transition with identified data + _t.setDistributionLaw(law, extra1, extra2); + } + + /** fills the parameters of a method (or signal) w.r.t. the data of a syntactic structure + * + * @param ss the syntactic structure containing field information + * @param am the method to update by adding the fields characterized in ss + * @param b the block of the method + */ + private void buildProfile(StxStructure ss, AvatarMethod am, AvatarBlock b) { + AvatarAttribute aa; + int size = ss.getSize(); + for (int i = 0; i < size; i++) { // iterates on the fields of the structure ss + String type = ss.getFieldType(i); + if (type.equals("Integer")){ + aa = new AvatarAttribute(ss.getFieldName(i), AvatarType.INTEGER, b, null); + am.addOriginalParameter(aa); + aa.setAsConstant(false); + aa = new AvatarAttribute(ss.getFieldName(i), AvatarType.INTEGER, b, null); + am.addParameter(aa); + aa.setAsConstant(false); + } else if (type.equals("Boolean")) { + aa = new AvatarAttribute(ss.getFieldName(i), AvatarType.BOOLEAN, b, null); + am.addOriginalParameter(aa); + aa.setAsConstant(false); + aa = new AvatarAttribute(ss.getFieldName(i), AvatarType.BOOLEAN, b, null); + am.addParameter(aa); + aa.setAsConstant(false); + } else { // the field is datatype-typed + AvatarDataType adt = avSpec.getDataTypeByName(type); + if (adt == null) { + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, ss.getLeft(), + "message profile uses undefined datatype " + type)); + } + // add the original version of the field to am + String aaName = ss.getFieldName(i); + aa = new AvatarAttribute(aaName, AvatarType.UNDEFINED, b, null); + aa.setDataType(adt); + am.addOriginalParameter(aa); + aa.setAsConstant(false); + // add the primitive basic attributes corresponding to the datatype's field + if (adt != null) { + aaName = aaName + "__"; + AvatarDataTypePrimitiveFields primitiveFields = primitiveFieldsMap.get(adt); + int dtsize = primitiveFields.size(); + for (int j = 0; j < dtsize; j++) { + aa = new AvatarAttribute(aaName + primitiveFields.getName(j), + primitiveFields.getType(j), b, null); + am.addParameter(aa); + aa.setAsConstant(false); + } + } else { // error, try to continue with the non coherent attribute alone + aa = new AvatarAttribute(aaName, AvatarType.UNDEFINED, b, null); + am.addParameter(aa); + aa.setAsConstant(false); + } + } + } + } + + /** get the type of an attribute (not an attribute field) from a syntactic block */ + private String getStxAttributeType(String name, StxBlock blk){ + int size = blk.getNbAttributes(); + for (int i = 0; i < size; i++) { + if (blk.getAttribute(i).getName().equals(name)) return blk.getAttribute(i).getType(); + } + return null; + } + + /** get the type of an attribute (or an attribute field, with "__" as field delimiter) from a syntactic block */ + private String getStxPathType(String s, StxBlock b) { + String[] path = s.split("__"); + String type = getStxAttributeType(path[0], b); + int size = path.length; + for (int i = 1; i < size; i++) { + AvatarDataType adt = avSpec.getDataTypeByName(type); + if (adt == null) return null; + int nbFields = adt.attributeNb(); + int j; + for (j = 0; j < nbFields; j++) + if (adt.getAttribute(j).getName().equals(path[i])) break; + if (j == nbFields) return null; + AvatarType adtType = adt.getAttribute(j).getType(); + if (adtType == AvatarType.INTEGER) + type = "Integer"; + else if (adtType == AvatarType.BOOLEAN) + type = "Boolean"; + else + type = adt.getAttribute(j).getDataType().getName(); + } + return type; + } + /** (string) Type found for ident extended by by extendPath (and thus extendIdent) */ + private String extendTypeString; + /** DataType found for ident extended by extendPath (and thus extendIdent) if not primitive type */ + private AvatarDataType extendDataType; + /** Primitive type found for ident extended by extendPath (and thus extendIdent) if not datatype type */ + private AvatarType extendPrimitiveType; + + /** extends a parameter attribute or field name x in a list "x__field1, ..., x__fieldN" respecting the fields of its associated type. + * If type is primitive, returns x unchanged. Updates extendTypeString, extendDataType and extendPrimitiveType w.r.t. the found type. */ + private String extendPath(String path, StxBlock b) { + extendTypeString = getStxPathType(path, b); + if (extendTypeString == null) { // path cannot be typed, return null to notify the error + extendDataType = null; + extendPrimitiveType = null; + return null; + } + if (extendTypeString.equals("Integer")) { + extendDataType = null; + extendPrimitiveType = AvatarType.INTEGER; + return path; + } + if (extendTypeString.equals("Boolean")) { + extendDataType = null; + extendPrimitiveType = AvatarType.BOOLEAN; + return path; + } + extendPrimitiveType = null; + extendDataType = avSpec.getDataTypeByName(extendTypeString); + if (extendDataType != null) + return extendName(path, extendDataType); + else return null; + } + + /** extends a parameter name x in a list "x__field1, ..., x__fieldN" respecting the fields of parameter datatype */ + private String extendName(String name, AvatarDataType adt) { + if (adt != null) { + AvatarDataTypePrimitiveFields primitiveFields = primitiveFieldsMap.get(adt); + int size = primitiveFields.size() -1; + StringBuffer res = new StringBuffer(); + int i; + for (i = 0; i < size; i++) + res.append(name + "__" + primitiveFields.getName(i) + ", "); + res.append(name + "__" + primitiveFields.getName(i)); + return res.toString(); + } + else return null; + } + /** extends a parameter attribute or field name x in a list in brackets "(x__field1, ..., x__fieldN)" respecting the fields of its associated + * type. If this type is primitive, returns x unchanged. Updates extendTypeString, extendDataType and extendPrimitiveType w.r.t. the found type. + * extends a parameter name x in a list "x__field1, ..., x__fieldN" respecting the fields of parameter datatype + */ + private String extendIdent (String path, StxBlock b) { + String result = extendPath(path, b); + return (result.indexOf(',') == -1 ? result : "(" + result + ")"); + } + + /** builds the string associated to a method call while extending the ones among the idents it uses that are datatype-typed */ + private String extendCall (StxCall call, StxBlock b) { + StringBuffer result = new StringBuffer(); + int size = call.getNbIdents(); + int i; + for (i =0 ; i < size; i++) { + result.append(call.getSegment(i)); + result.append(extendPath(call.getIdent(i).replaceAll("\\.", "__"), b)); + } + result.append(call.getSegment(i)); + return result.toString().replaceAll("\\.", "__"); + } + /** rebuilds the original string associated to a method call, without ident extension */ + private String extendOriginalCall (StxCall call, StxBlock b) { + StringBuffer result = new StringBuffer(); + int size = call.getNbIdents(); + int i; + for (i =0 ; i < size; i++) { + result.append(call.getSegment(i)); + result.append(call.getIdent(i)); + } + result.append(call.getSegment(i)); + return result.toString(); + } + + // BUILD RELATIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + /** create-and-add-to-avSpec the relations identified in stxSpec */ + private void buildRelations(){ + stxSpec.getRelationMap().forEach(new BuildRelation()); + } + + /** to be run on relations identified while parsing and memorized in stxSpec's relation map. Create, fill and adds-to-avSpec a relation. */ + private class BuildRelation implements BiConsumer<String, StxRelation> { + public BuildRelation() { + } + public void accept(String n, StxRelation r) { + if (!r.isDeclared()) { // declaration part is missing in source + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, + "relation " + r.getName() +" has been used but has not been declared")); + // try to recover + int size = r.getSize(); + if (size == 0) { // empty relation is droped + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, r.getLeft(), + "relation is empty")); + return; + } else { // channels found, try to recover blocks from them + int i = 0; + while (i < size && (r.getChannel(i).getBlockA() == null || r.getChannel(i).getBlockB() == null)) i++; + if (i == size) { // cannot find a channel with two clearly named blocks, drop relation + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, + "cannot determine blocs of relation " + r.getName())); + return; + } + // block names found, search associated AvatarBlock structures + r.setBlock1(stxSpec.getBlockMap().get(r.getChannel(i).getBlockA())); + r.setBlock2(stxSpec.getBlockMap().get(r.getChannel(i).getBlockB())); + if (r.getBlock1() == null || r.getBlock2() == null) { // AvatarBlock structures not found, drop relation + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, + "cannot determine blocs of relation " + r.getName())); + return; + } + } + } + + // from here, relation has blocks (from declaration or recovered) + + AvatarBlock blk1 = getBlock(r.getBlock1()); + AvatarBlock blk2 = getBlock(r.getBlock2()); + + // create-and-add-to-avSpec the Avatar relation + AvatarRelation theRelation = new AvatarRelation(n, blk1, blk2, null); + avSpec.addRelation(theRelation); + + // set relation parameters + theRelation.setAsynchronous(r.getAsynchronous()); + theRelation.setPrivate(r.getPrivate()); + theRelation.setLossy(r.getLossy()); + theRelation.setBlocking(r.getBlocking()); + theRelation.setSizeOfFIFO(r.getFifoSize()); + + // add channels to the relation + int size = r.getSize(); + if (size == 0) { // empty relation, kept because coherent although useless + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, r.getLeft(), + "relation " + r.getName() + " is empty")); + } + for (int i = 0; i < size; i++) { // iterate on channels + StxChannel c = r.getChannel(i); // get channel + c.commuteSignals(r.getBlock1().getName()); // make channel respect block order in relation + if (!blk1.getName().equals(c.getBlockA()) || !blk2.getName().equals(c.getBlockB())) { // channel doesn't respect relation's blocks + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, c.getLeft(), + "inconsistency between blocs of channel " + c.getName() + " and its relation " + r.getName())); + continue; + } + // try to add channel to relation + if (c.getSignalA() != null && c.getSignalB() != null) + theRelation.addSignals(getSignal(c.getSignalA()),getSignal(c.getSignalB())); + else + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, c.getLeft(), + "missing signal binding for channel")); + } + } + } +} diff --git a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLError.java b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLError.java new file mode 100644 index 0000000000000000000000000000000000000000..be8ced22556c4f37b275aebcedd695982d982e64 --- /dev/null +++ b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLError.java @@ -0,0 +1,108 @@ +/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille + * + * ludovic.apvrille AT enst.fr + * + * This software is a computer program whose purpose is to allow the + * edition of TURTLE analysis, design and deployment diagrams, to + * allow the generation of RT-LOTOS or Java code from this diagram, + * and at last to allow the analysis of formal validation traces + * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP + * from INRIA Rhone-Alpes. + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + */ +package avatartranslator.tosysmlv2; +import java_cup.runtime.ComplexSymbolFactory.Location; + +/** + * Class AvatarFromSysMLError + * Creation: 20/06/2024 + * + * Errors that are reported when parsing an Avatar SysML model and building the corresponding Avatar Model. + * These errors are (potentially) provided with two locations. Idea: the location where the error occurs + a reference location for conflicting + * declarations, for example. + * @author Sophie Coudert + * @version 0.1 20/06/2024 + */ +public class AvatarFromSysMLError { + public static final byte LOWWARNING = 0; // TODO: probably simplify in 3 levels ERROR, WARNING, BUG + public static final byte HIGHWARNING = 1; + public static final byte LOWERROR = 2; + public static final byte HIGHERROR = 3; + public static final byte BUGERROR = 4; + /** location (sometime approximative) where the error has been detected */ + private Location location; + /** reference location concerned by the error, in case of conflict for example */ + private Location reference; + /** message describing the error */ + private String message; + /** seriousness of the error */ + private byte level; + + public AvatarFromSysMLError(Byte lv, Location loc, String msg, Location ref){ + location = loc; + reference = ref; + message = msg; + level = lv; + } + public AvatarFromSysMLError(Byte lv, Location loc, String msg){ + location = loc; + reference = null; + message = msg; + level = lv; + } + public AvatarFromSysMLError(Byte lv, String msg){ + location = null; + reference = null; + message = msg; + level = lv; + } + @Override + public String toString() { + StringBuffer res = new StringBuffer(); + if (level > BUGERROR || level < LOWWARNING) + res.append("PROBLEM "); + else if (level == LOWWARNING) + res.append("Warning "); + else if (level == HIGHWARNING) + res.append("WARNING "); + else if (level == LOWERROR) + res.append("Error "); + else if (level == HIGHERROR) + res.append("ERROR "); + else + res.append("BUG "); + if (location != null) + res.append("(l" + (location.getLine() + 1) + ",c" + (location.getColumn() + 1) + ")"); + res.append(": " + message); + if (reference != null) + res.append(" (c.f. l" + (reference.getLine() + 1) + ",c" + (reference.getColumn() + 1) + ")"); + //res.append("\n"); + return res.toString(); + } + +} diff --git a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLLexer.java b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLLexer.java new file mode 100644 index 0000000000000000000000000000000000000000..d46eba1e7e812adeada99f4fe61e359568248e8e --- /dev/null +++ b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLLexer.java @@ -0,0 +1,3699 @@ +/* The following code was generated by JFlex 1.4.3 on 26/09/2024 16:09 */ + +/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille + * + * ludovic.apvrille AT enst.fr + * + * This software is a computer program whose purpose is to allow the + * edition of TURTLE analysis, design and deployment diagrams, to + * allow the generation of RT-LOTOS or Java code from this diagram, + * and at last to allow the analysis of formal validation traces + * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP + * from INRIA Rhone-Alpes. + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + */ + package avatartranslator.tosysmlv2; +import java_cup.runtime.*; +import java_cup.runtime.ComplexSymbolFactory.*; +import java.util.HashSet; +import avatartranslator.tosysmlv2.AvatarFromSysMLSyntax.*; + + +/** + * This class is a scanner generated by + * <a href="http://www.jflex.de/">JFlex</a> 1.4.3 + * on 26/09/2024 16:09 from the specification file + * <code>__AvatarFromSysMLLexer__.jflex</code> + */ +public class AvatarFromSysMLLexer implements java_cup.runtime.Scanner { + + /** This character denotes the end of file */ + public static final int YYEOF = -1; + + /** initial size of the lookahead buffer */ + private static final int ZZ_BUFFERSIZE = 16384; + + /** lexical states */ + public static final int YYINITIAL = 0; + public static final int IMPORTITEM = 4; + public static final int COMMENTLINE = 2; + + /** + * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l + * ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l + * at the beginning of a line + * l is of the form l = 2*k, k a non negative integer + */ + private static final int ZZ_LEXSTATE[] = { + 0, 0, 1, 1, 2, 2 + }; + + /** + * Translates characters to character classes + */ + private static final String ZZ_CMAP_PACKED = + "\11\0\1\1\1\54\1\0\1\1\1\53\22\0\1\1\1\64\1\74"+ + "\1\104\1\17\1\61\1\62\1\7\1\67\1\70\1\60\1\57\1\73"+ + "\1\25\1\4\1\56\1\2\1\76\1\77\7\3\1\13\1\55\1\27"+ + "\1\65\1\26\1\66\1\10\1\112\1\20\1\110\1\101\1\115\1\21"+ + "\1\37\1\6\1\106\2\6\1\102\1\36\1\22\1\107\1\114\1\6"+ + "\1\105\1\23\1\111\1\6\1\113\2\6\1\24\1\6\4\0\1\5"+ + "\1\0\1\40\1\14\1\44\1\11\1\46\1\35\1\32\1\45\1\31"+ + "\1\116\1\16\1\15\1\47\1\34\1\42\1\43\1\100\1\41\1\30"+ + "\1\12\1\50\1\51\1\103\1\52\1\33\1\75\1\71\1\63\1\72"+ + "\uff82\0"; + + /** + * Translates characters to character classes + */ + private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED); + + /** + * Translates DFA states to action switch labels. + */ + private static final int [] ZZ_ACTION = zzUnpackAction(); + + private static final String ZZ_ACTION_PACKED_0 = + "\3\0\1\1\1\2\2\3\1\4\1\1\1\5\1\1"+ + "\2\5\1\6\4\5\1\7\1\10\1\11\17\5\1\12"+ + "\1\13\1\14\1\15\1\16\1\17\1\20\1\1\1\21"+ + "\1\22\1\23\1\24\1\25\1\26\1\27\1\1\4\5"+ + "\1\2\1\30\1\2\2\0\1\5\10\0\1\31\3\5"+ + "\1\32\1\5\1\33\1\34\2\5\1\35\4\5\1\36"+ + "\1\37\10\5\1\40\1\41\10\5\1\42\2\5\1\43"+ + "\5\5\1\44\1\20\25\5\1\45\1\46\1\47\1\0"+ + "\1\50\4\5\1\51\2\0\1\52\1\0\1\53\43\0"+ + "\1\5\1\54\1\55\33\5\1\56\10\5\1\57\3\5"+ + "\1\60\2\5\1\17\7\5\1\61\1\5\1\62\4\5"+ + "\1\63\15\5\1\64\11\5\1\65\1\5\1\66\3\5"+ + "\1\67\5\5\36\0\1\70\21\0\1\71\7\5\1\72"+ + "\1\73\1\5\1\74\1\5\1\75\10\5\1\76\3\5"+ + "\1\77\10\5\1\100\1\101\4\5\1\102\1\103\27\5"+ + "\1\104\4\5\1\105\2\5\1\106\1\107\5\5\1\110"+ + "\1\5\1\111\1\5\1\112\6\5\1\113\3\5\1\114"+ + "\1\115\1\5\1\116\63\0\7\5\1\117\4\5\1\120"+ + "\1\5\1\121\11\5\1\122\5\5\1\123\1\124\1\125"+ + "\2\5\1\126\1\5\1\127\1\5\1\130\3\5\1\131"+ + "\1\5\1\132\25\5\1\133\1\134\4\5\1\135\1\136"+ + "\3\5\1\137\1\5\23\0\1\140\13\0\1\141\3\0"+ + "\1\71\25\0\4\5\1\142\5\5\1\143\7\5\1\144"+ + "\4\5\1\145\1\5\1\146\3\5\1\147\1\150\1\151"+ + "\1\5\1\152\1\153\1\5\1\154\1\155\13\5\1\156"+ + "\5\5\1\157\7\5\1\160\1\5\1\0\1\161\1\0"+ + "\1\162\36\0\1\163\5\0\1\121\2\0\1\164\2\0"+ + "\1\165\17\0\1\166\1\167\1\170\3\5\1\171\1\5"+ + "\1\172\2\5\1\173\1\5\1\174\1\175\3\5\1\176"+ + "\1\177\11\5\1\200\1\5\1\201\2\5\1\202\1\203"+ + "\1\5\1\204\1\5\1\205\1\206\1\207\1\210\1\211"+ + "\1\5\1\212\2\5\1\213\1\5\1\214\1\161\1\215"+ + "\3\0\1\216\1\0\1\217\23\0\1\220\1\221\4\0"+ + "\1\222\6\0\1\223\3\0\1\224\23\0\3\5\1\225"+ + "\1\5\1\226\6\5\1\227\1\5\1\230\1\231\3\5"+ + "\1\232\3\5\1\233\3\5\1\234\3\5\1\0\1\235"+ + "\1\236\1\237\25\0\1\240\5\0\1\241\1\0\1\242"+ + "\3\0\1\243\32\0\1\5\1\244\5\5\1\245\1\246"+ + "\1\247\1\5\1\250\1\251\2\5\1\252\1\5\1\253"+ + "\2\5\1\254\1\255\1\5\4\0\1\256\2\0\1\257"+ + "\16\0\1\260\1\0\1\261\1\262\1\263\1\264\17\0"+ + "\1\265\23\0\1\266\1\267\2\5\1\270\1\271\1\272"+ + "\1\273\1\5\1\274\1\275\1\276\1\5\4\0\1\161"+ + "\20\0\1\277\1\300\3\0\1\301\3\0\1\302\34\0"+ + "\1\303\1\304\1\305\1\5\27\0\1\306\7\0\1\307"+ + "\33\0\1\310\2\0\1\311\1\0\1\312\24\0\1\313"+ + "\7\0\1\314\5\0\1\315\25\0\1\316\1\317\22\0"+ + "\1\320\1\0\1\321\4\0\1\322\4\0\1\323\14\0"+ + "\1\324\11\0\1\325\12\0\1\326\2\0\1\327\1\330"+ + "\1\331\34\0\1\332\3\0\1\333\7\0\1\334\2\0"+ + "\1\335\2\0\1\336\26\0\1\337\1\340\7\0\1\341"+ + "\2\0\1\342\1\343\10\0\1\344\14\0\1\345\5\0"+ + "\1\346\5\0\1\347\2\0\1\350\16\0\1\351\1\0"+ + "\1\352\1\353\2\0\1\354\6\0\1\355\1\356\1\357"+ + "\1\360\5\0\1\361\1\362\4\0\1\363\11\0\1\364"+ + "\5\0\1\365\1\366\5\0\1\367\1\370\6\0\1\371"+ + "\6\0\1\372\1\373\1\0\1\374\3\0\1\375\1\0"+ + "\1\376\1\0\1\377"; + + private static int [] zzUnpackAction() { + int [] result = new int[1524]; + int offset = 0; + offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackAction(String packed, int offset, int [] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int count = packed.charAt(i++); + int value = packed.charAt(i++); + do result[j++] = value; while (--count > 0); + } + return j; + } + + + /** + * Translates a state to a row index in the transition table + */ + private static final int [] ZZ_ROWMAP = zzUnpackRowMap(); + + private static final String ZZ_ROWMAP_PACKED_0 = + "\0\0\0\117\0\236\0\355\0\355\0\u013c\0\u018b\0\355"+ + "\0\u01da\0\u0229\0\u0278\0\u02c7\0\u0316\0\u0365\0\u03b4\0\u0403"+ + "\0\u0452\0\u04a1\0\355\0\u04f0\0\u053f\0\u058e\0\u05dd\0\u062c"+ + "\0\u067b\0\u06ca\0\u0719\0\u0768\0\u07b7\0\u0806\0\u0855\0\u08a4"+ + "\0\u08f3\0\u0942\0\u0991\0\u09e0\0\355\0\u0a2f\0\355\0\355"+ + "\0\355\0\355\0\355\0\u0a7e\0\u0acd\0\355\0\355\0\355"+ + "\0\355\0\355\0\355\0\u0b1c\0\u0b6b\0\u0bba\0\u0c09\0\u0c58"+ + "\0\u0ca7\0\355\0\u0cf6\0\u0d45\0\u0d94\0\u0de3\0\u0e32\0\u0e81"+ + "\0\u0ed0\0\u0f1f\0\u0f6e\0\u0fbd\0\u100c\0\u105b\0\u10aa\0\u10f9"+ + "\0\u1148\0\u1197\0\u0229\0\u11e6\0\355\0\355\0\u1235\0\u1284"+ + "\0\u0229\0\u12d3\0\u1322\0\u1371\0\u13c0\0\355\0\355\0\u140f"+ + "\0\u145e\0\u14ad\0\u14fc\0\u154b\0\u159a\0\u15e9\0\u1638\0\u1687"+ + "\0\u0229\0\u16d6\0\u1725\0\u1774\0\u17c3\0\u1812\0\u1861\0\u18b0"+ + "\0\u18ff\0\u194e\0\u199d\0\u19ec\0\u1a3b\0\u1a8a\0\u1ad9\0\u1b28"+ + "\0\u1b77\0\u1bc6\0\u0229\0\u1c15\0\u1c64\0\u1cb3\0\u1d02\0\u1d51"+ + "\0\u1da0\0\u1def\0\u1e3e\0\u1e8d\0\u1edc\0\u1f2b\0\u1f7a\0\u1fc9"+ + "\0\u2018\0\u2067\0\u20b6\0\u2105\0\u2154\0\u21a3\0\u21f2\0\u2241"+ + "\0\u2290\0\355\0\355\0\355\0\u0b1c\0\355\0\u22df\0\u232e"+ + "\0\u237d\0\u23cc\0\u0d45\0\u241b\0\u246a\0\355\0\u24b9\0\355"+ + "\0\u2508\0\u2557\0\u25a6\0\u25f5\0\u2644\0\u2693\0\u26e2\0\u2731"+ + "\0\u2780\0\u27cf\0\u281e\0\u286d\0\u28bc\0\u290b\0\u295a\0\u29a9"+ + "\0\u29f8\0\u2a47\0\u2a96\0\u2ae5\0\u2b34\0\u2b83\0\u2bd2\0\u2c21"+ + "\0\u2c70\0\u2cbf\0\u2d0e\0\u2d5d\0\u2dac\0\u2dfb\0\u2e4a\0\u2e99"+ + "\0\u2ee8\0\u2f37\0\u2f86\0\u2fd5\0\u0229\0\u3024\0\u3073\0\u30c2"+ + "\0\u3111\0\u3160\0\u31af\0\u31fe\0\u324d\0\u329c\0\u32eb\0\u333a"+ + "\0\u3389\0\u33d8\0\u3427\0\u3476\0\u34c5\0\u3514\0\u3563\0\u35b2"+ + "\0\u3601\0\u3650\0\u369f\0\u36ee\0\u373d\0\u378c\0\u37db\0\u382a"+ + "\0\u3879\0\u0229\0\u38c8\0\u3917\0\u3966\0\u39b5\0\u3a04\0\u3a53"+ + "\0\u3aa2\0\u3af1\0\u3b40\0\u3b8f\0\u3bde\0\u3c2d\0\u3c7c\0\u3ccb"+ + "\0\u3d1a\0\u0229\0\u3d69\0\u3db8\0\u3e07\0\u3e56\0\u3ea5\0\u3ef4"+ + "\0\u3f43\0\u3f92\0\u3fe1\0\u0229\0\u4030\0\u407f\0\u40ce\0\u411d"+ + "\0\u0229\0\u416c\0\u41bb\0\u420a\0\u4259\0\u42a8\0\u42f7\0\u4346"+ + "\0\u4395\0\u43e4\0\u4433\0\u4482\0\u44d1\0\u4520\0\u0229\0\u456f"+ + "\0\u45be\0\u460d\0\u465c\0\u46ab\0\u46fa\0\u4749\0\u4798\0\u47e7"+ + "\0\u0229\0\u4836\0\u0229\0\u4885\0\u48d4\0\u4923\0\u0229\0\u4972"+ + "\0\u49c1\0\u4a10\0\u4a5f\0\u4aae\0\u4afd\0\u4b4c\0\u4b9b\0\u4bea"+ + "\0\u4c39\0\u4c88\0\u4cd7\0\u4d26\0\u4d75\0\u4dc4\0\u4e13\0\u4e62"+ + "\0\u4eb1\0\u4f00\0\u4f4f\0\u4f9e\0\u4fed\0\u503c\0\u508b\0\u50da"+ + "\0\u5129\0\u5178\0\u51c7\0\u5216\0\u5265\0\u52b4\0\u5303\0\u5352"+ + "\0\u53a1\0\u53f0\0\355\0\u543f\0\u548e\0\u54dd\0\u552c\0\u557b"+ + "\0\u55ca\0\u5619\0\u5668\0\u56b7\0\u5706\0\u5755\0\u57a4\0\u57f3"+ + "\0\u5842\0\u5891\0\u58e0\0\u592f\0\u0229\0\u597e\0\u59cd\0\u5a1c"+ + "\0\u5a6b\0\u5aba\0\u5b09\0\u5b58\0\u0229\0\u0229\0\u5ba7\0\u5bf6"+ + "\0\u5c45\0\u0229\0\u5c94\0\u5ce3\0\u5d32\0\u5d81\0\u5dd0\0\u5e1f"+ + "\0\u5e6e\0\u5ebd\0\u0229\0\u5f0c\0\u5f5b\0\u5faa\0\u0229\0\u5ff9"+ + "\0\u6048\0\u6097\0\u60e6\0\u6135\0\u6184\0\u61d3\0\u6222\0\u0229"+ + "\0\u0229\0\u6271\0\u62c0\0\u630f\0\u635e\0\u0229\0\u0229\0\u63ad"+ + "\0\u63fc\0\u644b\0\u649a\0\u64e9\0\u6538\0\u6587\0\u65d6\0\u6625"+ + "\0\u6674\0\u66c3\0\u6712\0\u6761\0\u67b0\0\u67ff\0\u684e\0\u689d"+ + "\0\u68ec\0\u693b\0\u698a\0\u69d9\0\u6a28\0\u6a77\0\u0229\0\u6ac6"+ + "\0\u6b15\0\u6b64\0\u6bb3\0\u0229\0\u6c02\0\u6c51\0\u0229\0\u0229"+ + "\0\u6ca0\0\u6cef\0\u6d3e\0\u6d8d\0\u6ddc\0\u0229\0\u6e2b\0\u0229"+ + "\0\u6e7a\0\u0229\0\u6ec9\0\u6f18\0\u6f67\0\u6fb6\0\u7005\0\u7054"+ + "\0\u70a3\0\u70f2\0\u7141\0\u7190\0\u0229\0\u0229\0\u71df\0\u0229"+ + "\0\u722e\0\u727d\0\u72cc\0\u731b\0\u736a\0\u73b9\0\u7408\0\u7457"+ + "\0\u74a6\0\u74f5\0\u7544\0\u7593\0\u75e2\0\u7631\0\u7680\0\u76cf"+ + "\0\u771e\0\u776d\0\u77bc\0\u780b\0\u785a\0\u78a9\0\u78f8\0\u7947"+ + "\0\u7996\0\u79e5\0\u7a34\0\u7a83\0\u7ad2\0\u7b21\0\u7b70\0\u7bbf"+ + "\0\u7c0e\0\u7c5d\0\u7cac\0\u7cfb\0\u7d4a\0\u7d99\0\u7de8\0\u7e37"+ + "\0\u7e86\0\u7ed5\0\u7f24\0\u7f73\0\u7fc2\0\u8011\0\u8060\0\u80af"+ + "\0\u80fe\0\u814d\0\u819c\0\u81eb\0\u823a\0\u8289\0\u82d8\0\u8327"+ + "\0\u8376\0\u83c5\0\u0229\0\u8414\0\u8463\0\u84b2\0\u8501\0\u0229"+ + "\0\u8550\0\u0229\0\u859f\0\u85ee\0\u863d\0\u868c\0\u86db\0\u872a"+ + "\0\u8779\0\u87c8\0\u8817\0\u0229\0\u8866\0\u88b5\0\u8904\0\u8953"+ + "\0\u89a2\0\u0229\0\u0229\0\u0229\0\u89f1\0\u8a40\0\u0229\0\u8a8f"+ + "\0\u0229\0\u8ade\0\u0229\0\u8b2d\0\u8b7c\0\u8bcb\0\u0229\0\u8c1a"+ + "\0\u0229\0\u8c69\0\u8cb8\0\u8d07\0\u8d56\0\u8da5\0\u8df4\0\u8e43"+ + "\0\u8e92\0\u8ee1\0\u8f30\0\u8f7f\0\u8fce\0\u901d\0\u906c\0\u90bb"+ + "\0\u910a\0\u9159\0\u91a8\0\u91f7\0\u9246\0\u9295\0\u0229\0\u0229"+ + "\0\u92e4\0\u9333\0\u9382\0\u93d1\0\u0229\0\u0229\0\u9420\0\u946f"+ + "\0\u94be\0\u0229\0\u950d\0\u955c\0\u95ab\0\u95fa\0\u9649\0\u9698"+ + "\0\u96e7\0\u9736\0\u9785\0\u97d4\0\u9823\0\u9872\0\u98c1\0\u9910"+ + "\0\u995f\0\u99ae\0\u99fd\0\u9a4c\0\u9a9b\0\u9aea\0\355\0\u9b39"+ + "\0\u9b88\0\u9bd7\0\u9c26\0\u9c75\0\u9cc4\0\u9d13\0\u9d62\0\u9db1"+ + "\0\u9e00\0\u9e4f\0\355\0\u9e9e\0\u9eed\0\u9f3c\0\355\0\u9f8b"+ + "\0\u9fda\0\ua029\0\ua078\0\ua0c7\0\ua116\0\ua165\0\ua1b4\0\ua203"+ + "\0\ua252\0\ua2a1\0\ua2f0\0\ua33f\0\ua38e\0\ua3dd\0\ua42c\0\ua47b"+ + "\0\ua4ca\0\ua519\0\ua568\0\ua5b7\0\ua606\0\ua655\0\ua6a4\0\ua6f3"+ + "\0\u0229\0\ua742\0\ua791\0\ua7e0\0\ua82f\0\ua87e\0\u0229\0\ua8cd"+ + "\0\ua91c\0\ua96b\0\ua9ba\0\uaa09\0\uaa58\0\uaaa7\0\u0229\0\uaaf6"+ + "\0\uab45\0\uab94\0\uabe3\0\u0229\0\uac32\0\u0229\0\uac81\0\uacd0"+ + "\0\uad1f\0\u0229\0\u0229\0\u0229\0\uad6e\0\u0229\0\u0229\0\uadbd"+ + "\0\u0229\0\uae0c\0\uae5b\0\uaeaa\0\uaef9\0\uaf48\0\uaf97\0\uafe6"+ + "\0\ub035\0\ub084\0\ub0d3\0\ub122\0\ub171\0\u0229\0\ub1c0\0\ub20f"+ + "\0\ub25e\0\ub2ad\0\ub2fc\0\u0229\0\ub34b\0\ub39a\0\ub3e9\0\ub438"+ + "\0\ub487\0\ub4d6\0\ub525\0\u0229\0\ub574\0\ub5c3\0\ub612\0\ub661"+ + "\0\355\0\ub6b0\0\ub6ff\0\ub74e\0\ub79d\0\ub7ec\0\ub83b\0\ub88a"+ + "\0\ub8d9\0\ub928\0\ub977\0\ub9c6\0\uba15\0\uba64\0\ubab3\0\ubb02"+ + "\0\ubb51\0\ubba0\0\ubbef\0\ubc3e\0\ubc8d\0\ubcdc\0\ubd2b\0\ubd7a"+ + "\0\ubdc9\0\ube18\0\ube67\0\ubeb6\0\ubf05\0\ubf54\0\ubfa3\0\355"+ + "\0\ubff2\0\uc041\0\uc090\0\uc0df\0\uc12e\0\355\0\uc17d\0\uc1cc"+ + "\0\355\0\uc21b\0\uc26a\0\355\0\uc2b9\0\uc308\0\uc357\0\uc3a6"+ + "\0\uc3f5\0\uc444\0\uc493\0\uc4e2\0\uc531\0\uc580\0\uc5cf\0\uc61e"+ + "\0\uc66d\0\uc6bc\0\uc70b\0\u0229\0\u0229\0\u0229\0\uc75a\0\uc7a9"+ + "\0\uc7f8\0\u0229\0\uc847\0\u0229\0\uc896\0\uc8e5\0\u0229\0\uc934"+ + "\0\u0229\0\u0229\0\uc983\0\uc9d2\0\uca21\0\u0229\0\u0229\0\uca70"+ + "\0\ucabf\0\ucb0e\0\ucb5d\0\ucbac\0\ucbfb\0\ucc4a\0\ucc99\0\ucce8"+ + "\0\ucd37\0\ucd86\0\u0229\0\ucdd5\0\uce24\0\u0229\0\u0229\0\uce73"+ + "\0\u0229\0\ucec2\0\ucf11\0\u0229\0\u0229\0\u0229\0\u0229\0\ucf60"+ + "\0\u0229\0\ucfaf\0\ucffe\0\u0229\0\ud04d\0\u0229\0\ub5c3\0\355"+ + "\0\ud09c\0\ud0eb\0\ud13a\0\355\0\ud189\0\355\0\ud1d8\0\ud227"+ + "\0\ud276\0\ud2c5\0\ud314\0\ud363\0\ud3b2\0\ud401\0\ud450\0\ud49f"+ + "\0\ud4ee\0\ud53d\0\ud58c\0\ud5db\0\ud62a\0\ud679\0\ud6c8\0\ud717"+ + "\0\ud766\0\355\0\355\0\ud7b5\0\ud804\0\ud853\0\ud8a2\0\355"+ + "\0\ud8f1\0\ud940\0\ud98f\0\ud9de\0\uda2d\0\uda7c\0\355\0\udacb"+ + "\0\udb1a\0\udb69\0\355\0\udbb8\0\udc07\0\udc56\0\udca5\0\udcf4"+ + "\0\udd43\0\udd92\0\udde1\0\ude30\0\ude7f\0\udece\0\udf1d\0\udf6c"+ + "\0\udfbb\0\ue00a\0\ue059\0\ue0a8\0\ue0f7\0\ue146\0\ue195\0\ue1e4"+ + "\0\ue233\0\u0229\0\ue282\0\u0229\0\ue2d1\0\ue320\0\ue36f\0\ue3be"+ + "\0\ue40d\0\ue45c\0\u0229\0\ue4ab\0\u0229\0\u0229\0\ue4fa\0\ue549"+ + "\0\ue598\0\u0229\0\ue5e7\0\ue636\0\ue685\0\u0229\0\ue6d4\0\ue723"+ + "\0\ue772\0\u0229\0\ue7c1\0\ue810\0\ue85f\0\ue8ae\0\355\0\355"+ + "\0\355\0\ue8fd\0\ue94c\0\ue99b\0\ue9ea\0\uea39\0\uea88\0\uead7"+ + "\0\ueb26\0\ueb75\0\uebc4\0\uec13\0\uec62\0\uecb1\0\ued00\0\ued4f"+ + "\0\ued9e\0\ueded\0\uee3c\0\uee8b\0\ueeda\0\uef29\0\355\0\uef78"+ + "\0\uefc7\0\uf016\0\uf065\0\uf0b4\0\355\0\uf103\0\355\0\uf152"+ + "\0\uf1a1\0\uf1f0\0\355\0\uf23f\0\uf28e\0\uf2dd\0\uf32c\0\uf37b"+ + "\0\uf3ca\0\uf419\0\uf468\0\uf4b7\0\uf506\0\uf555\0\uf5a4\0\uf5f3"+ + "\0\uf642\0\uf691\0\uf6e0\0\uf72f\0\uf77e\0\uf7cd\0\uf81c\0\uf86b"+ + "\0\uf8ba\0\uf909\0\uf958\0\uf9a7\0\uf9f6\0\ufa45\0\u0229\0\ufa94"+ + "\0\ufae3\0\ufb32\0\ufb81\0\ufbd0\0\u0229\0\u0229\0\u0229\0\ufc1f"+ + "\0\u0229\0\u0229\0\ufc6e\0\ufcbd\0\u0229\0\ufd0c\0\u0229\0\ufd5b"+ + "\0\ufdaa\0\u0229\0\u0229\0\ufdf9\0\ufe48\0\ufe97\0\ufee6\0\uff35"+ + "\0\355\0\uff84\0\uffd3\0\355\1\42\1\161\1\300\1\u010f"+ + "\1\u015e\1\u01ad\1\u01fc\1\u024b\1\u029a\1\u02e9\1\u0338\1\u0387"+ + "\1\u03d6\1\u0425\0\355\1\u0474\0\355\0\355\0\355\0\355"+ + "\1\u04c3\1\u0512\1\u0561\1\u05b0\1\u05ff\1\u064e\1\u069d\1\u06ec"+ + "\1\u073b\1\u078a\1\u07d9\1\u0828\1\u0877\1\u08c6\1\u0915\0\355"+ + "\1\u0964\1\u09b3\1\u0a02\1\u0a51\1\u0aa0\1\u0aef\1\u0b3e\1\u0b8d"+ + "\1\u0bdc\1\u0c2b\1\u0c7a\1\u0cc9\1\u0d18\1\u0d67\1\u0db6\1\u0e05"+ + "\1\u0e54\1\u0ea3\1\u0ef2\0\u0229\0\u0229\1\u0f41\1\u0f90\0\u0229"+ + "\0\u0229\0\u0229\0\u0229\1\u0fdf\0\u0229\0\u0229\0\u0229\1\u102e"+ + "\1\u107d\1\u10cc\1\u111b\1\u116a\0\355\1\u11b9\1\u1208\1\u1257"+ + "\1\u12a6\1\u12f5\1\u1344\1\u1393\1\u13e2\1\u1431\1\u1480\1\u14cf"+ + "\1\u151e\1\u156d\1\u15bc\1\u160b\1\u165a\0\355\0\355\1\u16a9"+ + "\1\u16f8\1\u1747\0\355\1\u1796\1\u17e5\1\u1834\0\355\1\u1883"+ + "\1\u18d2\1\u1921\1\u1970\1\u19bf\1\u1a0e\1\u1a5d\1\u1aac\1\u1afb"+ + "\1\u1b4a\1\u1b99\1\u1be8\1\u1c37\1\u1c86\1\u1cd5\1\u1d24\1\u1d73"+ + "\1\u1dc2\1\u1e11\1\u1e60\1\u1eaf\1\u1efe\1\u1f4d\1\u1f9c\1\u1feb"+ + "\1\u203a\1\u2089\1\u20d8\0\u0229\0\u0229\0\u0229\1\u2127\1\u2176"+ + "\1\u21c5\1\u2214\1\u2263\1\u22b2\1\u2301\1\u2350\1\u239f\1\u23ee"+ + "\1\u243d\1\u248c\1\u24db\1\u252a\1\u2579\1\u25c8\1\u2617\1\u2666"+ + "\1\u26b5\1\u2704\1\u2753\1\u27a2\1\u27f1\1\u2840\0\355\1\u288f"+ + "\1\u28de\1\u292d\1\u297c\1\u29cb\1\u2a1a\1\u2a69\0\355\1\u2ab8"+ + "\1\u2b07\1\u2b56\1\u2ba5\1\u2bf4\1\u2c43\1\u2c92\1\u2ce1\1\u2d30"+ + "\1\u2d7f\1\u2dce\1\u2e1d\1\u2e6c\1\u2ebb\1\u2f0a\1\u2f59\1\u2fa8"+ + "\1\u2ff7\1\u3046\1\u3095\1\u30e4\1\u3133\1\u3182\1\u31d1\1\u3220"+ + "\1\u326f\1\u32be\0\u0229\1\u330d\1\u335c\0\355\1\u33ab\0\355"+ + "\1\u33fa\1\u3449\1\u3498\1\u34e7\1\u3536\1\u3585\1\u35d4\1\u3623"+ + "\1\u3672\1\u36c1\1\u3710\1\u375f\1\u37ae\1\u37fd\1\u384c\1\u389b"+ + "\1\u38ea\1\u3939\1\u3988\1\u39d7\0\355\1\u3a26\1\u3a75\1\u3ac4"+ + "\1\u3b13\1\u3b62\1\u3bb1\1\u3c00\0\355\1\u3c4f\1\u3c9e\1\u3ced"+ + "\1\u3d3c\1\u3d8b\0\355\1\u3dda\1\u3e29\1\u3e78\1\u3ec7\1\u3f16"+ + "\1\u3f65\1\u3fb4\1\u4003\1\u4052\1\u40a1\1\u40f0\1\u413f\1\u418e"+ + "\1\u41dd\1\u422c\1\u427b\1\u42ca\1\u4319\1\u4368\1\u43b7\1\u4406"+ + "\0\355\0\355\1\u4455\1\u44a4\1\u44f3\1\u4542\1\u4591\1\u45e0"+ + "\1\u462f\1\u467e\1\u46cd\1\u471c\1\u476b\1\u47ba\1\u4809\1\u4858"+ + "\1\u48a7\1\u48f6\1\u4945\1\u4994\0\355\1\u49e3\0\355\1\u4a32"+ + "\1\u4a81\1\u4ad0\1\u4b1f\0\355\1\u4b6e\1\u4bbd\1\u4c0c\1\u4c5b"+ + "\0\355\1\u4caa\1\u4cf9\1\u4d48\1\u4d97\1\u4de6\1\u4e35\1\u4e84"+ + "\1\u4ed3\1\u4f22\1\u4f71\1\u4fc0\1\u500f\0\355\1\u505e\1\u50ad"+ + "\1\u50fc\1\u514b\1\u519a\1\u51e9\1\u5238\1\u5287\1\u52d6\0\355"+ + "\1\u5325\1\u5374\1\u53c3\1\u5412\1\u5461\1\u54b0\1\u54ff\1\u554e"+ + "\1\u559d\1\u55ec\0\355\1\u563b\1\u568a\0\355\0\355\0\355"+ + "\1\u56d9\1\u5728\1\u5777\1\u57c6\1\u5815\1\u5864\1\u58b3\1\u5902"+ + "\1\u5951\1\u59a0\1\u59ef\1\u5a3e\1\u5a8d\1\u5adc\1\u5b2b\1\u5b7a"+ + "\1\u5bc9\1\u5c18\1\u5c67\1\u5cb6\1\u5d05\1\u5d54\1\u5da3\1\u5df2"+ + "\1\u5e41\1\u5e90\1\u5edf\1\u5f2e\0\355\1\u5f7d\1\u5fcc\1\u601b"+ + "\0\355\1\u606a\1\u60b9\1\u6108\1\u6157\1\u61a6\1\u61f5\1\u6244"+ + "\0\355\1\u6293\1\u62e2\0\355\1\u6331\1\u6380\0\355\1\u63cf"+ + "\1\u641e\1\u646d\1\u64bc\1\u650b\1\u655a\1\u65a9\1\u65f8\1\u6647"+ + "\1\u6696\1\u66e5\1\u6734\1\u6783\1\u67d2\1\u6821\1\u6870\1\u68bf"+ + "\1\u690e\1\u695d\1\u69ac\1\u69fb\1\u6a4a\0\355\0\355\1\u6a99"+ + "\1\u6ae8\1\u6b37\1\u6b86\1\u6bd5\1\u6c24\1\u6c73\0\355\1\u6cc2"+ + "\1\u6d11\0\355\0\355\1\u6d60\1\u6daf\1\u6dfe\1\u6e4d\1\u6e9c"+ + "\1\u6eeb\1\u6f3a\1\u6f89\0\355\1\u6fd8\1\u7027\1\u7076\1\u70c5"+ + "\1\u7114\1\u7163\1\u71b2\1\u7201\1\u7250\1\u729f\1\u72ee\1\u733d"+ + "\0\355\1\u738c\1\u73db\1\u742a\1\u7479\1\u74c8\0\355\1\u7517"+ + "\1\u7566\1\u75b5\1\u7604\1\u7653\0\355\1\u76a2\1\u76f1\0\355"+ + "\1\u7740\1\u778f\1\u77de\1\u782d\1\u787c\1\u78cb\1\u791a\1\u7969"+ + "\1\u79b8\1\u7a07\1\u7a56\1\u7aa5\1\u7af4\1\u7b43\0\355\1\u7b92"+ + "\0\355\0\355\1\u7be1\1\u7c30\0\355\1\u7c7f\1\u7cce\1\u7d1d"+ + "\1\u7d6c\1\u7dbb\1\u7e0a\0\355\0\355\0\355\0\355\1\u7e59"+ + "\1\u7ea8\1\u7ef7\1\u7f46\1\u7f95\0\355\0\355\1\u7fe4\1\u8033"+ + "\1\u8082\1\u80d1\0\355\1\u8120\1\u816f\1\u81be\1\u820d\1\u825c"+ + "\1\u82ab\1\u82fa\1\u8349\1\u8398\0\355\1\u83e7\1\u8436\1\u8485"+ + "\1\u84d4\1\u8523\0\355\0\355\1\u8572\1\u85c1\1\u8610\1\u865f"+ + "\1\u86ae\0\355\0\355\1\u86fd\1\u874c\1\u879b\1\u87ea\1\u8839"+ + "\1\u8888\0\355\1\u88d7\1\u8926\1\u8975\1\u89c4\1\u8a13\1\u8a62"+ + "\0\355\0\355\1\u8ab1\0\355\1\u8b00\1\u8b4f\1\u8b9e\0\355"+ + "\1\u8bed\0\355\1\u8c3c\0\355"; + + private static int [] zzUnpackRowMap() { + int [] result = new int[1524]; + int offset = 0; + offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackRowMap(String packed, int offset, int [] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int high = packed.charAt(i++) << 16; + result[j++] = high | packed.charAt(i++); + } + return j; + } + + /** + * The transition table of the DFA + */ + private static final int [] ZZ_TRANS = zzUnpackTrans(); + + private static final String ZZ_TRANS_PACKED_0 = + "\1\4\1\5\1\6\1\7\1\10\1\11\1\12\1\13"+ + "\1\4\1\14\1\15\1\16\1\17\1\20\1\12\1\4"+ + "\1\21\2\12\1\22\1\12\1\23\1\24\1\25\1\26"+ + "\1\27\2\12\1\30\1\31\2\12\1\32\1\33\1\34"+ + "\1\35\1\36\1\37\1\40\1\41\1\42\1\43\1\44"+ + "\2\5\1\45\1\46\1\47\1\50\1\51\1\52\1\53"+ + "\1\54\1\55\1\56\1\57\1\60\1\61\1\62\1\63"+ + "\1\64\1\12\2\7\3\12\1\65\1\4\1\66\1\67"+ + "\7\12\1\70\53\71\1\0\1\72\42\71\55\73\1\72"+ + "\41\73\123\0\1\74\114\0\2\7\1\74\71\0\2\7"+ + "\21\0\2\12\2\0\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\23\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\3\12\1\0\5\12\3\0\23\12\22\0\7\12\1\0"+ + "\12\12\5\77\1\100\1\101\1\0\1\102\1\103\1\101"+ + "\1\77\3\101\1\104\5\101\3\77\1\105\22\101\22\77"+ + "\1\101\2\77\4\101\1\106\12\101\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\12\12\1\107\3\12\1\110\4\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\3\12\1\0\5\12\3\0\1\12\1\111"+ + "\7\12\1\112\1\113\2\12\1\114\5\12\22\0\7\12"+ + "\1\0\12\12\13\0\1\10\12\0\1\115\36\0\1\116"+ + "\33\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\1\12\1\117\1\12\1\0\5\12\3\0\1\12\1\120"+ + "\1\12\1\121\17\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\10\12\1\122\1\12\1\123\10\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\12\12\1\124\10\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\1\12\1\125\1\0"+ + "\3\12\1\0\5\12\3\0\23\12\22\0\7\12\1\0"+ + "\12\12\65\0\1\126\116\0\1\127\33\0\2\12\1\75"+ + "\1\76\1\12\2\0\1\12\1\130\1\0\3\12\1\0"+ + "\5\12\3\0\4\12\1\131\3\12\1\132\2\12\1\133"+ + "\2\12\1\134\1\12\1\135\2\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\1\12"+ + "\1\136\1\0\3\12\1\0\5\12\3\0\1\137\3\12"+ + "\1\140\1\141\11\12\1\142\3\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\12\12\1\143\5\12"+ + "\1\144\2\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\1\12\1\145"+ + "\1\12\1\0\5\12\3\0\1\12\1\146\6\12\1\147"+ + "\1\150\1\151\10\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\1\12\1\152\1\0"+ + "\1\153\1\154\1\12\1\0\5\12\3\0\1\155\3\12"+ + "\1\156\1\157\6\12\1\160\6\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\16\12\1\161\4\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\1\162\2\12\1\0\5\12"+ + "\3\0\5\12\1\163\3\12\1\164\2\12\1\165\3\12"+ + "\1\166\2\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\3\12\1\0"+ + "\5\12\3\0\10\12\1\167\1\170\1\171\3\12\1\172"+ + "\1\12\1\173\2\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\10\12\1\174\1\12\1\175\10\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\10\12\1\176\12\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\1\12"+ + "\1\177\1\12\1\0\5\12\3\0\4\12\1\200\14\12"+ + "\1\201\1\202\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\3\12\1\0"+ + "\5\12\3\0\16\12\1\203\4\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\1\204\3\12\1\205"+ + "\16\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\1\12\1\206\6\12\1\207\5\12\1\210\4\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\12\12\1\211\10\12\22\0\7\12\1\0\12\12\56\0"+ + "\1\212\125\0\1\213\116\0\1\214\31\0\74\215\1\216"+ + "\22\215\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\15\12\1\217\5\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\16\12\1\220\4\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\4\12\1\221\16\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\3\12\1\0\5\12\3\0\12\12\1\222"+ + "\10\12\22\0\7\12\1\0\12\12\53\71\2\0\42\71"+ + "\55\73\1\0\41\73\2\0\2\223\72\0\2\223\24\0"+ + "\1\224\1\225\2\0\2\225\1\0\3\225\1\0\5\225"+ + "\3\0\23\225\22\0\1\225\2\0\4\225\1\0\12\225"+ + "\2\0\2\12\1\75\1\0\1\12\2\0\2\12\1\0"+ + "\3\12\1\0\5\12\3\0\23\12\22\0\7\12\1\0"+ + "\12\12\7\77\1\226\111\77\2\101\2\77\1\101\1\226"+ + "\1\77\2\101\1\77\3\101\1\77\5\101\3\77\23\101"+ + "\22\77\7\101\1\77\12\101\2\77\2\101\1\77\1\227"+ + "\1\101\1\230\1\77\2\101\1\77\3\101\1\77\5\101"+ + "\3\77\23\101\22\77\7\101\1\77\12\101\7\77\1\226"+ + "\1\77\1\231\1\232\1\77\1\233\3\77\1\234\1\77"+ + "\1\235\1\236\4\77\1\237\1\240\2\77\1\241\1\77"+ + "\1\242\1\77\1\243\1\244\1\77\1\245\1\246\1\77"+ + "\1\247\1\250\1\77\1\251\31\77\1\252\15\77\2\101"+ + "\1\77\1\227\1\101\1\230\1\77\2\101\1\77\3\101"+ + "\1\77\5\101\3\77\12\101\1\253\10\101\22\77\7\101"+ + "\1\77\12\101\5\77\1\254\1\255\1\226\1\77\2\255"+ + "\1\77\3\255\1\77\5\255\3\77\23\255\22\77\1\255"+ + "\2\77\4\255\1\77\12\255\2\77\2\101\1\77\1\227"+ + "\1\101\1\230\1\77\1\101\1\256\1\77\3\101\1\77"+ + "\5\101\3\77\23\101\22\77\7\101\1\77\12\101\7\77"+ + "\1\226\4\77\1\257\3\77\1\260\1\261\1\262\1\263"+ + "\5\77\1\264\2\77\1\265\50\77\1\266\1\267\1\270"+ + "\1\271\1\272\1\273\4\77\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\4\12\1\274\7\12\1\275\6\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\5\12\1\276\3\12"+ + "\1\277\1\12\1\300\1\301\6\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\17\12\1\302\3\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\10\12\1\303\7\12\1\304\2\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\16\12\1\305\4\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\12\12\1\306\10\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\4\12\1\307\16\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\3\12\1\0\5\12\3\0\4\12\1\310"+ + "\16\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\12\12\1\311\10\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\3\12\1\0\5\12\3\0\12\12\1\312\10\12\22\0"+ + "\7\12\1\0\12\12\2\0\2\12\1\75\1\76\1\12"+ + "\2\0\2\12\1\0\3\12\1\0\5\12\3\0\11\12"+ + "\1\313\11\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\3\12\1\0"+ + "\5\12\3\0\10\12\1\314\12\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\10\12\1\315\12\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\1\12\1\316\1\0\3\12\1\0\5\12"+ + "\3\0\23\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\3\12\1\0"+ + "\5\12\3\0\16\12\1\317\4\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\4\12\1\320\16\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\1\321\2\12\1\0\5\12"+ + "\3\0\14\12\1\322\6\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\3\12\1\0\5\12\3\0\16\12\1\323\4\12\22\0"+ + "\7\12\1\0\12\12\2\0\2\12\1\75\1\76\1\12"+ + "\2\0\1\12\1\324\1\0\3\12\1\0\5\12\3\0"+ + "\23\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\1\325\1\326\1\0\3\12\1\0"+ + "\5\12\3\0\12\12\1\327\1\12\1\330\6\12\22\0"+ + "\7\12\1\0\12\12\2\0\2\12\1\75\1\76\1\12"+ + "\2\0\2\12\1\0\3\12\1\0\5\12\3\0\13\12"+ + "\1\331\7\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\1\12\1\332\1\0\3\12"+ + "\1\0\5\12\3\0\4\12\1\333\16\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\1\12\1\334\1\12\1\0\5\12\3\0"+ + "\23\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\12\12\1\335\10\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\1\12\1\336\1\12\1\0\5\12\3\0\11\12\1\337"+ + "\11\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\1\12\1\340\1\12"+ + "\1\0\5\12\3\0\23\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\3\12\1\0\5\12\3\0\10\12\1\341\1\12\1\342"+ + "\10\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\11\12\1\343\11\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\1\12\1\344"+ + "\1\0\3\12\1\0\5\12\3\0\23\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\3\12\1\0\5\12\3\0\1\345\11\12"+ + "\1\346\10\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\1\12\1\347"+ + "\1\12\1\0\5\12\3\0\1\12\1\350\21\12\22\0"+ + "\7\12\1\0\12\12\2\0\2\12\1\75\1\76\1\12"+ + "\2\0\2\12\1\0\3\12\1\0\5\12\3\0\1\351"+ + "\22\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\1\352\1\12\1\0\3\12\1\0"+ + "\5\12\3\0\10\12\1\353\12\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\1\12"+ + "\1\354\1\0\3\12\1\0\5\12\3\0\23\12\22\0"+ + "\7\12\1\0\12\12\2\0\2\12\1\75\1\76\1\12"+ + "\2\0\1\12\1\355\1\0\3\12\1\0\5\12\3\0"+ + "\14\12\1\356\6\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\1\357\1\360\1\0"+ + "\3\12\1\0\5\12\3\0\4\12\1\361\1\362\2\12"+ + "\1\363\2\12\1\364\7\12\22\0\3\12\1\365\3\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\3\12\1\0\5\12\3\0\23\12\22\0"+ + "\7\12\1\0\11\12\1\366\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\1\367\1\12\1\0\3\12\1\0\5\12"+ + "\3\0\23\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\3\12\1\0"+ + "\5\12\3\0\14\12\1\370\6\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\1\12"+ + "\1\371\1\0\3\12\1\0\5\12\3\0\23\12\22\0"+ + "\7\12\1\0\12\12\2\0\2\12\1\75\1\76\1\12"+ + "\2\0\2\12\1\0\3\12\1\0\5\12\3\0\11\12"+ + "\1\372\2\12\1\373\6\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\3\12\1\0\5\12\3\0\1\12\1\374\10\12\1\375"+ + "\10\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\11\12\1\376\11\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\3\12\1\0\5\12\3\0\11\12\1\377\11\12\22\0"+ + "\7\12\1\0\12\12\2\0\2\12\1\75\1\76\1\12"+ + "\2\0\2\12\1\0\1\u0100\2\12\1\0\5\12\3\0"+ + "\23\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\1\12\1\u0101\1\12"+ + "\1\0\5\12\3\0\1\u0102\22\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\4\12\1\u0103\12\12"+ + "\1\u0104\3\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\3\12\1\0"+ + "\5\12\3\0\1\u0105\22\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\3\12\1\0\5\12\3\0\1\u0106\22\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\1\u0107\1\u0108\1\0\3\12\1\0\5\12\3\0\20\12"+ + "\1\u0109\2\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\3\12\1\0"+ + "\5\12\3\0\16\12\1\u010a\4\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\1\12\1\u010b\11\12"+ + "\1\u010c\1\12\1\u010d\5\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\1\12\1\u010e"+ + "\1\0\3\12\1\0\5\12\3\0\1\u010f\10\12\1\u0110"+ + "\11\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\16\12\1\u0111\4\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\1\12\1\u0112"+ + "\1\0\3\12\1\0\5\12\3\0\23\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\3\12\1\0\5\12\3\0\10\12\1\u0113"+ + "\5\12\1\u0114\4\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\11\12\1\u0115\11\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\3\12\1\0\5\12\3\0\11\12\1\u0116"+ + "\11\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\11\12\1\u0117\11\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\3\12\1\0\5\12\3\0\1\12\1\u0118\14\12\1\u0119"+ + "\4\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\10\12\1\u011a\12\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\1\12\1\u011b"+ + "\1\0\3\12\1\0\5\12\3\0\23\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\3\12\1\0\5\12\3\0\1\12\1\u011c"+ + "\21\12\22\0\7\12\1\0\12\12\2\0\2\225\2\0"+ + "\1\225\2\0\2\225\1\0\3\225\1\0\5\225\3\0"+ + "\23\225\22\0\7\225\1\0\12\225\2\0\2\225\1\0"+ + "\1\u011d\1\225\2\0\2\225\1\0\3\225\1\0\5\225"+ + "\1\0\2\u011e\23\225\22\0\7\225\1\0\12\225\2\77"+ + "\2\101\2\77\1\101\1\230\1\77\2\101\1\77\3\101"+ + "\1\77\5\101\3\77\23\101\22\77\7\101\1\77\12\101"+ + "\7\77\1\226\2\77\1\u011f\33\77\1\u0120\57\77\1\226"+ + "\30\77\1\u0121\6\77\1\u0122\56\77\1\226\5\77\1\u0123"+ + "\17\77\1\u0124\70\77\1\226\11\77\1\u0125\104\77\1\226"+ + "\10\77\1\234\105\77\1\226\14\77\1\u0126\101\77\1\226"+ + "\2\77\1\u0127\16\77\1\u0128\1\77\1\u0129\12\77\1\u012a"+ + "\57\77\1\226\24\77\1\u012b\71\77\1\226\4\77\1\u012c"+ + "\111\77\1\226\13\77\1\u012d\102\77\1\226\37\77\1\u012e"+ + "\56\77\1\226\36\77\1\u012f\57\77\1\226\30\77\1\u0130"+ + "\1\u0131\1\u0132\63\77\1\226\35\77\1\u0133\60\77\1\226"+ + "\42\77\1\u0134\53\77\1\226\20\77\1\u0135\7\77\1\u0136"+ + "\65\77\1\226\30\77\1\u0137\65\77\1\226\36\77\1\u0138"+ + "\52\77\2\101\1\77\1\227\1\101\1\230\1\77\2\101"+ + "\1\77\3\101\1\77\5\101\3\77\4\101\1\u0139\16\101"+ + "\22\77\7\101\1\77\12\101\2\77\2\255\2\77\1\255"+ + "\1\226\1\77\2\255\1\77\3\255\1\77\5\255\3\77"+ + "\23\255\22\77\7\255\1\77\12\255\2\77\2\255\1\77"+ + "\1\u013a\1\255\1\u013b\1\77\2\255\1\77\3\255\1\77"+ + "\5\255\3\77\23\255\22\77\7\255\1\77\12\255\2\77"+ + "\2\101\1\77\1\227\1\101\1\230\1\77\2\101\1\77"+ + "\3\101\1\77\5\101\3\77\10\101\1\u013c\12\101\22\77"+ + "\7\101\1\77\12\101\7\77\1\226\32\77\1\u013d\63\77"+ + "\1\226\25\77\1\u013e\70\77\1\226\21\77\1\u013f\74\77"+ + "\1\226\10\77\1\u0140\105\77\1\226\23\77\1\u0141\12\77"+ + "\1\u0142\57\77\1\226\37\77\1\u0143\56\77\1\226\32\77"+ + "\1\u0144\63\77\1\226\36\77\1\u0145\57\77\1\226\24\77"+ + "\1\u0146\71\77\1\226\40\77\1\u0147\55\77\1\226\35\77"+ + "\1\u0148\60\77\1\226\21\77\1\u0149\7\77\1\u014a\64\77"+ + "\1\226\20\77\1\u014b\20\77\1\u014c\45\77\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\3\12\1\0"+ + "\5\12\3\0\16\12\1\u014d\4\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\1\12\1\u014e\6\12"+ + "\1\u014f\12\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\3\12\1\0"+ + "\5\12\3\0\1\12\1\u0150\21\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\16\12\1\u0151\4\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\1\12\1\u0152\21\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\16\12\1\u0153\4\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\3\12\1\0\5\12\3\0\4\12\1\u0154"+ + "\16\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\16\12\1\u0155\4\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\3\12\1\0\5\12\3\0\4\12\1\u0156\16\12\22\0"+ + "\7\12\1\0\12\12\2\0\2\12\1\75\1\76\1\12"+ + "\2\0\2\12\1\0\3\12\1\0\5\12\3\0\14\12"+ + "\1\u0157\6\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\1\u0158\1\12\1\0\3\12"+ + "\1\0\5\12\3\0\23\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\3\12\1\0\5\12\3\0\2\12\1\u0159\20\12\22\0"+ + "\7\12\1\0\12\12\2\0\2\12\1\75\1\76\1\12"+ + "\2\0\2\12\1\0\3\12\1\0\5\12\3\0\13\12"+ + "\1\u015a\7\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\1\12\1\u015b"+ + "\1\12\1\0\5\12\3\0\23\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\1\12\1\u015c\21\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\1\12\1\u015d\1\0\2\12\1\u015e\1\0"+ + "\5\12\3\0\11\12\1\u015f\11\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\13\12\1\u0160\7\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\1\12\1\u0161\21\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\14\12\1\u0162\6\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\1\u0163\1\12\1\0\3\12\1\0\5\12\3\0\23\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\1\u0164\22\12\22\0\7\12\1\0\11\12\1\u0165\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\14\12\1\u0166\6\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\3\12\1\0\5\12\3\0\17\12\1\u0167"+ + "\3\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\3\12\1\u0168\17\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\3\12\1\0\5\12\3\0\1\12\1\u0169\21\12\22\0"+ + "\7\12\1\0\12\12\2\0\2\12\1\75\1\76\1\12"+ + "\2\0\2\12\1\0\3\12\1\0\5\12\3\0\16\12"+ + "\1\u016a\4\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\3\12\1\0"+ + "\5\12\3\0\20\12\1\u016b\2\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\1\12\1\u016c\1\12\1\0\5\12\3\0\23\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\1\12\1\u016d\1\12\1\0"+ + "\5\12\3\0\12\12\1\u016e\10\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\20\12\1\u016f\2\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\1\12\1\u0170\1\12\1\0"+ + "\5\12\3\0\23\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\23\12\22\0\6\12\1\u0171\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\1\12"+ + "\1\u0172\1\0\3\12\1\0\5\12\3\0\23\12\22\0"+ + "\7\12\1\0\12\12\2\0\2\12\1\75\1\76\1\12"+ + "\2\0\2\12\1\0\3\12\1\0\5\12\3\0\1\u0173"+ + "\22\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\1\u0174\22\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\17\12\1\u0175\3\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\3\12\1\0\5\12\3\0\17\12\1\u0176"+ + "\3\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\2\12\1\u0177\1\0"+ + "\5\12\3\0\23\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\11\12\1\u0178\11\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\1\12\1\u0179\1\0\3\12\1\0\5\12\3\0\23\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\20\12\1\u017a\2\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\12\12\1\u017b\10\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\3\12\1\0\5\12\3\0\10\12\1\u017c"+ + "\12\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\1\12\1\u017d\10\12\1\u017e\3\12\1\u017f\1\12"+ + "\1\u0180\2\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\1\12\1\u0181"+ + "\1\12\1\0\5\12\3\0\23\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\16\12\1\u0182\4\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\1\12\1\u0183\10\12\1\u0184\10\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\16\12\1\u0185\4\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\16\12\1\u0186\4\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\20\12\1\u0187\2\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\1\u0188\1\12\1\0\3\12\1\0\5\12\3\0\23\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\16\12\1\u0189\4\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\1\u018a\1\12\1\0"+ + "\3\12\1\0\5\12\3\0\23\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\20\12\1\u018b\2\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\16\12\1\u018c\4\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\16\12\1\u018d\4\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\3\12\1\0\5\12\3\0\20\12\1\u018e"+ + "\2\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\1\12\1\u018f\1\0\3\12\1\0"+ + "\5\12\3\0\10\12\1\u0190\12\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\2\12\1\u0191\1\0\5\12\3\0\23\12\22\0"+ + "\7\12\1\0\12\12\2\0\2\12\1\75\1\76\1\12"+ + "\2\0\2\12\1\0\3\12\1\0\5\12\3\0\21\12"+ + "\1\u0192\1\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\1\12\1\u0193\1\0\3\12"+ + "\1\0\5\12\3\0\23\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\1\12\1\u0194"+ + "\1\0\3\12\1\0\5\12\3\0\23\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\3\12\1\0\5\12\3\0\5\12\1\u0195"+ + "\15\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\1\12\1\u0196\1\12"+ + "\1\0\5\12\3\0\23\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\3\12\1\0\5\12\3\0\14\12\1\u0197\6\12\22\0"+ + "\7\12\1\0\12\12\2\0\2\12\1\75\1\76\1\12"+ + "\2\0\2\12\1\0\3\12\1\0\5\12\3\0\16\12"+ + "\1\u0198\4\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\3\12\1\0"+ + "\5\12\3\0\1\u0199\3\12\1\u019a\7\12\1\u019b\6\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\17\12\1\u019c\3\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\1\12\1\u019d\1\0"+ + "\3\12\1\0\5\12\3\0\23\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\16\12\1\u019e\4\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\11\12\1\u019f\11\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\17\12\1\u01a0\3\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\3\12\1\0\5\12\3\0\4\12\1\u01a1"+ + "\16\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\1\12\1\u01a2\1\0\3\12\1\0"+ + "\5\12\3\0\23\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\12\12\1\u01a3\10\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\3\12\1\0\5\12\3\0\1\12\1\u01a4"+ + "\21\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\10\12\1\u01a5\12\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\3\12\1\0\5\12\3\0\1\u01a6\22\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\3\12\1\0\5\12\3\0\2\12\1\u01a7"+ + "\20\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\1\12\1\u01a8\21\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\3\12\1\0\5\12\3\0\23\12\22\0\6\12\1\u01a9"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\3\12\1\0\5\12\3\0\1\12\1\u01aa"+ + "\21\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\1\12\1\u01ab\21\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\1\12\1\u01ac\1\12\1\0\5\12\3\0\23\12\22\0"+ + "\7\12\1\0\12\12\2\0\2\12\1\75\1\76\1\12"+ + "\2\0\2\12\1\0\3\12\1\0\5\12\3\0\4\12"+ + "\1\u01ad\16\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\1\12\1\u01ae"+ + "\1\12\1\0\5\12\3\0\23\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\16\12\1\u01af\4\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\4\12\1\u01b0\16\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\225\2\0\1\225\2\0\2\225\1\0\3\225\1\0"+ + "\5\225\1\0\2\u011e\23\225\22\0\7\225\1\0\12\225"+ + "\5\0\1\u01b1\1\u01b2\2\0\2\u01b2\1\0\3\u01b2\1\0"+ + "\5\u01b2\3\0\23\u01b2\22\0\1\u01b2\2\0\4\u01b2\1\0"+ + "\12\u01b2\7\77\1\226\3\77\1\u01b3\112\77\1\226\5\77"+ + "\1\u01b4\110\77\1\226\31\77\1\u01b5\64\77\1\226\31\77"+ + "\1\u01b6\64\77\1\226\6\77\1\u01b7\23\77\1\u01b8\63\77"+ + "\1\226\3\77\1\u01b9\105\77\1\u01ba\1\u01bb\3\77\1\226"+ + "\66\77\2\u01bb\26\77\1\226\12\77\1\u0125\103\77\1\226"+ + "\3\77\1\u01bc\24\77\1\u01bd\65\77\1\226\22\77\1\u01be"+ + "\73\77\1\226\24\77\1\u0124\71\77\1\226\2\77\1\u01bf"+ + "\113\77\1\226\1\77\1\u01c0\114\77\1\226\25\77\1\u0124"+ + "\70\77\1\226\27\77\1\u01c1\66\77\1\226\32\77\1\u01c2"+ + "\63\77\1\226\5\77\1\u01c3\12\77\1\u01c4\47\77\1\u01c5"+ + "\25\77\1\226\23\77\1\u01c6\72\77\1\226\21\77\1\u01c7"+ + "\74\77\1\226\32\77\1\u01c8\63\77\1\226\30\77\1\u01c9"+ + "\65\77\1\226\33\77\1\u01ca\62\77\1\226\22\77\1\u01cb"+ + "\73\77\1\226\42\77\1\u01cc\53\77\1\226\5\77\1\u01cd"+ + "\110\77\1\226\21\77\1\u01ce\67\77\2\101\1\77\1\227"+ + "\1\101\1\230\1\77\2\101\1\77\3\101\1\77\5\101"+ + "\3\77\16\101\1\u01cf\4\101\22\77\7\101\1\77\12\101"+ + "\2\77\2\255\2\77\1\255\1\u013b\1\77\2\255\1\77"+ + "\3\255\1\77\5\255\3\77\23\255\22\77\7\255\1\77"+ + "\12\255\2\77\2\101\1\77\1\227\1\101\1\230\1\77"+ + "\2\101\1\77\3\101\1\77\5\101\3\77\11\101\1\u01d0"+ + "\11\101\22\77\7\101\1\77\12\101\7\77\1\226\40\77"+ + "\1\u01d1\55\77\1\226\21\77\1\u01d2\74\77\1\226\25\77"+ + "\1\u01d3\70\77\1\226\25\77\1\u01d4\70\77\1\226\24\77"+ + "\1\u01d5\71\77\1\226\24\77\1\u01d6\71\77\1\226\37\77"+ + "\1\u01d7\56\77\1\226\6\77\1\u01d8\107\77\1\226\5\77"+ + "\1\u01d9\26\77\1\u01da\61\77\1\226\13\77\1\u01db\12\77"+ + "\1\u01dc\67\77\1\226\2\77\1\u01dd\113\77\1\226\30\77"+ + "\1\u01de\65\77\1\226\37\77\1\u01df\56\77\1\226\21\77"+ + "\1\u01e0\6\77\1\u01e1\65\77\1\226\20\77\1\u01e2\75\77"+ + "\1\226\30\77\1\u01e3\56\77\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\4\12\1\u01e4\16\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\20\12\1\u01e5\2\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\3\12\1\0\5\12\3\0\21\12\1\u01e6"+ + "\1\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\4\12\1\u01e7\16\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\1\u01e8\1\12"+ + "\1\0\3\12\1\0\5\12\3\0\23\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\3\12\1\0\5\12\3\0\1\u01e9\22\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\1\u01ea\22\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\2\12\1\u01eb"+ + "\1\0\5\12\3\0\23\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\3\12\1\0\5\12\3\0\1\12\1\u01ec\21\12\22\0"+ + "\7\12\1\0\12\12\2\0\2\12\1\75\1\76\1\12"+ + "\2\0\2\12\1\0\3\12\1\0\5\12\3\0\20\12"+ + "\1\u01ed\2\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\3\12\1\0"+ + "\5\12\3\0\16\12\1\u01ee\4\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\4\12\1\u01ef\16\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\16\12\1\u01f0\4\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\16\12\1\u01f1\4\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\1\12\1\u01f2\1\0\3\12\1\0\5\12\3\0\23\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\1\u01f3\22\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\3\12\1\0"+ + "\5\12\3\0\1\u01f4\22\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\3\12\1\0\5\12\3\0\1\12\1\u01f5\21\12\22\0"+ + "\7\12\1\0\12\12\2\0\2\12\1\75\1\76\1\12"+ + "\2\0\2\12\1\0\3\12\1\0\5\12\3\0\16\12"+ + "\1\u01f6\4\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\3\12\1\0"+ + "\5\12\3\0\16\12\1\u01f7\4\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\16\12\1\u01f8\4\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\13\12\1\u01f9\7\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\21\12\1\u01fa\1\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\3\12\1\0\5\12\3\0\11\12\1\u01fb"+ + "\11\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\1\12\1\u01fc\1\0\3\12\1\0"+ + "\5\12\3\0\23\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\20\12\1\u01fd\2\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\3\12\1\0\5\12\3\0\1\12\1\u01fe"+ + "\21\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\11\12\1\u01ff\11\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\3\12\1\0\5\12\3\0\4\12\1\u0200\16\12\22\0"+ + "\7\12\1\0\12\12\2\0\2\12\1\75\1\76\1\12"+ + "\2\0\2\12\1\0\3\12\1\0\5\12\3\0\16\12"+ + "\1\u0201\4\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\1\12\1\u0202\1\0\3\12"+ + "\1\0\5\12\3\0\23\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\3\12\1\0\5\12\3\0\16\12\1\u0203\4\12\22\0"+ + "\7\12\1\0\12\12\2\0\2\12\1\75\1\76\1\12"+ + "\2\0\2\12\1\0\3\12\1\0\5\12\3\0\16\12"+ + "\1\u0204\4\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\3\12\1\0"+ + "\5\12\3\0\1\12\1\u0205\21\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\11\12\1\u0206\11\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\1\12\1\u0207\1\0\3\12\1\0\5\12"+ + "\3\0\23\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\3\12\1\0"+ + "\5\12\3\0\14\12\1\u0208\6\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\1\u0209\22\12\22\0"+ + "\7\12\1\0\12\12\2\0\2\12\1\75\1\76\1\12"+ + "\2\0\2\12\1\0\3\12\1\0\5\12\3\0\2\12"+ + "\1\u020a\20\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\3\12\1\0"+ + "\5\12\3\0\14\12\1\u020b\6\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\11\12\1\u020c\11\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\17\12\1\u020d\3\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\3\12\1\u020e\17\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\3\12\1\0\5\12\3\0\11\12\1\u020f"+ + "\11\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\12\12\1\u0210\10\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\3\12\1\0\5\12\3\0\11\12\1\u0211\11\12\22\0"+ + "\7\12\1\0\12\12\2\0\2\12\1\75\1\76\1\12"+ + "\2\0\2\12\1\0\3\12\1\0\5\12\3\0\13\12"+ + "\1\u0212\7\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\3\12\1\0"+ + "\5\12\3\0\5\12\1\u0213\15\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\11\12\1\u0214\11\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\16\12\1\u0215\4\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\11\12\1\u0216\11\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\3\12\1\0\5\12\3\0\12\12\1\u0217"+ + "\10\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\1\12\1\u0218\21\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\3\12\1\0\5\12\3\0\14\12\1\u0219\6\12\22\0"+ + "\7\12\1\0\12\12\2\0\2\12\1\75\1\76\1\12"+ + "\2\0\2\12\1\0\3\12\1\0\5\12\3\0\11\12"+ + "\1\u021a\11\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\3\12\1\0"+ + "\5\12\3\0\11\12\1\u021b\11\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\1\12\1\u021c\1\12\1\0\5\12\3\0\23\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\10\12\1\u021d\12\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\10\12\1\u021e\12\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\3\12\1\0\5\12\3\0\16\12\1\u021f"+ + "\4\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\12\12\1\u0220\10\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\3\12\1\0\5\12\3\0\1\12\1\u0221\21\12\22\0"+ + "\7\12\1\0\12\12\2\0\2\12\1\75\1\76\1\12"+ + "\2\0\1\12\1\u0222\1\0\3\12\1\0\5\12\3\0"+ + "\23\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\16\12\1\u0223\4\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\3\12\1\0\5\12\3\0\16\12\1\u0224\4\12\22\0"+ + "\7\12\1\0\12\12\2\0\2\12\1\75\1\76\1\12"+ + "\2\0\2\12\1\0\3\12\1\0\5\12\3\0\16\12"+ + "\1\u0225\4\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\3\12\1\0"+ + "\5\12\3\0\3\12\1\u0226\17\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\3\12\1\u0227\17\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\1\12\1\u0228\1\0\3\12\1\0\5\12"+ + "\3\0\23\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\3\12\1\0"+ + "\5\12\3\0\1\u0229\22\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\1\u022a\2\12\1\0\5\12\3\0\23\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\1\u022b\1\12\1\0\3\12\1\0\5\12\3\0\23\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\10\12\1\u022c\12\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\16\12\1\u022d\4\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\1\12\1\u022e\1\12\1\0\5\12\3\0"+ + "\23\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\13\12\1\u022f\7\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\3\12\1\0\5\12\3\0\10\12\1\u0230\12\12\22\0"+ + "\7\12\1\0\12\12\2\0\2\12\1\75\1\76\1\12"+ + "\2\0\2\12\1\0\3\12\1\0\5\12\3\0\5\12"+ + "\1\u0231\15\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\3\12\1\0"+ + "\5\12\3\0\16\12\1\u0232\4\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\2\12\1\u0233\20\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\u01b2\2\0\1\u01b2"+ + "\2\0\2\u01b2\1\0\3\u01b2\1\0\5\u01b2\3\0\23\u01b2"+ + "\22\0\7\u01b2\1\0\12\u01b2\2\0\2\u01b2\1\u0234\1\u0235"+ + "\1\u01b2\2\0\2\u01b2\1\0\3\u01b2\1\0\5\u01b2\3\0"+ + "\23\u01b2\22\0\7\u01b2\1\0\12\u01b2\5\77\1\u0236\1\u0237"+ + "\1\226\1\77\2\u0237\1\77\3\u0237\1\77\5\u0237\3\77"+ + "\23\u0237\22\77\1\u0237\2\77\4\u0237\1\77\12\u0237\7\77"+ + "\1\226\30\77\1\u0238\65\77\1\226\22\77\1\u0239\73\77"+ + "\1\226\3\77\1\u023a\112\77\1\226\3\77\1\u023b\112\77"+ + "\1\226\34\77\1\u023c\57\77\1\u023d\1\u023e\1\226\1\77"+ + "\2\u023e\1\77\3\u023e\1\77\5\u023e\3\77\23\u023e\22\77"+ + "\1\u023e\2\77\4\u023e\1\77\12\u023e\7\77\1\226\3\77"+ + "\1\u023f\105\77\2\u01bb\3\77\1\226\3\77\1\u023f\62\77"+ + "\2\u01bb\26\77\1\226\20\77\1\u0240\10\77\1\u0241\1\77"+ + "\1\u0242\1\u0243\1\77\1\u0244\57\77\1\226\2\77\1\u0245"+ + "\113\77\1\226\3\77\1\u0246\112\77\1\u0247\116\77\1\226"+ + "\36\77\1\u0248\57\77\1\226\3\77\1\u0249\112\77\1\226"+ + "\40\77\1\u024a\55\77\1\226\30\77\1\u024b\65\77\1\226"+ + "\36\77\1\u024c\57\77\1\226\40\77\1\u024d\55\77\1\226"+ + "\5\77\1\u024e\110\77\1\226\41\77\1\u024f\54\77\1\226"+ + "\5\77\1\u0250\110\77\1\226\24\77\1\u0251\71\77\1\226"+ + "\21\77\1\u0252\74\77\1\u0253\114\77\1\u0254\1\77\1\226"+ + "\116\77\1\226\40\77\1\u0255\55\77\1\226\22\77\1\u0256"+ + "\66\77\2\101\1\77\1\227\1\101\1\u0257\1\77\2\101"+ + "\1\77\3\101\1\77\5\101\3\77\23\101\22\77\7\101"+ + "\1\77\12\101\2\77\2\101\1\77\1\227\1\101\1\230"+ + "\1\77\1\101\1\u0258\1\77\3\101\1\77\5\101\3\77"+ + "\23\101\22\77\7\101\1\77\12\101\7\77\1\226\24\77"+ + "\1\u0259\71\77\1\226\25\77\1\u025a\70\77\1\226\32\77"+ + "\1\u025b\63\77\1\226\21\77\1\u025c\74\77\1\226\34\77"+ + "\1\u025d\61\77\1\226\1\77\1\u025e\114\77\1\226\36\77"+ + "\1\u025f\55\77\1\u0260\1\77\1\226\116\77\1\226\30\77"+ + "\1\u0261\65\77\1\226\36\77\1\u0262\57\77\1\226\21\77"+ + "\1\u0263\74\77\1\226\36\77\1\u0264\57\77\1\226\13\77"+ + "\1\u0265\12\77\1\u0266\67\77\1\226\24\77\1\u0267\71\77"+ + "\1\226\36\77\1\u0268\57\77\1\226\41\77\1\u0269\54\77"+ + "\1\226\24\77\1\u026a\71\77\1\226\21\77\1\u026b\74\77"+ + "\1\226\2\77\1\u026c\104\77\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\16\12\1\u026d\4\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\1\12"+ + "\1\u026e\1\12\1\0\5\12\3\0\23\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\3\12\1\0\5\12\3\0\16\12\1\u026f"+ + "\4\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\1\u0270\1\12\1\0\3\12\1\0"+ + "\5\12\3\0\23\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\16\12\1\u0271\4\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\1\12\1\u0272\1\12\1\0\5\12\3\0"+ + "\23\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\1\12\1\u0273\21\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\3\12\1\0\5\12\3\0\4\12\1\u0274\16\12\22\0"+ + "\7\12\1\0\12\12\2\0\2\12\1\75\1\76\1\12"+ + "\2\0\2\12\1\0\3\12\1\0\5\12\3\0\10\12"+ + "\1\u0275\12\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\3\12\1\0"+ + "\5\12\3\0\10\12\1\u0276\12\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\2\12\1\u0277\20\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\15\12\1\u0278\5\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\15\12\1\u0279\5\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\3\12\1\0\5\12\3\0\5\12\1\u027a"+ + "\15\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\10\12\1\u027b\12\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\1\12\1\u027c"+ + "\1\0\3\12\1\0\5\12\3\0\23\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\3\12\1\0\5\12\3\0\14\12\1\u027d"+ + "\6\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\1\u027e\22\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\16\12\1\u027f\4\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\3\12\1\0\5\12\3\0\1\12\1\u0280"+ + "\21\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\5\12\1\u0281\15\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\1\u0282\1\12"+ + "\1\0\3\12\1\0\5\12\3\0\23\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\3\12\1\0\5\12\3\0\16\12\1\u0283"+ + "\4\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\1\12\1\u0284\1\0\3\12\1\0"+ + "\5\12\3\0\23\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\1\12\1\u0285\21\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\3\12\1\0\5\12\3\0\11\12\1\u0286"+ + "\11\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\1\u0287\2\12\1\0"+ + "\5\12\3\0\23\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\10\12\1\u0288\12\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\3\12\1\0\5\12\3\0\10\12\1\u0289"+ + "\12\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\4\12\1\u028a\16\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\1\12\1\u028b"+ + "\1\0\3\12\1\0\5\12\3\0\23\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\3\12\1\0\5\12\3\0\16\12\1\u028c"+ + "\4\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\1\u028d\22\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\4\12\1\u028e\16\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\1\12\1\u028f\1\0\3\12\1\0\5\12\3\0\23\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\1\12\1\u0290\21\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\4\12\1\u0291\16\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\3\12\1\0\5\12\3\0\11\12\1\u0292"+ + "\11\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\16\12\1\u0293\4\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\3\12\1\0\5\12\3\0\4\12\1\u0294\16\12\22\0"+ + "\7\12\1\0\12\12\2\0\2\12\1\75\1\76\1\12"+ + "\2\0\2\12\1\0\3\12\1\0\5\12\3\0\11\12"+ + "\1\u0295\11\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\1\12\1\u0296\1\0\3\12"+ + "\1\0\5\12\3\0\23\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\3\12\1\0\5\12\3\0\16\12\1\u0297\4\12\22\0"+ + "\7\12\1\0\12\12\2\0\2\12\1\75\1\76\1\12"+ + "\2\0\2\12\1\0\3\12\1\0\5\12\3\0\11\12"+ + "\1\u0298\11\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\1\12\1\u0299"+ + "\1\12\1\0\5\12\3\0\23\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\2\12\1\u029a\20\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\1\12\1\u029b\1\0\3\12\1\0\5\12"+ + "\3\0\23\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\3\12\1\0"+ + "\5\12\3\0\14\12\1\u029c\6\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\11\12\1\u029d\11\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\14\12\1\u029e\6\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\11\12\1\u029f\11\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\3\12\1\0\5\12\3\0\14\12\1\u02a0"+ + "\6\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\11\12\1\u02a1\11\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\3\12\1\0\5\12\3\0\4\12\1\u02a2\16\12\22\0"+ + "\7\12\1\0\12\12\2\0\2\12\1\75\1\76\1\12"+ + "\2\0\2\12\1\0\3\12\1\0\5\12\3\0\13\12"+ + "\1\u02a3\7\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\3\12\1\0"+ + "\5\12\3\0\16\12\1\u02a4\4\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\1\12\1\u02a5\21\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\10\12\1\u02a6\12\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\2\12\1\u02a7\20\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\3\12\1\0\5\12\3\0\12\12\1\u02a8"+ + "\10\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\1\12\1\u02a9\1\0\3\12\1\0"+ + "\5\12\3\0\4\12\1\u02aa\16\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\1\12\1\u02ab\1\12"+ + "\1\u02ac\17\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\3\12\1\0"+ + "\5\12\3\0\16\12\1\u02ad\4\12\22\0\7\12\1\0"+ + "\12\12\5\0\1\u02ae\1\u02af\2\0\2\u02af\1\0\3\u02af"+ + "\1\0\5\u02af\3\0\23\u02af\22\0\1\u02af\2\0\4\u02af"+ + "\1\0\12\u02af\2\0\2\u01b2\1\u0234\1\0\1\u01b2\2\0"+ + "\2\u01b2\1\0\3\u01b2\1\0\5\u01b2\3\0\23\u01b2\22\0"+ + "\7\u01b2\1\0\12\u01b2\2\77\2\u0237\2\77\1\u0237\1\226"+ + "\1\77\2\u0237\1\77\3\u0237\1\77\5\u0237\3\77\23\u0237"+ + "\22\77\7\u0237\1\77\12\u0237\2\77\2\u0237\1\77\1\u02b0"+ + "\1\u0237\1\u02b1\1\77\2\u0237\1\77\3\u0237\1\77\5\u0237"+ + "\3\77\23\u0237\22\77\7\u0237\1\77\12\u0237\7\77\1\226"+ + "\23\77\1\u02b2\72\77\1\226\36\77\1\u02b3\55\77\1\u02b4"+ + "\1\u02b5\1\226\1\77\2\u02b5\1\77\3\u02b5\1\77\5\u02b5"+ + "\3\77\23\u02b5\22\77\1\u02b5\2\77\4\u02b5\1\77\12\u02b5"+ + "\5\77\1\u02b6\1\u02b7\1\226\1\77\2\u02b7\1\77\3\u02b7"+ + "\1\77\5\u02b7\3\77\23\u02b7\22\77\1\u02b7\2\77\4\u02b7"+ + "\1\77\12\u02b7\7\77\1\226\6\77\1\u02b8\102\77\2\u023e"+ + "\2\77\1\u023e\1\226\1\77\2\u023e\1\77\3\u023e\1\77"+ + "\5\u023e\3\77\23\u023e\22\77\7\u023e\1\77\12\u023e\2\77"+ + "\2\u023e\1\u02b9\1\u02ba\1\u023e\1\226\1\77\2\u023e\1\77"+ + "\3\u023e\1\77\5\u023e\3\77\23\u023e\22\77\7\u023e\1\77"+ + "\12\u023e\5\77\1\u02bb\1\u02bc\1\226\1\77\2\u02bc\1\77"+ + "\3\u02bc\1\77\5\u02bc\3\77\23\u02bc\22\77\1\u02bc\2\77"+ + "\4\u02bc\1\77\12\u02bc\7\77\1\226\2\77\1\u02bd\33\77"+ + "\1\u02be\57\77\1\226\30\77\1\u02bf\5\77\1\u02c0\57\77"+ + "\1\226\31\77\1\u02c1\64\77\1\226\32\77\1\u02c2\63\77"+ + "\1\226\42\77\1\u02c3\53\77\1\226\36\77\1\u02c4\55\77"+ + "\1\u02c5\1\u02c6\1\226\1\77\2\u02c6\1\77\3\u02c6\1\77"+ + "\5\u02c6\3\77\23\u02c6\22\77\1\u02c6\2\77\4\u02c6\1\77"+ + "\12\u02c6\7\77\1\226\42\77\1\u02c7\51\77\1\u02c8\1\u02c9"+ + "\1\226\1\77\2\u02c9\1\77\3\u02c9\1\77\5\u02c9\3\77"+ + "\23\u02c9\22\77\1\u02c9\2\77\4\u02c9\1\77\12\u02c9\7\77"+ + "\1\226\24\77\1\u02ca\71\77\1\226\2\77\1\u02cb\113\77"+ + "\1\226\2\77\1\u02cc\113\77\1\226\36\77\1\u02cd\57\77"+ + "\1\226\32\77\1\u02ce\63\77\1\226\30\77\1\u02cf\65\77"+ + "\1\u02d0\116\77\1\226\24\77\1\u02d1\71\77\1\226\31\77"+ + "\1\u02d2\64\77\1\226\20\77\1\u02d3\75\77\1\226\36\77"+ + "\1\u02d4\57\77\1\226\35\77\1\u02d5\53\77\2\101\1\77"+ + "\1\227\1\101\1\u02d6\1\77\2\101\1\77\3\101\1\77"+ + "\5\101\3\77\23\101\22\77\7\101\1\77\12\101\7\77"+ + "\1\226\1\77\1\u02d7\114\77\1\226\32\77\1\u02d8\63\77"+ + "\1\u02d9\116\77\1\226\25\77\1\u02da\66\77\1\u02db\1\77"+ + "\1\u02dc\116\77\1\226\75\77\1\u02dd\20\77\1\226\1\77"+ + "\1\u02de\114\77\1\226\31\77\1\u02df\64\77\1\226\2\77"+ + "\1\u02e0\113\77\1\226\21\77\1\u02e1\74\77\1\226\22\77"+ + "\1\u02e2\73\77\1\226\20\77\1\u02e3\75\77\1\226\21\77"+ + "\1\u02e4\74\77\1\226\36\77\1\u02e5\57\77\1\226\24\77"+ + "\1\u02e6\71\77\1\226\31\77\1\u02e7\64\77\1\226\21\77"+ + "\1\u02e8\74\77\1\226\20\77\1\u02e9\75\77\1\226\22\77"+ + "\1\u02ea\73\77\1\226\30\77\1\u02eb\56\77\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\1\u02ec\1\12\1\0\3\12"+ + "\1\0\5\12\3\0\23\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\1\12\1\u02ed"+ + "\1\0\3\12\1\0\5\12\3\0\23\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\1\u02ee\1\12\1\0\3\12\1\0\5\12\3\0\23\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\16\12\1\u02ef\4\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\1\12\1\u02f0\21\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\1\12\1\u02f1\1\0\3\12\1\0\5\12\3\0\23\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\2\12\1\u02f2\20\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\2\12\1\u02f3\20\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\3\12\1\0\5\12\3\0\4\12\1\u02f4"+ + "\16\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\12\12\1\u02f5\10\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\3\12\1\0\5\12\3\0\12\12\1\u02f6\10\12\22\0"+ + "\7\12\1\0\12\12\2\0\2\12\1\75\1\76\1\12"+ + "\2\0\2\12\1\0\3\12\1\0\5\12\3\0\3\12"+ + "\1\u02f7\17\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\1\12\1\u02f8"+ + "\1\12\1\0\5\12\3\0\23\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\1\u02f9\22\12\22\0"+ + "\7\12\1\0\12\12\2\0\2\12\1\75\1\76\1\12"+ + "\2\0\1\12\1\u02fa\1\0\3\12\1\0\5\12\3\0"+ + "\23\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\1\u02fb\22\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\1\u02fc\1\12\1\0"+ + "\3\12\1\0\5\12\3\0\23\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\10\12\1\u02fd\12\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\16\12\1\u02fe\4\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\1\u02ff\22\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\23\12\22\0\3\12"+ + "\1\u0300\3\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\20\12\1\u0301\2\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\14\12\1\u0302\6\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\1\12\1\u0303\1\0\3\12\1\0\5\12\3\0\23\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\1\12\1\u0304\21\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\4\12\1\u0305\16\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\3\12\1\0\5\12\3\0\1\12\1\u0306"+ + "\21\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\4\12\1\u0307\16\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\1\12\1\u0308\1\12\1\0\5\12\3\0\23\12\22\0"+ + "\7\12\1\0\12\12\2\0\2\12\1\75\1\76\1\12"+ + "\2\0\2\12\1\0\3\12\1\0\5\12\3\0\16\12"+ + "\1\u0309\4\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\3\12\1\0"+ + "\5\12\3\0\1\12\1\u030a\21\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\1\u030b"+ + "\1\12\1\0\3\12\1\0\5\12\3\0\23\12\22\0"+ + "\7\12\1\0\12\12\2\0\2\12\1\75\1\76\1\12"+ + "\2\0\2\12\1\0\3\12\1\0\5\12\3\0\16\12"+ + "\1\u030c\4\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\3\12\1\0"+ + "\5\12\3\0\16\12\1\u030d\4\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\16\12\1\u030e\4\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\16\12\1\u030f\4\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\1\12\1\u0310\1\0"+ + "\3\12\1\0\5\12\3\0\23\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\17\12\1\u0311\3\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\10\12\1\u0312\12\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\1\12\1\u0313\1\0"+ + "\3\12\1\0\5\12\3\0\23\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\4\12\1\u0314\16\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\1\12\1\u0315\1\0\3\12\1\0\5\12"+ + "\3\0\23\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\3\12\1\0"+ + "\5\12\3\0\16\12\1\u0316\4\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\1\12"+ + "\1\u0317\1\0\3\12\1\0\5\12\3\0\23\12\22\0"+ + "\7\12\1\0\12\12\2\0\2\12\1\75\1\76\1\12"+ + "\2\0\1\12\1\u0318\1\0\3\12\1\0\5\12\3\0"+ + "\23\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\16\12\1\u0319\4\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\3\12\1\0\5\12\3\0\1\12\1\u031a\21\12\22\0"+ + "\7\12\1\0\12\12\2\0\2\12\1\75\1\76\1\12"+ + "\2\0\2\12\1\0\3\12\1\0\5\12\3\0\1\12"+ + "\1\u031b\21\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\1\12\1\u031c\1\0\3\12"+ + "\1\0\5\12\3\0\23\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\3\12\1\0\5\12\3\0\14\12\1\u031d\6\12\22\0"+ + "\7\12\1\0\12\12\2\0\2\12\1\75\1\76\1\12"+ + "\2\0\2\12\1\0\3\12\1\0\5\12\3\0\11\12"+ + "\1\u031e\11\12\22\0\7\12\1\0\12\12\2\0\2\u02af"+ + "\2\0\1\u02af\2\0\2\u02af\1\0\3\u02af\1\0\5\u02af"+ + "\3\0\23\u02af\22\0\7\u02af\1\0\12\u02af\2\0\2\u02af"+ + "\1\0\1\u031f\1\u02af\2\0\2\u02af\1\0\3\u02af\1\0"+ + "\5\u02af\3\0\23\u02af\22\0\7\u02af\1\0\12\u02af\2\77"+ + "\2\u0237\2\77\1\u0237\1\u02b1\1\77\2\u0237\1\77\3\u0237"+ + "\1\77\5\u0237\3\77\23\u0237\22\77\7\u0237\1\77\12\u0237"+ + "\7\77\1\u0320\71\77\1\u0321\24\77\1\226\2\77\1\u0322"+ + "\106\77\2\u02b5\2\77\1\u02b5\1\226\1\77\2\u02b5\1\77"+ + "\3\u02b5\1\77\5\u02b5\3\77\23\u02b5\22\77\7\u02b5\1\77"+ + "\12\u02b5\2\77\2\u02b5\1\77\1\u0323\1\u02b5\1\u0324\1\77"+ + "\2\u02b5\1\77\3\u02b5\1\77\5\u02b5\3\77\23\u02b5\22\77"+ + "\7\u02b5\1\77\12\u02b5\2\77\2\u02b7\2\77\1\u02b7\1\226"+ + "\1\77\2\u02b7\1\77\3\u02b7\1\77\5\u02b7\3\77\23\u02b7"+ + "\22\77\7\u02b7\1\77\12\u02b7\2\77\2\u02b7\1\77\1\u0325"+ + "\1\u02b7\1\u0326\1\77\2\u02b7\1\77\3\u02b7\1\77\5\u02b7"+ + "\3\77\23\u02b7\22\77\7\u02b7\1\77\12\u02b7\7\77\1\226"+ + "\66\77\1\u0327\1\u0328\24\77\1\u0329\1\u032a\1\226\1\77"+ + "\2\u032a\1\77\3\u032a\1\77\5\u032a\3\77\23\u032a\22\77"+ + "\1\u032a\2\77\4\u032a\1\77\12\u032a\2\77\2\u023e\1\u02b9"+ + "\1\77\1\u023e\1\226\1\77\2\u023e\1\77\3\u023e\1\77"+ + "\5\u023e\3\77\23\u023e\22\77\7\u023e\1\77\12\u023e\2\77"+ + "\2\u02bc\2\77\1\u02bc\1\226\1\77\2\u02bc\1\77\3\u02bc"+ + "\1\77\5\u02bc\3\77\23\u02bc\22\77\7\u02bc\1\77\12\u02bc"+ + "\2\77\2\u02bc\1\77\1\u032b\1\u02bc\1\226\1\77\2\u02bc"+ + "\1\77\3\u02bc\1\77\5\u02bc\1\u032c\2\77\23\u02bc\22\77"+ + "\7\u02bc\1\77\12\u02bc\7\77\1\226\30\77\1\u032d\1\77"+ + "\1\u032e\63\77\1\226\2\77\1\u032f\21\77\1\u0330\71\77"+ + "\1\226\24\77\1\u0331\71\77\1\226\20\77\1\u0332\13\77"+ + "\1\u0333\61\77\1\226\36\77\1\u0334\57\77\1\226\40\77"+ + "\1\u0335\55\77\1\226\33\77\1\u0336\60\77\1\u0337\1\77"+ + "\1\226\37\77\1\u0338\51\77\2\u02c6\2\77\1\u02c6\1\226"+ + "\1\77\2\u02c6\1\77\3\u02c6\1\77\5\u02c6\3\77\23\u02c6"+ + "\22\77\7\u02c6\1\77\12\u02c6\2\77\2\u02c6\1\77\1\u0339"+ + "\1\u02c6\1\u033a\1\77\2\u02c6\1\77\3\u02c6\1\77\5\u02c6"+ + "\3\77\23\u02c6\22\77\7\u02c6\1\77\12\u02c6\7\77\1\u033b"+ + "\111\77\2\u02c9\2\77\1\u02c9\1\226\1\77\2\u02c9\1\77"+ + "\3\u02c9\1\77\5\u02c9\3\77\23\u02c9\22\77\7\u02c9\1\77"+ + "\12\u02c9\2\77\2\u02c9\1\u033c\1\u033d\1\u02c9\1\226\1\77"+ + "\2\u02c9\1\77\3\u02c9\1\77\5\u02c9\3\77\23\u02c9\22\77"+ + "\7\u02c9\1\77\12\u02c9\7\77\1\226\2\77\1\u033e\113\77"+ + "\1\226\21\77\1\u033f\74\77\1\u0340\116\77\1\226\20\77"+ + "\1\u0341\75\77\1\226\30\77\1\u0342\65\77\1\226\2\77"+ + "\1\u0343\113\77\1\226\36\77\1\u0344\57\77\1\226\36\77"+ + "\1\u0345\57\77\1\226\21\77\1\u0346\74\77\1\u0347\116\77"+ + "\1\226\2\77\1\u0348\111\77\1\u0349\1\77\1\226\114\77"+ + "\1\u034a\1\77\1\u034b\116\77\1\226\32\77\1\u034c\63\77"+ + "\1\226\75\77\1\u034d\20\77\1\226\36\77\1\u034e\57\77"+ + "\1\226\21\77\1\u034f\74\77\1\226\36\77\1\u0350\57\77"+ + "\1\226\21\77\1\u0351\74\77\1\226\41\77\1\u0352\54\77"+ + "\1\226\24\77\1\u0353\71\77\1\226\20\77\1\u0354\75\77"+ + "\1\226\22\77\1\u0355\73\77\1\226\20\77\1\u0356\75\77"+ + "\1\226\36\77\1\u0357\57\77\1\226\13\77\1\u0358\61\77"+ + "\1\u0359\7\77\1\u035a\10\77\1\226\30\77\1\u035b\65\77"+ + "\1\226\21\77\1\u035c\74\77\1\226\24\77\1\u035d\71\77"+ + "\1\226\31\77\1\u035e\55\77\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\4\12\1\u035f\16\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\14\12\1\u0360\6\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\3\12\1\0\5\12\3\0\1\12\1\u0361"+ + "\21\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\16\12\1\u0362\4\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\1\12\1\u0363\1\12\1\0\5\12\3\0\23\12\22\0"+ + "\7\12\1\0\12\12\2\0\2\12\1\75\1\76\1\12"+ + "\2\0\1\12\1\u0364\1\0\3\12\1\0\5\12\3\0"+ + "\23\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\1\12\1\u0365\21\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\3\12\1\0\5\12\3\0\1\12\1\u0366\21\12\22\0"+ + "\7\12\1\0\12\12\2\0\2\12\1\75\1\76\1\12"+ + "\2\0\2\12\1\0\3\12\1\0\5\12\3\0\20\12"+ + "\1\u0367\2\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\3\12\1\0"+ + "\5\12\3\0\14\12\1\u0368\6\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\20\12\1\u0369\2\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\1\12\1\u036a\1\0\3\12\1\0\5\12"+ + "\3\0\23\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\1\12\1\u036b\1\0\3\12"+ + "\1\0\5\12\3\0\23\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\3\12\1\0\5\12\3\0\1\12\1\u036c\14\12\1\u036d"+ + "\4\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\1\u036e\22\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\16\12\1\u036f\4\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\3\12\1\0\5\12\3\0\4\12\1\u0370"+ + "\16\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\14\12\1\u0371\6\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\3\12\1\0\5\12\3\0\3\12\1\u0372\17\12\22\0"+ + "\7\12\1\0\12\12\2\0\2\12\1\75\1\76\1\12"+ + "\2\0\2\12\1\0\3\12\1\0\5\12\3\0\17\12"+ + "\1\u0373\3\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\3\12\1\0"+ + "\5\12\3\0\21\12\1\u0374\1\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\4\12\1\u0375\16\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\1\12\1\u0376\1\12\1\0"+ + "\5\12\3\0\23\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\16\12\1\u0377\4\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\3\12\1\0\5\12\3\0\1\12\1\u0378"+ + "\21\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\1\12\1\u0379\21\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\3\12\1\0\5\12\3\0\10\12\1\u037a\12\12\22\0"+ + "\7\12\1\0\12\12\2\0\2\12\1\75\1\76\1\12"+ + "\2\0\2\12\1\0\3\12\1\0\5\12\3\0\4\12"+ + "\1\u037b\16\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\3\12\1\0"+ + "\5\12\3\0\12\12\1\u037c\10\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\10\12\1\u037d\12\12"+ + "\22\0\7\12\1\0\12\12\7\77\1\226\21\77\1\u037e"+ + "\74\77\1\u037f\111\77\2\u02b5\2\77\1\u02b5\1\u0324\1\77"+ + "\2\u02b5\1\77\3\u02b5\1\77\5\u02b5\3\77\23\u02b5\22\77"+ + "\7\u02b5\1\77\12\u02b5\2\77\2\u02b7\2\77\1\u02b7\1\u0326"+ + "\1\77\2\u02b7\1\77\3\u02b7\1\77\5\u02b7\3\77\23\u02b7"+ + "\22\77\7\u02b7\1\77\12\u02b7\7\77\1\u0380\116\77\1\u0381"+ + "\111\77\2\u032a\2\77\1\u032a\1\226\1\77\2\u032a\1\77"+ + "\3\u032a\1\77\5\u032a\3\77\23\u032a\22\77\7\u032a\1\77"+ + "\12\u032a\2\77\2\u032a\1\77\1\u0382\1\u032a\1\226\1\77"+ + "\2\u032a\1\77\3\u032a\1\77\5\u032a\1\77\2\u0383\23\u032a"+ + "\22\77\7\u032a\1\77\12\u032a\2\77\2\u02bc\2\77\1\u02bc"+ + "\1\226\1\77\2\u02bc\1\77\3\u02bc\1\77\5\u02bc\1\u032c"+ + "\2\77\23\u02bc\22\77\7\u02bc\1\77\12\u02bc\5\77\1\u0384"+ + "\1\u0385\1\226\1\77\2\u0385\1\77\3\u0385\1\77\5\u0385"+ + "\3\77\23\u0385\22\77\1\u0385\2\77\4\u0385\1\77\12\u0385"+ + "\7\77\1\226\24\77\1\u0386\4\77\1\u0387\64\77\1\226"+ + "\33\77\1\u0388\57\77\1\u0389\2\77\1\226\116\77\1\226"+ + "\1\77\1\u038a\114\77\1\226\1\77\1\u038b\114\77\1\226"+ + "\36\77\1\u038c\57\77\1\226\36\77\1\u038d\57\77\1\226"+ + "\20\77\1\u038e\10\77\1\u038f\4\77\1\u0390\57\77\1\226"+ + "\24\77\1\u0391\71\77\1\226\21\77\1\u0392\74\77\1\226"+ + "\30\77\1\u0393\65\77\1\226\30\77\1\u0394\60\77\2\u02c6"+ + "\2\77\1\u02c6\1\u033a\1\77\2\u02c6\1\77\3\u02c6\1\77"+ + "\5\u02c6\3\77\23\u02c6\22\77\7\u02c6\1\77\12\u02c6\5\77"+ + "\1\u0395\1\u0396\1\226\1\77\2\u0396\1\77\3\u0396\1\77"+ + "\5\u0396\3\77\23\u0396\22\77\1\u0396\2\77\4\u0396\1\77"+ + "\12\u0396\2\77\2\u02c9\1\u033c\1\77\1\u02c9\1\226\1\77"+ + "\2\u02c9\1\77\3\u02c9\1\77\5\u02c9\3\77\23\u02c9\22\77"+ + "\7\u02c9\1\77\12\u02c9\7\77\1\u0397\116\77\1\226\32\77"+ + "\1\u0398\63\77\1\226\2\77\1\u0399\113\77\1\226\1\77"+ + "\1\u039a\114\77\1\226\36\77\1\u039b\57\77\1\226\5\77"+ + "\1\u039c\110\77\1\u039d\116\77\1\226\65\77\1\u039e\30\77"+ + "\1\u039f\116\77\1\226\31\77\1\u03a0\64\77\1\226\75\77"+ + "\1\u03a1\16\77\1\u03a2\1\77\1\u03a3\116\77\1\226\36\77"+ + "\1\u03a4\57\77\1\226\70\77\1\u03a5\25\77\1\226\30\77"+ + "\1\u03a6\65\77\1\226\70\77\1\u03a7\25\77\1\226\32\77"+ + "\1\u03a8\63\77\1\226\36\77\1\u03a9\57\77\1\226\30\77"+ + "\1\u03aa\65\77\1\226\30\77\1\u03ab\65\77\1\226\24\77"+ + "\1\u03ac\71\77\1\226\20\77\1\u03ad\75\77\1\226\5\77"+ + "\1\u03ae\110\77\1\226\36\77\1\u03af\57\77\1\226\36\77"+ + "\1\u03b0\57\77\1\226\42\77\1\u03b1\53\77\1\226\5\77"+ + "\1\u03b2\110\77\1\226\2\77\1\u03b3\113\77\1\226\37\77"+ + "\1\u03b4\56\77\1\226\10\77\1\u03b5\2\77\1\u03b6\55\77"+ + "\1\u03b7\3\77\1\u03b8\2\77\1\u03b9\1\u03ba\1\77\1\u03bb"+ + "\1\u03bc\1\u03bd\1\77\2\0\2\12\1\75\1\76\1\12"+ + "\2\0\2\12\1\0\3\12\1\0\5\12\3\0\14\12"+ + "\1\u03be\6\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\3\12\1\0"+ + "\5\12\3\0\16\12\1\u03bf\4\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\12\12\1\u03c0\10\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\1\u03c1\1\12\1\0\3\12\1\0\5\12"+ + "\3\0\23\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\3\12\1\0"+ + "\5\12\3\0\23\12\22\0\1\u03c2\6\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\3\12\1\0\5\12\3\0\12\12\1\u03c3\10\12\22\0"+ + "\7\12\1\0\12\12\2\0\2\12\1\75\1\76\1\12"+ + "\2\0\2\12\1\0\3\12\1\0\5\12\3\0\10\12"+ + "\1\u03c4\12\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\3\12\1\0"+ + "\5\12\3\0\16\12\1\u03c5\4\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\16\12\1\u03c6\4\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\16\12\1\u03c7\4\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\12\12\1\u03c8\10\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\3\12\1\0\5\12\3\0\1\u03c9\22\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\2\12\1\u03ca\20\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\16\12\1\u03cb\4\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\3\12\1\0\5\12\3\0\16\12\1\u03cc"+ + "\4\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\16\12\1\u03cd\4\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\3\12\1\0\5\12\3\0\14\12\1\u03ce\6\12\22\0"+ + "\7\12\1\0\12\12\2\0\2\12\1\75\1\76\1\12"+ + "\2\0\1\u03cf\1\12\1\0\3\12\1\0\5\12\3\0"+ + "\23\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\4\12\1\u03d0\16\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\3\12\1\0\5\12\3\0\12\12\1\u03d1\10\12\22\0"+ + "\7\12\1\0\12\12\2\0\2\12\1\75\1\76\1\12"+ + "\2\0\1\12\1\u03d2\1\0\3\12\1\0\5\12\3\0"+ + "\23\12\22\0\7\12\1\0\12\12\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\4\12\1\u03d3\16\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\1\12\1\u03d4"+ + "\1\0\3\12\1\0\5\12\3\0\23\12\22\0\7\12"+ + "\1\0\12\12\7\77\1\226\20\77\1\u03d5\70\77\2\u032a"+ + "\2\77\1\u032a\1\226\1\77\2\u032a\1\77\3\u032a\1\77"+ + "\5\u032a\1\77\2\u0383\23\u032a\22\77\7\u032a\1\77\12\u032a"+ + "\5\77\1\u03d6\1\u03d7\1\226\1\77\2\u03d7\1\77\3\u03d7"+ + "\1\77\5\u03d7\3\77\23\u03d7\22\77\1\u03d7\2\77\4\u03d7"+ + "\1\77\12\u03d7\2\77\2\u0385\2\77\1\u0385\1\226\1\77"+ + "\2\u0385\1\77\3\u0385\1\77\5\u0385\3\77\23\u0385\22\77"+ + "\7\u0385\1\77\12\u0385\2\77\2\u0385\1\77\1\u03d8\1\u0385"+ + "\1\u03d9\1\77\2\u0385\1\77\3\u0385\1\77\5\u0385\3\77"+ + "\23\u0385\22\77\7\u0385\1\77\12\u0385\7\77\1\226\1\77"+ + "\1\u03da\114\77\1\226\2\77\1\u03db\113\77\1\u03dc\114\77"+ + "\1\u03dd\1\u03de\1\226\1\77\2\u03de\1\77\3\u03de\1\77"+ + "\5\u03de\3\77\23\u03de\22\77\1\u03de\2\77\4\u03de\1\77"+ + "\12\u03de\4\77\1\u03df\2\77\1\226\116\77\1\226\32\77"+ + "\1\u03e0\63\77\1\226\2\77\1\u03e1\113\77\1\226\21\77"+ + "\1\u03e2\74\77\1\226\36\77\1\u03e3\57\77\1\226\36\77"+ + "\1\u03e4\57\77\1\226\42\77\1\u03e5\53\77\1\226\2\77"+ + "\1\u03e6\113\77\1\226\31\77\1\u03e7\64\77\1\226\34\77"+ + "\1\u03e8\61\77\1\226\34\77\1\u03e9\54\77\2\u0396\2\77"+ + "\1\u0396\1\226\1\77\2\u0396\1\77\3\u0396\1\77\5\u0396"+ + "\3\77\23\u0396\22\77\7\u0396\1\77\12\u0396\2\77\2\u0396"+ + "\1\77\1\u03ea\1\u0396\1\u03eb\1\77\2\u0396\1\77\3\u0396"+ + "\1\77\5\u0396\3\77\23\u0396\22\77\7\u0396\1\77\12\u0396"+ + "\7\77\1\226\24\77\1\u03ec\71\77\1\u03ed\116\77\1\u03ee"+ + "\116\77\1\u03ef\116\77\1\u03f0\116\77\1\226\36\77\1\u03f1"+ + "\57\77\1\226\30\77\1\u03f2\65\77\1\226\36\77\1\u03f3"+ + "\57\77\1\226\75\77\1\u03f4\20\77\1\226\5\77\1\u03f5"+ + "\110\77\1\226\40\77\1\u03f6\55\77\1\226\2\77\1\u03f7"+ + "\113\77\1\226\40\77\1\u03f8\55\77\1\226\24\77\1\u03f9"+ + "\71\77\1\226\75\77\1\u03fa\4\77\1\u03fb\13\77\1\226"+ + "\5\77\1\u03fc\110\77\1\226\22\77\1\u03fd\73\77\1\226"+ + "\30\77\1\u03fe\65\77\1\226\30\77\1\u03ff\65\77\1\u0400"+ + "\116\77\1\226\2\77\1\u0401\113\77\1\226\20\77\1\u0402"+ + "\75\77\1\226\33\77\1\u0403\62\77\1\226\75\77\1\u0404"+ + "\20\77\1\226\21\77\1\u0405\74\77\1\226\36\77\1\u0406"+ + "\57\77\1\226\5\77\1\u0407\110\77\1\226\2\77\1\u0408"+ + "\33\77\1\u0409\57\77\1\226\30\77\1\u040a\65\77\1\226"+ + "\30\77\1\u040b\5\77\1\u040c\57\77\1\226\30\77\1\u040d"+ + "\1\77\1\u040e\63\77\1\226\21\77\1\u040f\7\77\1\u0410"+ + "\64\77\1\226\32\77\1\u0411\63\77\1\226\31\77\1\u0412"+ + "\64\77\1\226\42\77\1\u0413\44\77\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\3\12\1\u0414\17\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\3\12\1\0\5\12\3\0\4\12\1\u0415\16\12\22\0"+ + "\7\12\1\0\12\12\2\0\2\12\1\75\1\76\1\12"+ + "\2\0\2\12\1\0\3\12\1\0\5\12\3\0\16\12"+ + "\1\u0416\4\12\22\0\7\12\1\0\12\12\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\3\12\1\0"+ + "\5\12\3\0\16\12\1\u0417\4\12\22\0\7\12\1\0"+ + "\12\12\2\0\2\12\1\75\1\76\1\12\2\0\2\12"+ + "\1\0\3\12\1\0\5\12\3\0\4\12\1\u0418\16\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\1\12\1\u0419\1\12\1\0"+ + "\5\12\3\0\23\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\4\12\1\u041a\16\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\2\12\1\0\3\12\1\0\5\12\3\0\1\u041b\22\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\4\12\1\u041c\16\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\16\12\1\u041d\4\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\1\12\1\u041e\1\0\3\12\1\0\5\12\3\0\23\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\4\12\1\u041f\16\12\22\0\7\12\1\0\12\12\2\0"+ + "\2\12\1\75\1\76\1\12\2\0\2\12\1\0\3\12"+ + "\1\0\5\12\3\0\1\12\1\u0420\21\12\22\0\7\12"+ + "\1\0\12\12\7\77\1\226\2\77\1\u0421\106\77\2\u03d7"+ + "\2\77\1\u03d7\1\226\1\77\2\u03d7\1\77\3\u03d7\1\77"+ + "\5\u03d7\3\77\23\u03d7\22\77\7\u03d7\1\77\12\u03d7\2\77"+ + "\2\u03d7\1\u0422\1\u0423\1\u03d7\1\226\1\77\2\u03d7\1\77"+ + "\3\u03d7\1\77\5\u03d7\3\77\23\u03d7\22\77\7\u03d7\1\77"+ + "\12\u03d7\2\77\2\u0385\2\77\1\u0385\1\u03d9\1\77\2\u0385"+ + "\1\77\3\u0385\1\77\5\u0385\3\77\23\u0385\22\77\7\u0385"+ + "\1\77\12\u0385\7\77\1\226\30\77\1\u0424\65\77\1\u0425"+ + "\111\77\2\u03de\2\77\1\u03de\1\226\1\77\2\u03de\1\77"+ + "\3\u03de\1\77\5\u03de\3\77\23\u03de\22\77\7\u03de\1\77"+ + "\12\u03de\2\77\2\u03de\1\u0426\1\u0427\1\u03de\1\226\1\77"+ + "\2\u03de\1\77\3\u03de\1\77\5\u03de\3\77\23\u03de\22\77"+ + "\7\u03de\1\77\12\u03de\5\77\1\u0428\1\u0429\1\226\1\77"+ + "\2\u0429\1\77\3\u0429\1\77\5\u0429\3\77\23\u0429\22\77"+ + "\1\u0429\2\77\4\u0429\1\77\12\u0429\7\77\1\226\37\77"+ + "\1\u042a\53\77\1\u042b\2\77\1\226\116\77\1\226\41\77"+ + "\1\u042c\54\77\1\226\2\77\1\u042d\21\77\1\u042e\71\77"+ + "\1\226\20\77\1\u042f\13\77\1\u0430\61\77\1\226\33\77"+ + "\1\u0431\57\77\1\u0432\2\77\1\226\116\77\1\226\36\77"+ + "\1\u0433\57\77\1\226\2\77\1\u0434\113\77\1\226\35\77"+ + "\1\u0435\53\77\2\u0396\2\77\1\u0396\1\u03eb\1\77\2\u0396"+ + "\1\77\3\u0396\1\77\5\u0396\3\77\23\u0396\22\77\7\u0396"+ + "\1\77\12\u0396\7\77\1\u0436\116\77\1\u0437\116\77\1\226"+ + "\24\77\1\u0438\71\77\1\226\5\77\1\u0439\110\77\1\226"+ + "\36\77\1\u043a\57\77\1\u043b\116\77\1\226\36\77\1\u043c"+ + "\57\77\1\226\36\77\1\u043d\57\77\1\226\36\77\1\u043e"+ + "\57\77\1\u043f\116\77\1\226\36\77\1\u0440\57\77\1\226"+ + "\34\77\1\u0441\61\77\1\226\10\77\1\u0442\105\77\1\226"+ + "\36\77\1\u0443\57\77\1\226\5\77\1\u0444\110\77\1\226"+ + "\22\77\1\u0445\73\77\1\226\26\77\1\u0446\67\77\1\226"+ + "\36\77\1\u0447\57\77\1\226\21\77\1\u0448\74\77\1\226"+ + "\36\77\1\u0449\57\77\1\226\32\77\1\u044a\63\77\1\226"+ + "\24\77\1\u044b\71\77\1\226\32\77\1\u044c\63\77\1\226"+ + "\30\77\1\u044d\1\77\1\u044e\63\77\1\226\2\77\1\u044f"+ + "\21\77\1\u0450\71\77\1\226\2\77\1\u0451\113\77\1\226"+ + "\24\77\1\u0452\71\77\1\226\20\77\1\u0453\13\77\1\u0454"+ + "\61\77\1\226\5\77\1\u0455\110\77\1\226\40\77\1\u0456"+ + "\55\77\1\226\37\77\1\u0457\56\77\1\226\30\77\1\u0458"+ + "\65\77\1\226\21\77\1\u0459\74\77\1\226\36\77\1\u045a"+ + "\57\77\1\226\33\77\1\u045b\53\77\2\0\2\12\1\75"+ + "\1\76\1\12\2\0\2\12\1\0\3\12\1\0\5\12"+ + "\3\0\11\12\1\u045c\11\12\22\0\7\12\1\0\12\12"+ + "\2\0\2\12\1\75\1\76\1\12\2\0\2\12\1\0"+ + "\3\12\1\0\5\12\3\0\1\u045d\22\12\22\0\7\12"+ + "\1\0\12\12\2\0\2\12\1\75\1\76\1\12\2\0"+ + "\1\12\1\u045e\1\0\3\12\1\0\5\12\3\0\23\12"+ + "\22\0\7\12\1\0\12\12\2\0\2\12\1\75\1\76"+ + "\1\12\2\0\2\12\1\0\3\12\1\0\5\12\3\0"+ + "\12\12\1\u045f\10\12\22\0\7\12\1\0\12\12\7\77"+ + "\1\226\31\77\1\u0460\62\77\1\u0461\1\u0462\1\226\1\77"+ + "\2\u0462\1\77\3\u0462\1\77\5\u0462\3\77\23\u0462\22\77"+ + "\1\u0462\2\77\4\u0462\1\77\12\u0462\2\77\2\u03d7\1\u0422"+ + "\1\77\1\u03d7\1\226\1\77\2\u03d7\1\77\3\u03d7\1\77"+ + "\5\u03d7\3\77\23\u03d7\22\77\7\u03d7\1\77\12\u03d7\7\77"+ + "\1\226\31\77\1\u0463\57\77\1\u0464\1\u0465\3\77\1\226"+ + "\66\77\2\u0465\21\77\2\u03de\1\u0426\1\77\1\u03de\1\226"+ + "\1\77\2\u03de\1\77\3\u03de\1\77\5\u03de\3\77\23\u03de"+ + "\22\77\7\u03de\1\77\12\u03de\2\77\2\u0429\2\77\1\u0429"+ + "\1\226\1\77\2\u0429\1\77\3\u0429\1\77\5\u0429\3\77"+ + "\23\u0429\22\77\7\u0429\1\77\12\u0429\2\77\2\u0429\1\u0466"+ + "\1\u0467\1\u0429\1\226\1\77\2\u0429\1\77\3\u0429\1\77"+ + "\5\u0429\3\77\23\u0429\22\77\7\u0429\1\77\12\u0429\4\77"+ + "\1\u0468\2\77\1\226\114\77\1\u0469\1\u046a\1\226\1\77"+ + "\2\u046a\1\77\3\u046a\1\77\5\u046a\3\77\23\u046a\22\77"+ + "\1\u046a\2\77\4\u046a\1\77\12\u046a\7\77\1\226\36\77"+ + "\1\u046b\54\77\1\u046c\2\77\1\226\116\77\1\226\1\77"+ + "\1\u046d\114\77\1\226\36\77\1\u046e\57\77\1\226\36\77"+ + "\1\u046f\57\77\1\226\21\77\1\u0470\72\77\1\u0471\1\u0472"+ + "\1\226\1\77\2\u0472\1\77\3\u0472\1\77\5\u0472\3\77"+ + "\23\u0472\22\77\1\u0472\2\77\4\u0472\1\77\12\u0472\4\77"+ + "\1\u0473\2\77\1\226\116\77\1\226\21\77\1\u0474\74\77"+ + "\1\226\21\77\1\u0475\74\77\1\226\1\77\1\u0476\114\77"+ + "\1\u0477\116\77\1\226\5\77\1\u0478\110\77\1\226\20\77"+ + "\1\u0479\73\77\1\u047a\1\77\1\226\116\77\1\226\20\77"+ + "\1\u047b\75\77\1\226\70\77\1\u047c\25\77\1\226\2\77"+ + "\1\u047d\113\77\1\226\21\77\1\u047e\74\77\1\u047f\116\77"+ + "\1\226\10\77\1\u0480\105\77\1\226\36\77\1\u0481\57\77"+ + "\1\226\20\77\1\u0482\75\77\1\226\2\77\1\u0483\113\77"+ + "\1\226\31\77\1\u0484\64\77\1\226\70\77\1\u0485\25\77"+ + "\1\226\24\77\1\u0486\71\77\1\226\2\77\1\u0487\113\77"+ + "\1\226\34\77\1\u0488\61\77\1\226\2\77\1\u0489\21\77"+ + "\1\u048a\4\77\1\u048b\64\77\1\226\33\77\1\u048c\62\77"+ + "\1\226\101\77\1\u048d\14\77\1\226\1\77\1\u048e\114\77"+ + "\1\226\30\77\1\u048f\65\77\1\226\1\77\1\u0490\114\77"+ + "\1\226\36\77\1\u0491\57\77\1\226\36\77\1\u0492\57\77"+ + "\1\226\34\77\1\u0493\61\77\1\226\24\77\1\u0494\71\77"+ + "\1\226\36\77\1\u0495\57\77\1\226\24\77\1\u0496\71\77"+ + "\1\226\1\77\1\u0497\114\77\1\226\13\77\1\u0498\61\77"+ + "\1\u0499\20\77\1\226\21\77\1\u049a\65\77\2\0\2\12"+ + "\1\75\1\76\1\12\2\0\2\12\1\0\3\12\1\0"+ + "\5\12\3\0\4\12\1\u049b\16\12\22\0\7\12\1\0"+ + "\12\12\7\77\1\226\21\77\1\u049c\67\77\2\u0462\2\77"+ + "\1\u0462\1\226\1\77\2\u0462\1\77\3\u0462\1\77\5\u0462"+ + "\3\77\23\u0462\22\77\7\u0462\1\77\12\u0462\2\77\2\u0462"+ + "\1\77\1\u049d\1\u0462\1\u049e\1\77\2\u0462\1\77\3\u0462"+ + "\1\77\5\u0462\3\77\23\u0462\22\77\7\u0462\1\77\12\u0462"+ + "\7\77\1\226\1\77\1\u049f\114\77\1\u04a0\111\77\2\u0465"+ + "\3\77\1\u04a0\66\77\2\u0465\21\77\1\u04a1\1\u04a2\3\77"+ + "\1\226\66\77\2\u04a2\21\77\2\u0429\1\u0466\1\77\1\u0429"+ + "\1\226\1\77\2\u0429\1\77\3\u0429\1\77\5\u0429\3\77"+ + "\23\u0429\22\77\7\u0429\1\77\12\u0429\2\77\1\u04a3\1\u04a4"+ + "\3\77\1\226\66\77\2\u04a4\21\77\2\u046a\2\77\1\u046a"+ + "\1\226\1\77\2\u046a\1\77\3\u046a\1\77\5\u046a\3\77"+ + "\23\u046a\22\77\7\u046a\1\77\12\u046a\2\77\2\u046a\1\u04a5"+ + "\1\u04a6\1\u046a\1\226\1\77\2\u046a\1\77\3\u046a\1\77"+ + "\5\u046a\3\77\23\u046a\22\77\7\u046a\1\77\12\u046a\4\77"+ + "\1\u04a7\2\77\1\226\114\77\1\u04a8\1\u04a9\1\226\1\77"+ + "\2\u04a9\1\77\3\u04a9\1\77\5\u04a9\3\77\23\u04a9\22\77"+ + "\1\u04a9\2\77\4\u04a9\1\77\12\u04a9\4\77\1\u04aa\2\77"+ + "\1\226\116\77\1\226\2\77\1\u04ab\113\77\1\226\21\77"+ + "\1\u04ac\74\77\1\226\31\77\1\u04ad\57\77\2\u0472\2\77"+ + "\1\u0472\1\226\1\77\2\u0472\1\77\3\u0472\1\77\5\u0472"+ + "\3\77\23\u0472\22\77\7\u0472\1\77\12\u0472\2\77\2\u0472"+ + "\1\u04ae\1\u04af\1\u0472\1\226\1\77\2\u0472\1\77\3\u0472"+ + "\1\77\5\u0472\3\77\23\u0472\22\77\7\u0472\1\77\12\u0472"+ + "\5\77\1\u04b0\1\u04b1\1\226\1\77\2\u04b1\1\77\3\u04b1"+ + "\1\77\5\u04b1\3\77\23\u04b1\22\77\1\u04b1\2\77\4\u04b1"+ + "\1\77\12\u04b1\7\77\1\226\32\77\1\u04b2\63\77\1\226"+ + "\24\77\1\u04b3\71\77\1\226\32\77\1\u04b4\63\77\1\u04b5"+ + "\116\77\1\226\2\77\1\u04b6\113\77\1\226\31\77\1\u04b7"+ + "\64\77\1\226\2\77\1\u04b8\113\77\1\226\40\77\1\u04b9"+ + "\55\77\1\226\21\77\1\u04ba\74\77\1\226\24\77\1\u04bb"+ + "\71\77\1\226\21\77\1\u04bc\74\77\1\u04bd\116\77\1\226"+ + "\22\77\1\u04be\73\77\1\226\26\77\1\u04bf\67\77\1\226"+ + "\36\77\1\u04c0\57\77\1\226\40\77\1\u04c1\55\77\1\226"+ + "\102\77\1\u04c2\13\77\1\u04c3\116\77\1\226\6\77\1\u04c4"+ + "\107\77\1\226\36\77\1\u04c5\57\77\1\226\1\77\1\u04c6"+ + "\114\77\1\226\2\77\1\u04c7\113\77\1\226\13\77\1\u04c8"+ + "\102\77\1\226\21\77\1\u04c9\74\77\1\226\13\77\1\u04ca"+ + "\102\77\1\226\101\77\1\u04cb\14\77\1\226\32\77\1\u04cc"+ + "\63\77\1\226\2\77\1\u04cd\113\77\1\226\21\77\1\u04ce"+ + "\74\77\1\226\26\77\1\u04cf\67\77\1\226\2\77\1\u04d0"+ + "\113\77\1\226\31\77\1\u04d1\64\77\1\226\20\77\1\u04d2"+ + "\75\77\1\226\26\77\1\u04d3\67\77\1\226\36\77\1\u04d4"+ + "\57\77\1\226\36\77\1\u04d5\57\77\1\226\31\77\1\u04d6"+ + "\64\77\1\226\4\77\1\u04d7\104\77\2\u0462\2\77\1\u0462"+ + "\1\u049e\1\77\2\u0462\1\77\3\u0462\1\77\5\u0462\3\77"+ + "\23\u0462\22\77\7\u0462\1\77\12\u0462\4\77\1\u04d8\2\77"+ + "\1\226\116\77\1\u04d9\111\77\2\u04a2\3\77\1\u04d9\66\77"+ + "\2\u04a2\26\77\1\u04da\111\77\2\u04a4\3\77\1\u04da\66\77"+ + "\2\u04a4\21\77\1\u04db\1\u04dc\3\77\1\226\66\77\2\u04dc"+ + "\21\77\2\u046a\1\u04a5\1\77\1\u046a\1\226\1\77\2\u046a"+ + "\1\77\3\u046a\1\77\5\u046a\3\77\23\u046a\22\77\7\u046a"+ + "\1\77\12\u046a\5\77\1\u04dd\1\u04de\1\226\1\77\2\u04de"+ + "\1\77\3\u04de\1\77\5\u04de\3\77\23\u04de\22\77\1\u04de"+ + "\2\77\4\u04de\1\77\12\u04de\2\77\2\u04a9\2\77\1\u04a9"+ + "\1\226\1\77\2\u04a9\1\77\3\u04a9\1\77\5\u04a9\3\77"+ + "\23\u04a9\22\77\7\u04a9\1\77\12\u04a9\2\77\2\u04a9\1\u04df"+ + "\1\u04e0\1\u04a9\1\226\1\77\2\u04a9\1\77\3\u04a9\1\77"+ + "\5\u04a9\3\77\23\u04a9\22\77\7\u04a9\1\77\12\u04a9\5\77"+ + "\1\u04e1\1\u04e2\1\226\1\77\2\u04e2\1\77\3\u04e2\1\77"+ + "\5\u04e2\3\77\23\u04e2\22\77\1\u04e2\2\77\4\u04e2\1\77"+ + "\12\u04e2\4\77\1\u04e3\2\77\1\226\116\77\1\226\41\77"+ + "\1\u04e4\54\77\1\226\36\77\1\u04e5\52\77\1\u04e6\1\u04e7"+ + "\3\77\1\226\66\77\2\u04e7\21\77\2\u0472\1\u04ae\1\77"+ + "\1\u0472\1\226\1\77\2\u0472\1\77\3\u0472\1\77\5\u0472"+ + "\3\77\23\u0472\22\77\7\u0472\1\77\12\u0472\2\77\2\u04b1"+ + "\2\77\1\u04b1\1\226\1\77\2\u04b1\1\77\3\u04b1\1\77"+ + "\5\u04b1\3\77\23\u04b1\22\77\7\u04b1\1\77\12\u04b1\2\77"+ + "\2\u04b1\1\u04e8\1\u04e9\1\u04b1\1\226\1\77\2\u04b1\1\77"+ + "\3\u04b1\1\77\5\u04b1\3\77\23\u04b1\22\77\7\u04b1\1\77"+ + "\12\u04b1\7\77\1\226\24\77\1\u04ea\71\77\1\226\36\77"+ + "\1\u04eb\57\77\1\226\37\77\1\u04ec\56\77\1\u04ed\116\77"+ + "\1\226\36\77\1\u04ee\57\77\1\u04ef\116\77\1\226\36\77"+ + "\1\u04f0\57\77\1\226\32\77\1\u04f1\63\77\1\226\1\77"+ + "\1\u04f2\114\77\1\226\24\77\1\u04f3\71\77\1\u04f4\116\77"+ + "\1\226\20\77\1\u04f5\75\77\1\226\26\77\1\u04f6\67\77"+ + "\1\226\36\77\1\u04f7\57\77\1\226\34\77\1\u04f8\61\77"+ + "\1\u04f9\116\77\1\226\26\77\1\u04fa\67\77\1\226\30\77"+ + "\1\u04fb\65\77\1\226\13\77\1\u04fc\102\77\1\226\2\77"+ + "\1\u04fd\113\77\1\226\37\77\1\u04fe\56\77\1\226\2\77"+ + "\1\u04ff\113\77\1\226\23\77\1\u0500\72\77\1\226\37\77"+ + "\1\u0501\56\77\1\226\101\77\1\u0502\14\77\1\226\41\77"+ + "\1\u0503\54\77\1\226\36\77\1\u0504\57\77\1\226\13\77"+ + "\1\u0505\102\77\1\u0506\116\77\1\226\21\77\1\u0507\74\77"+ + "\1\226\36\77\1\u0508\57\77\1\226\24\77\1\u0509\71\77"+ + "\1\226\34\77\1\u050a\61\77\1\226\36\77\1\u050b\57\77"+ + "\1\226\40\77\1\u050c\53\77\1\u050d\1\u050e\1\226\1\77"+ + "\2\u050e\1\77\3\u050e\1\77\5\u050e\3\77\14\u050e\1\u050f"+ + "\6\u050e\22\77\1\u050e\2\77\4\u050e\1\77\12\u050e\7\77"+ + "\1\u0510\111\77\2\u04dc\3\77\1\u0510\66\77\2\u04dc\21\77"+ + "\2\u04de\2\77\1\u04de\1\226\1\77\2\u04de\1\77\3\u04de"+ + "\1\77\5\u04de\3\77\23\u04de\22\77\7\u04de\1\77\12\u04de"+ + "\2\77\2\u04de\1\u0511\1\u0512\1\u04de\1\226\1\77\2\u04de"+ + "\1\77\3\u04de\1\77\5\u04de\3\77\23\u04de\22\77\7\u04de"+ + "\1\77\12\u04de\2\77\1\u0513\1\u0514\3\77\1\226\66\77"+ + "\2\u0514\21\77\2\u04a9\1\u04df\1\77\1\u04a9\1\226\1\77"+ + "\2\u04a9\1\77\3\u04a9\1\77\5\u04a9\3\77\23\u04a9\22\77"+ + "\7\u04a9\1\77\12\u04a9\2\77\2\u04e2\2\77\1\u04e2\1\226"+ + "\1\77\2\u04e2\1\77\3\u04e2\1\77\5\u04e2\3\77\23\u04e2"+ + "\22\77\7\u04e2\1\77\12\u04e2\2\77\2\u04e2\1\u0515\1\u0516"+ + "\1\u04e2\1\226\1\77\2\u04e2\1\77\3\u04e2\1\77\5\u04e2"+ + "\3\77\23\u04e2\22\77\7\u04e2\1\77\12\u04e2\5\77\1\u0517"+ + "\1\u0518\1\226\1\77\2\u0518\1\77\3\u0518\1\77\5\u0518"+ + "\3\77\23\u0518\22\77\1\u0518\2\77\4\u0518\1\77\12\u0518"+ + "\7\77\1\226\36\77\1\u0519\54\77\1\u051a\2\77\1\226"+ + "\116\77\1\u051b\111\77\2\u04e7\3\77\1\u051b\66\77\2\u04e7"+ + "\21\77\1\u051c\1\u051d\3\77\1\226\66\77\2\u051d\21\77"+ + "\2\u04b1\1\u04e8\1\77\1\u04b1\1\226\1\77\2\u04b1\1\77"+ + "\3\u04b1\1\77\5\u04b1\3\77\23\u04b1\22\77\7\u04b1\1\77"+ + "\12\u04b1\7\77\1\u051e\116\77\1\u051f\116\77\1\u0520\116\77"+ + "\1\226\70\77\1\u0521\25\77\1\226\20\77\1\u0522\75\77"+ + "\1\226\24\77\1\u0523\71\77\1\226\21\77\1\u0524\74\77"+ + "\1\226\1\77\1\u0525\114\77\1\226\22\77\1\u0526\73\77"+ + "\1\226\20\77\1\u0527\75\77\1\226\20\77\1\u0528\75\77"+ + "\1\226\2\77\1\u0529\113\77\1\226\30\77\1\u052a\65\77"+ + "\1\226\31\77\1\u052b\64\77\1\226\2\77\1\u052c\113\77"+ + "\1\226\30\77\1\u052d\65\77\1\226\36\77\1\u052e\57\77"+ + "\1\226\30\77\1\u052f\65\77\1\226\33\77\1\u0530\62\77"+ + "\1\226\13\77\1\u0531\102\77\1\226\21\77\1\u0532\74\77"+ + "\1\226\36\77\1\u0533\57\77\1\226\2\77\1\u0534\113\77"+ + "\1\226\2\77\1\u0535\113\77\1\226\2\77\1\u0536\113\77"+ + "\1\226\2\77\1\u0537\113\77\1\226\1\77\1\u0538\114\77"+ + "\1\226\36\77\1\u0539\57\77\1\226\101\77\1\u053a\14\77"+ + "\1\226\2\77\1\u053b\106\77\2\u050e\2\77\1\u050e\1\226"+ + "\1\77\2\u050e\1\77\3\u050e\1\77\5\u050e\3\77\23\u050e"+ + "\22\77\7\u050e\1\77\12\u050e\2\77\2\u050e\1\77\1\u053c"+ + "\1\u050e\1\u053d\1\77\2\u050e\1\77\3\u050e\1\77\5\u050e"+ + "\3\77\23\u050e\22\77\7\u050e\1\77\12\u050e\2\77\2\u050e"+ + "\1\77\1\u053c\1\u050e\1\u053d\1\77\2\u050e\1\77\3\u050e"+ + "\1\77\5\u050e\3\77\15\u050e\1\u053e\5\u050e\22\77\7\u050e"+ + "\1\77\12\u050e\2\77\1\u053f\1\u0540\3\77\1\226\66\77"+ + "\2\u0540\21\77\2\u04de\1\u0511\1\77\1\u04de\1\226\1\77"+ + "\2\u04de\1\77\3\u04de\1\77\5\u04de\3\77\23\u04de\22\77"+ + "\7\u04de\1\77\12\u04de\7\77\1\u0541\111\77\2\u0514\3\77"+ + "\1\u0541\66\77\2\u0514\21\77\1\u0542\1\u0543\3\77\1\226"+ + "\66\77\2\u0543\21\77\2\u04e2\1\u0515\1\77\1\u04e2\1\226"+ + "\1\77\2\u04e2\1\77\3\u04e2\1\77\5\u04e2\3\77\23\u04e2"+ + "\22\77\7\u04e2\1\77\12\u04e2\2\77\2\u0518\2\77\1\u0518"+ + "\1\226\1\77\2\u0518\1\77\3\u0518\1\77\5\u0518\3\77"+ + "\23\u0518\22\77\7\u0518\1\77\12\u0518\2\77\2\u0518\1\u0544"+ + "\1\u0545\1\u0518\1\226\1\77\2\u0518\1\77\3\u0518\1\77"+ + "\5\u0518\3\77\23\u0518\22\77\7\u0518\1\77\12\u0518\4\77"+ + "\1\u0546\2\77\1\226\114\77\1\u0547\1\u0548\1\226\1\77"+ + "\2\u0548\1\77\3\u0548\1\77\5\u0548\3\77\23\u0548\22\77"+ + "\1\u0548\2\77\4\u0548\1\77\12\u0548\7\77\1\u0549\111\77"+ + "\2\u051d\3\77\1\u0549\66\77\2\u051d\26\77\1\226\40\77"+ + "\1\u054a\55\77\1\226\2\77\1\u054b\113\77\1\u054c\116\77"+ + "\1\226\24\77\1\u054d\71\77\1\226\21\77\1\u054e\74\77"+ + "\1\u054f\116\77\1\226\22\77\1\u0550\73\77\1\226\2\77"+ + "\1\u0551\113\77\1\226\21\77\1\u0552\74\77\1\226\34\77"+ + "\1\u0553\61\77\1\226\1\77\1\u0554\114\77\1\226\30\77"+ + "\1\u0555\65\77\1\226\2\77\1\u0556\113\77\1\226\31\77"+ + "\1\u0557\64\77\1\226\2\77\1\u0558\113\77\1\226\36\77"+ + "\1\u0559\57\77\1\226\2\77\1\u055a\113\77\1\226\37\77"+ + "\1\u055b\56\77\1\226\13\77\1\u055c\102\77\1\226\35\77"+ + "\1\u055d\60\77\1\226\30\77\1\u055e\65\77\1\226\21\77"+ + "\1\u055f\74\77\1\226\35\77\1\u0560\60\77\1\226\13\77"+ + "\1\u0561\102\77\1\226\21\77\1\u0562\74\77\1\226\21\77"+ + "\1\u0563\74\77\1\226\21\77\1\u0564\67\77\2\u050e\2\77"+ + "\1\u050e\1\u053d\1\77\2\u050e\1\77\3\u050e\1\77\5\u050e"+ + "\3\77\23\u050e\22\77\7\u050e\1\77\12\u050e\2\77\2\u050e"+ + "\1\77\1\u053c\1\u050e\1\u053d\1\77\2\u050e\1\77\3\u050e"+ + "\1\77\5\u050e\3\77\12\u050e\1\u0565\10\u050e\22\77\7\u050e"+ + "\1\77\12\u050e\7\77\1\u0566\111\77\2\u0540\3\77\1\u0566"+ + "\66\77\2\u0540\26\77\1\u0567\111\77\2\u0543\3\77\1\u0567"+ + "\66\77\2\u0543\21\77\1\u0568\1\u0569\3\77\1\226\66\77"+ + "\2\u0569\21\77\2\u0518\1\u0544\1\77\1\u0518\1\226\1\77"+ + "\2\u0518\1\77\3\u0518\1\77\5\u0518\3\77\23\u0518\22\77"+ + "\7\u0518\1\77\12\u0518\5\77\1\u056a\1\u056b\1\226\1\77"+ + "\2\u056b\1\77\3\u056b\1\77\5\u056b\3\77\23\u056b\22\77"+ + "\1\u056b\2\77\4\u056b\1\77\12\u056b\2\77\2\u0548\2\77"+ + "\1\u0548\1\226\1\77\2\u0548\1\77\3\u0548\1\77\5\u0548"+ + "\3\77\23\u0548\22\77\7\u0548\1\77\12\u0548\2\77\2\u0548"+ + "\1\u056c\1\u056d\1\u0548\1\226\1\77\2\u0548\1\77\3\u0548"+ + "\1\77\5\u0548\3\77\23\u0548\22\77\7\u0548\1\77\12\u0548"+ + "\7\77\1\226\36\77\1\u056e\57\77\1\u056f\116\77\1\226"+ + "\22\77\1\u0570\73\77\1\226\24\77\1\u0571\71\77\1\u0572"+ + "\116\77\1\u0573\116\77\1\226\32\77\1\u0574\63\77\1\226"+ + "\35\77\1\u0575\60\77\1\226\13\77\1\u0576\102\77\1\226"+ + "\2\77\1\u0577\113\77\1\226\36\77\1\u0578\57\77\1\226"+ + "\13\77\1\u0579\61\77\1\u057a\20\77\1\226\36\77\1\u057b"+ + "\57\77\1\u057c\116\77\1\226\30\77\1\u057d\65\77\1\226"+ + "\36\77\1\u057e\57\77\1\226\2\77\1\u057f\113\77\1\226"+ + "\32\77\1\u0580\63\77\1\226\2\77\1\u0581\113\77\1\226"+ + "\32\77\1\u0582\63\77\1\226\32\77\1\u0583\63\77\1\226"+ + "\2\77\1\u0584\113\77\1\226\41\77\1\u0585\54\77\1\226"+ + "\37\77\1\u0586\56\77\1\226\32\77\1\u0587\56\77\2\u050e"+ + "\1\77\1\u053c\1\u050e\1\u053d\1\77\2\u050e\1\77\3\u050e"+ + "\1\77\5\u050e\3\77\1\u050e\1\u0588\21\u050e\22\77\7\u050e"+ + "\1\77\12\u050e\7\77\1\u0589\111\77\2\u0569\3\77\1\u0589"+ + "\66\77\2\u0569\21\77\2\u056b\2\77\1\u056b\1\226\1\77"+ + "\2\u056b\1\77\3\u056b\1\77\5\u056b\3\77\23\u056b\22\77"+ + "\7\u056b\1\77\12\u056b\2\77\2\u056b\1\u058a\1\u058b\1\u056b"+ + "\1\226\1\77\2\u056b\1\77\3\u056b\1\77\5\u056b\3\77"+ + "\23\u056b\22\77\7\u056b\1\77\12\u056b\2\77\1\u058c\1\u058d"+ + "\3\77\1\226\66\77\2\u058d\21\77\2\u0548\1\u056c\1\77"+ + "\1\u0548\1\226\1\77\2\u0548\1\77\3\u0548\1\77\5\u0548"+ + "\3\77\23\u0548\22\77\7\u0548\1\77\12\u0548\7\77\1\226"+ + "\20\77\1\u058e\75\77\1\u058f\116\77\1\226\22\77\1\u0590"+ + "\73\77\1\226\24\77\1\u0591\71\77\1\226\21\77\1\u0592"+ + "\74\77\1\226\2\77\1\u0593\113\77\1\226\36\77\1\u0594"+ + "\57\77\1\u0595\116\77\1\226\2\77\1\u0596\113\77\1\226"+ + "\36\77\1\u0597\57\77\1\u0598\116\77\1\226\2\77\1\u0599"+ + "\113\77\1\226\31\77\1\u059a\64\77\1\226\30\77\1\u059b"+ + "\65\77\1\226\1\77\1\u059c\114\77\1\226\36\77\1\u059d"+ + "\57\77\1\226\24\77\1\u059e\71\77\1\226\1\77\1\u059f"+ + "\114\77\1\226\30\77\1\u05a0\65\77\1\226\36\77\1\u05a1"+ + "\57\77\1\226\36\77\1\u05a2\57\77\1\226\24\77\1\u05a3"+ + "\64\77\2\u050e\1\77\1\u053c\1\u050e\1\u053d\1\77\2\u050e"+ + "\1\77\3\u050e\1\77\5\u050e\3\77\14\u050e\1\u05a4\6\u050e"+ + "\22\77\7\u050e\1\77\12\u050e\2\77\1\u05a5\1\u05a6\3\77"+ + "\1\226\66\77\2\u05a6\21\77\2\u056b\1\u058a\1\77\1\u056b"+ + "\1\226\1\77\2\u056b\1\77\3\u056b\1\77\5\u056b\3\77"+ + "\23\u056b\22\77\7\u056b\1\77\12\u056b\7\77\1\u05a7\111\77"+ + "\2\u058d\3\77\1\u05a7\66\77\2\u058d\26\77\1\226\2\77"+ + "\1\u05a8\113\77\1\u05a9\116\77\1\u05aa\116\77\1\226\24\77"+ + "\1\u05ab\71\77\1\226\30\77\1\u05ac\65\77\1\u05ad\116\77"+ + "\1\226\30\77\1\u05ae\65\77\1\226\70\77\1\u05af\25\77"+ + "\1\226\36\77\1\u05b0\57\77\1\226\13\77\1\u05b1\61\77"+ + "\1\u05b2\20\77\1\226\2\77\1\u05b3\113\77\1\u05b4\116\77"+ + "\1\u05b5\116\77\1\u05b6\116\77\1\u05b7\116\77\1\226\2\77"+ + "\1\u05b8\113\77\1\226\13\77\1\u05b9\102\77\1\226\31\77"+ + "\1\u05ba\64\77\1\226\72\77\1\u05bb\16\77\2\u050e\1\77"+ + "\1\u053c\1\u050e\1\u053d\1\77\2\u050e\1\77\3\u050e\1\77"+ + "\5\u050e\3\77\16\u050e\1\u05bc\4\u050e\22\77\7\u050e\1\77"+ + "\12\u050e\7\77\1\u05bd\111\77\2\u05a6\3\77\1\u05bd\66\77"+ + "\2\u05a6\26\77\1\u05be\116\77\1\226\36\77\1\u05bf\57\77"+ + "\1\226\2\77\1\u05c0\113\77\1\226\2\77\1\u05c1\113\77"+ + "\1\226\40\77\1\u05c2\55\77\1\u05c3\116\77\1\226\2\77"+ + "\1\u05c4\113\77\1\226\36\77\1\u05c5\57\77\1\226\36\77"+ + "\1\u05c6\57\77\1\226\36\77\1\u05c7\57\77\1\226\2\77"+ + "\1\u05c8\113\77\1\226\13\77\1\u05c9\61\77\1\u05ca\20\77"+ + "\1\226\30\77\1\u05cb\60\77\2\u050e\1\77\1\u05cc\1\u050e"+ + "\1\u053d\1\77\2\u050e\1\77\3\u050e\1\77\5\u050e\3\77"+ + "\23\u050e\22\77\7\u050e\1\77\12\u050e\7\77\1\u05cd\116\77"+ + "\1\226\36\77\1\u05ce\57\77\1\226\36\77\1\u05cf\57\77"+ + "\1\226\36\77\1\u05d0\57\77\1\226\30\77\1\u05d1\65\77"+ + "\1\226\70\77\1\u05d2\25\77\1\u05d3\116\77\1\u05d4\116\77"+ + "\1\226\30\77\1\u05d5\65\77\1\226\2\77\1\u05d6\113\77"+ + "\1\226\36\77\1\u05d7\57\77\1\226\73\77\1\u05d8\15\77"+ + "\2\u050e\1\77\1\u05d9\1\u050e\1\u053d\1\77\2\u050e\1\77"+ + "\3\u050e\1\77\5\u050e\3\77\23\u050e\22\77\7\u050e\1\77"+ + "\12\u050e\7\77\1\u05da\116\77\1\u05db\116\77\1\226\20\77"+ + "\1\u05dc\75\77\1\226\2\77\1\u05dd\113\77\1\226\40\77"+ + "\1\u05de\55\77\1\226\2\77\1\u05df\113\77\1\226\30\77"+ + "\1\u05e0\65\77\1\226\70\77\1\u05e1\25\77\1\u05e2\111\77"+ + "\2\u05d9\3\77\1\u053d\66\77\2\u05d9\26\77\1\226\2\77"+ + "\1\u05e3\113\77\1\226\36\77\1\u05e4\57\77\1\226\36\77"+ + "\1\u05e5\57\77\1\226\36\77\1\u05e6\57\77\1\226\2\77"+ + "\1\u05e7\113\77\1\226\40\77\1\u05e8\55\77\1\u05e9\116\77"+ + "\1\u05ea\116\77\1\226\20\77\1\u05eb\75\77\1\u05ec\116\77"+ + "\1\226\36\77\1\u05ed\57\77\1\226\36\77\1\u05ee\57\77"+ + "\1\226\2\77\1\u05ef\113\77\1\u05f0\116\77\1\226\20\77"+ + "\1\u05f1\75\77\1\u05f2\116\77\1\226\2\77\1\u05f3\113\77"+ + "\1\u05f4\107\77"; + + private static int [] zzUnpackTrans() { + int [] result = new int[101515]; + int offset = 0; + offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackTrans(String packed, int offset, int [] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int count = packed.charAt(i++); + int value = packed.charAt(i++); + value--; + do result[j++] = value; while (--count > 0); + } + return j; + } + + + /* error codes */ + private static final int ZZ_UNKNOWN_ERROR = 0; + private static final int ZZ_NO_MATCH = 1; + private static final int ZZ_PUSHBACK_2BIG = 2; + + /* error messages for the codes above */ + private static final String ZZ_ERROR_MSG[] = { + "Unkown internal scanner error", + "Error: could not match input", + "Error: pushback value was too large" + }; + + /** + * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code> + */ + private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute(); + + private static final String ZZ_ATTRIBUTE_PACKED_0 = + "\3\0\2\11\2\1\1\11\12\1\1\11\21\1\1\11"+ + "\1\1\5\11\2\1\6\11\6\1\1\11\1\1\2\0"+ + "\1\1\10\0\6\1\2\11\7\1\2\11\62\1\3\11"+ + "\1\0\1\11\5\1\2\0\1\11\1\0\1\11\43\0"+ + "\141\1\36\0\1\11\21\0\144\1\63\0\120\1\23\0"+ + "\1\11\13\0\1\11\3\0\1\11\25\0\101\1\1\0"+ + "\1\1\1\0\1\11\36\0\1\11\5\0\1\11\2\0"+ + "\1\11\2\0\1\11\17\0\64\1\1\11\3\0\1\11"+ + "\1\0\1\11\23\0\2\11\4\0\1\11\6\0\1\11"+ + "\3\0\1\11\23\0\37\1\1\0\3\11\25\0\1\11"+ + "\5\0\1\11\1\0\1\11\3\0\1\11\32\0\27\1"+ + "\4\0\1\11\2\0\1\11\16\0\1\11\1\0\4\11"+ + "\17\0\1\11\23\0\15\1\4\0\1\11\20\0\2\11"+ + "\3\0\1\11\3\0\1\11\34\0\4\1\27\0\1\11"+ + "\7\0\1\11\33\0\1\1\2\0\1\11\1\0\1\11"+ + "\24\0\1\11\7\0\1\11\5\0\1\11\25\0\2\11"+ + "\22\0\1\11\1\0\1\11\4\0\1\11\4\0\1\11"+ + "\14\0\1\11\11\0\1\11\12\0\1\11\2\0\3\11"+ + "\34\0\1\11\3\0\1\11\7\0\1\11\2\0\1\11"+ + "\2\0\1\11\26\0\2\11\7\0\1\11\2\0\2\11"+ + "\10\0\1\11\14\0\1\11\5\0\1\11\5\0\1\11"+ + "\2\0\1\11\16\0\1\11\1\0\2\11\2\0\1\11"+ + "\6\0\4\11\5\0\2\11\4\0\1\11\11\0\1\11"+ + "\5\0\2\11\5\0\2\11\6\0\1\11\6\0\2\11"+ + "\1\0\1\11\3\0\1\11\1\0\1\11\1\0\1\11"; + + private static int [] zzUnpackAttribute() { + int [] result = new int[1524]; + int offset = 0; + offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackAttribute(String packed, int offset, int [] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int count = packed.charAt(i++); + int value = packed.charAt(i++); + do result[j++] = value; while (--count > 0); + } + return j; + } + + /** the input device */ + private java.io.Reader zzReader; + + /** the current state of the DFA */ + private int zzState; + + /** the current lexical state */ + private int zzLexicalState = YYINITIAL; + + /** this buffer contains the current text to be matched and is + the source of the yytext() string */ + private char zzBuffer[] = new char[ZZ_BUFFERSIZE]; + + /** the textposition at the last accepting state */ + private int zzMarkedPos; + + /** the current text position in the buffer */ + private int zzCurrentPos; + + /** startRead marks the beginning of the yytext() string in the buffer */ + private int zzStartRead; + + /** endRead marks the last character in the buffer, that has been read + from input */ + private int zzEndRead; + + /** number of newlines encountered up to the start of the matched text */ + private int yyline; + + /** the number of characters up to the start of the matched text */ + private int yychar; + + /** + * the number of characters from the last newline up to the start of the + * matched text + */ + private int yycolumn; + + /** + * zzAtBOL == true <=> the scanner is currently at the beginning of a line + */ + private boolean zzAtBOL = true; + + /** zzAtEOF == true <=> the scanner is at the EOF */ + private boolean zzAtEOF; + + /** denotes if the user-EOF-code has already been executed */ + private boolean zzEOFDone; + + /* user code: */ + ComplexSymbol makeSymbol(int id, Object val) { + // System.out.print(" ##" + AvatarFromSysMLSymbols.terminalNames[id] + "-" + val + " " + "(" + "l:" + yyline + ",c:" + yycolumn + ")"); + return new ComplexSymbol( + AvatarFromSysMLSymbols.terminalNames[id], + id, + new Location(yyline, yycolumn), + new Location(yyline, yycolumn + yytext().length()), + val); + } + /** create a symbol provided with current lexeme and location */ + ComplexSymbol makeSymbol(int id) { + // System.out.print(" ##" + AvatarFromSysMLSymbols.terminalNames[id] + "(" + "l:" + yyline + ",c:" + yycolumn + ")"); + return new ComplexSymbol( + AvatarFromSysMLSymbols.terminalNames[id], + id, + new Location(yyline, yycolumn), + new Location(yyline, yycolumn + yytext().length())); + } + + /** to memorize error location before throwing an exception */ + Location errorLocation; + + /** memorize error location */ + public void setErrorLocation(Location _errorLocation) { errorLocation = _errorLocation; } + + /** get memorized error location */ + public Location getErrorLocation() { return errorLocation; } + + /** get current location. To allow parser to know location without lexeme (i.e. through empty grammar rule) */ + public Location getLocation() { return new Location(yyline, yycolumn); } + + + /** + * Creates a new scanner + * There is also a java.io.InputStream version of this constructor. + * + * @param in the java.io.Reader to read input from. + */ + public AvatarFromSysMLLexer(java.io.Reader in) { + // there is initially no error + errorLocation = null; + this.zzReader = in; + } + + /** + * Creates a new scanner. + * There is also java.io.Reader version of this constructor. + * + * @param in the java.io.Inputstream to read input from. + */ + public AvatarFromSysMLLexer(java.io.InputStream in) { + this(new java.io.InputStreamReader(in)); + } + + /** + * Unpacks the compressed character translation table. + * + * @param packed the packed character translation table + * @return the unpacked character translation table + */ + private static char [] zzUnpackCMap(String packed) { + char [] map = new char[0x10000]; + int i = 0; /* index in packed string */ + int j = 0; /* index in unpacked array */ + while (i < 182) { + int count = packed.charAt(i++); + char value = packed.charAt(i++); + do map[j++] = value; while (--count > 0); + } + return map; + } + + + /** + * Refills the input buffer. + * + * @return <code>false</code>, iff there was new input. + * + * @exception java.io.IOException if any I/O-Error occurs + */ + private boolean zzRefill() throws java.io.IOException { + + /* first: make room (if you can) */ + if (zzStartRead > 0) { + System.arraycopy(zzBuffer, zzStartRead, + zzBuffer, 0, + zzEndRead-zzStartRead); + + /* translate stored positions */ + zzEndRead-= zzStartRead; + zzCurrentPos-= zzStartRead; + zzMarkedPos-= zzStartRead; + zzStartRead = 0; + } + + /* is the buffer big enough? */ + if (zzCurrentPos >= zzBuffer.length) { + /* if not: blow it up */ + char newBuffer[] = new char[zzCurrentPos*2]; + System.arraycopy(zzBuffer, 0, newBuffer, 0, zzBuffer.length); + zzBuffer = newBuffer; + } + + /* finally: fill the buffer with new input */ + int numRead = zzReader.read(zzBuffer, zzEndRead, + zzBuffer.length-zzEndRead); + + if (numRead > 0) { + zzEndRead+= numRead; + return false; + } + // unlikely but not impossible: read 0 characters, but not at end of stream + if (numRead == 0) { + int c = zzReader.read(); + if (c == -1) { + return true; + } else { + zzBuffer[zzEndRead++] = (char) c; + return false; + } + } + + // numRead < 0 + return true; + } + + + /** + * Closes the input stream. + */ + public final void yyclose() throws java.io.IOException { + zzAtEOF = true; /* indicate end of file */ + zzEndRead = zzStartRead; /* invalidate buffer */ + + if (zzReader != null) + zzReader.close(); + } + + + /** + * Resets the scanner to read from a new input stream. + * Does not close the old reader. + * + * All internal variables are reset, the old input stream + * <b>cannot</b> be reused (internal buffer is discarded and lost). + * Lexical state is set to <code>ZZ_INITIAL</code>. + * + * @param reader the new input stream + */ + public final void yyreset(java.io.Reader reader) { + zzReader = reader; + zzAtBOL = true; + zzAtEOF = false; + zzEOFDone = false; + zzEndRead = zzStartRead = 0; + zzCurrentPos = zzMarkedPos = 0; + yyline = yychar = yycolumn = 0; + zzLexicalState = YYINITIAL; + } + + + /** + * Returns the current lexical state. + */ + public final int yystate() { + return zzLexicalState; + } + + + /** + * Enters a new lexical state + * + * @param newState the new lexical state + */ + public final void yybegin(int newState) { + zzLexicalState = newState; + } + + + /** + * Returns the text matched by the current regular expression. + */ + public final String yytext() { + return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead ); + } + + + /** + * Returns the character at position <code>pos</code> from the + * matched text. + * + * It is equivalent to yytext().charAt(pos), but faster + * + * @param pos the position of the character to fetch. + * A value from 0 to yylength()-1. + * + * @return the character at position pos + */ + public final char yycharat(int pos) { + return zzBuffer[zzStartRead+pos]; + } + + + /** + * Returns the length of the matched text region. + */ + public final int yylength() { + return zzMarkedPos-zzStartRead; + } + + + /** + * Reports an error that occured while scanning. + * + * In a wellformed scanner (no or only correct usage of + * yypushback(int) and a match-all fallback rule) this method + * will only be called with things that "Can't Possibly Happen". + * If this method is called, something is seriously wrong + * (e.g. a JFlex bug producing a faulty scanner etc.). + * + * Usual syntax/scanner level error handling should be done + * in error fallback rules. + * + * @param errorCode the code of the errormessage to display + */ + private void zzScanError(int errorCode) { + String message; + try { + message = ZZ_ERROR_MSG[errorCode]; + } + catch (ArrayIndexOutOfBoundsException e) { + message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR]; + } + + throw new Error(message); + } + + + /** + * Pushes the specified amount of characters back into the input stream. + * + * They will be read again by then next call of the scanning method + * + * @param number the number of characters to be read again. + * This number must not be greater than yylength()! + */ + public void yypushback(int number) { + if ( number > yylength() ) + zzScanError(ZZ_PUSHBACK_2BIG); + + zzMarkedPos -= number; + } + + + /** + * Contains user EOF-code, which will be executed exactly once, + * when the end of file is reached + */ + private void zzDoEOF() throws java.io.IOException { + if (!zzEOFDone) { + zzEOFDone = true; + yyclose(); + } + } + + + /** + * Resumes scanning until the next regular expression is matched, + * the end of input is encountered or an I/O-Error occurs. + * + * @return the next token + * @exception java.io.IOException if any I/O-Error occurs + */ + public java_cup.runtime.Symbol next_token() throws java.io.IOException, Exception { + int zzInput; + int zzAction; + + // cached fields: + int zzCurrentPosL; + int zzMarkedPosL; + int zzEndReadL = zzEndRead; + char [] zzBufferL = zzBuffer; + char [] zzCMapL = ZZ_CMAP; + + int [] zzTransL = ZZ_TRANS; + int [] zzRowMapL = ZZ_ROWMAP; + int [] zzAttrL = ZZ_ATTRIBUTE; + + while (true) { + zzMarkedPosL = zzMarkedPos; + + boolean zzR = false; + for (zzCurrentPosL = zzStartRead; zzCurrentPosL < zzMarkedPosL; + zzCurrentPosL++) { + switch (zzBufferL[zzCurrentPosL]) { + case '\u000B': + case '\u000C': + case '\u0085': + case '\u2028': + case '\u2029': + yyline++; + yycolumn = 0; + zzR = false; + break; + case '\r': + yyline++; + yycolumn = 0; + zzR = true; + break; + case '\n': + if (zzR) + zzR = false; + else { + yyline++; + yycolumn = 0; + } + break; + default: + zzR = false; + yycolumn++; + } + } + + if (zzR) { + // peek one character ahead if it is \n (if we have counted one line too much) + boolean zzPeek; + if (zzMarkedPosL < zzEndReadL) + zzPeek = zzBufferL[zzMarkedPosL] == '\n'; + else if (zzAtEOF) + zzPeek = false; + else { + boolean eof = zzRefill(); + zzEndReadL = zzEndRead; + zzMarkedPosL = zzMarkedPos; + zzBufferL = zzBuffer; + if (eof) + zzPeek = false; + else + zzPeek = zzBufferL[zzMarkedPosL] == '\n'; + } + if (zzPeek) yyline--; + } + zzAction = -1; + + zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL; + + zzState = ZZ_LEXSTATE[zzLexicalState]; + + + zzForAction: { + while (true) { + + if (zzCurrentPosL < zzEndReadL) + zzInput = zzBufferL[zzCurrentPosL++]; + else if (zzAtEOF) { + zzInput = YYEOF; + break zzForAction; + } + else { + // store back cached positions + zzCurrentPos = zzCurrentPosL; + zzMarkedPos = zzMarkedPosL; + boolean eof = zzRefill(); + // get translated positions and possibly new buffer + zzCurrentPosL = zzCurrentPos; + zzMarkedPosL = zzMarkedPos; + zzBufferL = zzBuffer; + zzEndReadL = zzEndRead; + if (eof) { + zzInput = YYEOF; + break zzForAction; + } + else { + zzInput = zzBufferL[zzCurrentPosL++]; + } + } + int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ]; + if (zzNext == -1) break zzForAction; + zzState = zzNext; + + int zzAttributes = zzAttrL[zzState]; + if ( (zzAttributes & 1) == 1 ) { + zzAction = zzState; + zzMarkedPosL = zzCurrentPosL; + if ( (zzAttributes & 8) == 8 ) break zzForAction; + } + + } + } + + // store back cached position + zzMarkedPos = zzMarkedPosL; + + switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) { + case 114: + { return makeSymbol(AvatarFromSysMLSymbols.IDENT, new Ident(AvatarFromSysMLSyntax.DATATYPENAME,yytext())); + } + case 256: break; + case 10: + { return makeSymbol(AvatarFromSysMLSymbols.SEMICOLON); + } + case 257: break; + case 102: + { return makeSymbol(AvatarFromSysMLSymbols.FILTER); + } + case 258: break; + case 37: + { yybegin(COMMENTLINE); break; + } + case 259: break; + case 1: + { setErrorLocation(new Location(yyline, yycolumn)); + throw new Exception ("unexpected character in expression"); + } + case 260: break; + case 142: + { return makeSymbol(AvatarFromSysMLSymbols.IDENT, new Ident(AvatarFromSysMLSyntax.TIMERBLOCKNAME,yytext())); + } + case 261: break; + case 174: + { return makeSymbol(AvatarFromSysMLSymbols.IDENT, new Ident(AvatarFromSysMLSyntax.RELATIONNAME,yytext())); + } + case 262: break; + case 104: + { return makeSymbol(AvatarFromSysMLSymbols.ASSERT); + } + case 263: break; + case 72: + { return makeSymbol(AvatarFromSysMLSymbols.ELSE); + } + case 264: break; + case 68: + { return makeSymbol(AvatarFromSysMLSymbols.PART); + } + case 265: break; + case 247: + { return makeSymbol(AvatarFromSysMLSymbols.AVSTANDARDSTATE_T); + } + case 266: break; + case 193: + { return makeSymbol(AvatarFromSysMLSymbols.SYNCREL_T); + } + case 267: break; + case 46: + { return makeSymbol(AvatarFromSysMLSymbols.NOT); + } + case 268: break; + case 94: + { return makeSymbol(AvatarFromSysMLSymbols.UNTIL); + } + case 269: break; + case 51: + { return makeSymbol(AvatarFromSysMLSymbols.OUT); + } + case 270: break; + case 243: + { return makeSymbol(AvatarFromSysMLSymbols.AVRANDOMSTATE_T); + } + case 271: break; + case 155: + { return makeSymbol(AvatarFromSysMLSymbols.PARALLEL); + } + case 272: break; + case 105: + { return makeSymbol(AvatarFromSysMLSymbols.ASSUME); + } + case 273: break; + case 252: + { return makeSymbol(AvatarFromSysMLSymbols.AVPRERECEIVESTATE_T); + } + case 274: break; + case 26: + { return makeSymbol(AvatarFromSysMLSymbols.TO); + } + case 275: break; + case 69: + { return makeSymbol(AvatarFromSysMLSymbols.PORT); + } + case 276: break; + case 176: + { return makeSymbol(AvatarFromSysMLSymbols.IDENT, new Ident(AvatarFromSysMLSyntax.MESSAGENAME,yytext())); + } + case 277: break; + case 29: + { return makeSymbol(AvatarFromSysMLSymbols.BY); + } + case 278: break; + case 12: + { return makeSymbol(AvatarFromSysMLSymbols.PLUS); + } + case 279: break; + case 178: + { return makeSymbol(AvatarFromSysMLSymbols.PAYLOAD_F); + } + case 280: break; + case 177: + { return makeSymbol(AvatarFromSysMLSymbols.REQUEST_F); + } + case 281: break; + case 57: + { return makeSymbol(AvatarFromSysMLSymbols.DONE_U); + } + case 282: break; + case 19: + { return makeSymbol(AvatarFromSysMLSymbols.LPAR); + } + case 283: break; + case 76: + { return makeSymbol(AvatarFromSysMLSymbols.WHEN); + } + case 284: break; + case 159: + { return makeSymbol(AvatarFromSysMLSymbols.BLOCK2_F); + } + case 285: break; + case 70: + { return makeSymbol(AvatarFromSysMLSymbols.CALC); + } + case 286: break; + case 23: + { return makeSymbol(AvatarFromSysMLSymbols.COMMA); + } + case 287: break; + case 17: + { return makeSymbol(AvatarFromSysMLSymbols.EQUAL); + } + case 288: break; + case 206: + { return makeSymbol(AvatarFromSysMLSymbols.IDENT, new Ident(AvatarFromSysMLSyntax.SENDSTATENAME,yytext())); + } + case 289: break; + case 48: + { return makeSymbol(AvatarFromSysMLSymbols.ALL); + } + case 290: break; + case 197: + { return makeSymbol(AvatarFromSysMLSymbols.REQUIREMENT); + } + case 291: break; + case 161: + { return makeSymbol(AvatarFromSysMLSymbols.EXPIRE_TM); + } + case 292: break; + case 229: + { return makeSymbol(AvatarFromSysMLSymbols.IDENT, new Ident(AvatarFromSysMLSyntax.PRERESETTIMERSTATENAME,yytext())); + } + case 293: break; + case 186: + { return makeSymbol(AvatarFromSysMLSymbols.ALLOCATION); + } + case 294: break; + case 112: + { return makeSymbol(AvatarFromSysMLSymbols.VERIFY); + } + case 295: break; + case 153: + { return makeSymbol(AvatarFromSysMLSymbols.ANALYSIS); + } + case 296: break; + case 42: + { String s = yytext(); + return makeSymbol(AvatarFromSysMLSymbols.ANYNAME, s.substring(1, s.length() - 1)); + } + case 297: break; + case 54: + { return makeSymbol(AvatarFromSysMLSymbols.VIA); + } + case 298: break; + case 203: + { return makeSymbol(AvatarFromSysMLSymbols.NBFIFOREL_T); + } + case 299: break; + case 184: + { return makeSymbol(AvatarFromSysMLSymbols.SUCCESSION); + } + case 300: break; + case 67: + { return makeSymbol(AvatarFromSysMLSymbols.FORK); + } + case 301: break; + case 166: + { return makeSymbol(AvatarFromSysMLSymbols.NONUNIQUE); + } + case 302: break; + case 162: + { return makeSymbol(AvatarFromSysMLSymbols.WEIGHT_A); + } + case 303: break; + case 150: + { return makeSymbol(AvatarFromSysMLSymbols.SNAPSHOT); + } + case 304: break; + case 85: + { return makeSymbol(AvatarFromSysMLSymbols.FRAME); + } + case 305: break; + case 181: + { return makeSymbol(AvatarFromSysMLSymbols.CHANNEL_T); + } + case 306: break; + case 32: + { return makeSymbol(AvatarFromSysMLSymbols.IN); + } + case 307: break; + case 133: + { return makeSymbol(AvatarFromSysMLSymbols.CONNECT); + } + case 308: break; + case 6: + { return makeSymbol(AvatarFromSysMLSymbols.COLON); + } + case 309: break; + case 18: + { return makeSymbol(AvatarFromSysMLSymbols.QUEST); + } + case 310: break; + case 233: + { return makeSymbol(AvatarFromSysMLSymbols.IDENT, new Ident(AvatarFromSysMLSyntax.PREEXPIRETIMERSTATENAME,yytext())); + } + case 311: break; + case 146: + { return makeSymbol(AvatarFromSysMLSymbols.RESET_TM); + } + case 312: break; + case 101: + { yybegin(IMPORTITEM); return makeSymbol(AvatarFromSysMLSymbols.IMPORT); + } + case 313: break; + case 147: + { return makeSymbol(AvatarFromSysMLSymbols.VALUE_F); + } + case 314: break; + case 138: + { return makeSymbol(AvatarFromSysMLSymbols.MESSAGE); + } + case 315: break; + case 140: + { return makeSymbol(AvatarFromSysMLSymbols.INTEGER_T); + } + case 316: break; + case 55: + { return makeSymbol(AvatarFromSysMLSymbols.XOR); + } + case 317: break; + case 132: + { return makeSymbol(AvatarFromSysMLSymbols.PERFORM); + } + case 318: break; + case 234: + { return makeSymbol(AvatarFromSysMLSymbols.OUTSIGNALBINDING_T); + } + case 319: break; + case 65: + { return makeSymbol(AvatarFromSysMLSymbols.FLOW); + } + case 320: break; + case 108: + { return makeSymbol(AvatarFromSysMLSymbols.RETURN); + } + case 321: break; + case 82: + { return makeSymbol(AvatarFromSysMLSymbols.INOUT); + } + case 322: break; + case 24: + { yybegin(YYINITIAL); break; + } + case 323: break; + case 254: + { return makeSymbol(AvatarFromSysMLSymbols.RESETTIMERREQUEST_T); + } + case 324: break; + case 248: + { return makeSymbol(AvatarFromSysMLSymbols.AVSETTIMERSTATE_T); + } + case 325: break; + case 244: + { return makeSymbol(AvatarFromSysMLSymbols.AVSTATEMACHINE_T); + } + case 326: break; + case 43: + { return makeSymbol(AvatarFromSysMLSymbols.IDENT, new Ident(AvatarFromSysMLSyntax.QUOTEDNAME,yytext())); + } + case 327: break; + case 225: + { return makeSymbol(AvatarFromSysMLSymbols.RECEIVEREQUEST_T); + } + case 328: break; + case 33: + { return makeSymbol(AvatarFromSysMLSymbols.IF); + } + case 329: break; + case 235: + { return makeSymbol(AvatarFromSysMLSymbols.TRANSITIONACTION_T); + } + case 330: break; + case 100: + { return makeSymbol(AvatarFromSysMLSymbols.ISTYPE); + } + case 331: break; + case 245: + { return makeSymbol(AvatarFromSysMLSymbols.AVRECEIVESTATE_T); + } + case 332: break; + case 189: + { return makeSymbol(AvatarFromSysMLSymbols.CONSTRAINT); + } + case 333: break; + case 86: + { return makeSymbol(AvatarFromSysMLSymbols.ABOUT); + } + case 334: break; + case 47: + { return makeSymbol(AvatarFromSysMLSymbols.FOR); + } + case 335: break; + case 13: + { return makeSymbol(AvatarFromSysMLSymbols.MULT); + } + case 336: break; + case 135: + { return makeSymbol(AvatarFromSysMLSymbols.COMMENT); + } + case 337: break; + case 59: + { return makeSymbol(AvatarFromSysMLSymbols.THEN); + } + case 338: break; + case 242: + { return makeSymbol(AvatarFromSysMLSymbols.IMMEDIATEREQUEST_U); + } + case 339: break; + case 180: + { return makeSymbol(AvatarFromSysMLSymbols.CHANNEL_F); + } + case 340: break; + case 226: + { return makeSymbol(AvatarFromSysMLSymbols.TIMEREXPIREMSG_T); + } + case 341: break; + case 56: + { return makeSymbol(AvatarFromSysMLSymbols.IDENT, new Ident(AvatarFromSysMLSyntax.ATTRIBUTENAME,yytext())); + } + case 342: break; + case 139: + { return makeSymbol(AvatarFromSysMLSymbols.VARIANT); + } + case 343: break; + case 97: + { return makeSymbol(AvatarFromSysMLSymbols.MSG_U); + } + case 344: break; + case 130: + { return makeSymbol(AvatarFromSysMLSymbols.PACKAGE); + } + case 345: break; + case 232: + { return makeSymbol(AvatarFromSysMLSymbols.AVSENDSTATE_T); + } + case 346: break; + case 121: + { return makeSymbol(AvatarFromSysMLSymbols.BINDING); + } + case 347: break; + case 221: + { return makeSymbol(AvatarFromSysMLSymbols.RECEIVEACTION_T); + } + case 348: break; + case 30: + { return makeSymbol(AvatarFromSysMLSymbols.GEQ); + } + case 349: break; + case 40: + { String s = yytext(); + return makeSymbol(AvatarFromSysMLSymbols.STRING, s.substring(1, s.length() - 1)); + } + case 350: break; + case 27: + { return makeSymbol(AvatarFromSysMLSymbols.REFINES); + } + case 351: break; + case 207: + { return makeSymbol(AvatarFromSysMLSymbols.IDENT, new Ident(AvatarFromSysMLSyntax.RANDOMSTATENAME,yytext())); + } + case 352: break; + case 183: + { return makeSymbol(AvatarFromSysMLSymbols.TRANSITION); + } + case 353: break; + case 158: + { return makeSymbol(AvatarFromSysMLSymbols.BLOCK1_F); + } + case 354: break; + case 144: + { return makeSymbol(AvatarFromSysMLSymbols.IDENT, new Ident(AvatarFromSysMLSyntax.SIGNALNAME,yytext())); + } + case 355: break; + case 253: + { return makeSymbol(AvatarFromSysMLSymbols.AVEXPIRETIMERSTATE_T); + } + case 356: break; + case 122: + { return makeSymbol(AvatarFromSysMLSymbols.BOOLEAN_T); + } + case 357: break; + case 117: + { return makeSymbol(AvatarFromSysMLSymbols.SYNC_T); + } + case 358: break; + case 111: + { return makeSymbol(AvatarFromSysMLSymbols.EXPOSE); + } + case 359: break; + case 255: + { return makeSymbol(AvatarFromSysMLSymbols.EXPIRETIMERREQUEST_T); + } + case 360: break; + case 187: + { return makeSymbol(AvatarFromSysMLSymbols.REFERENCES); + } + case 361: break; + case 22: + { return makeSymbol(AvatarFromSysMLSymbols.RBRAC); + } + case 362: break; + case 58: + { return makeSymbol(AvatarFromSysMLSymbols.BOOL, Boolean.TRUE); + } + case 363: break; + case 34: + { return makeSymbol(AvatarFromSysMLSymbols.AT); + } + case 364: break; + case 125: + { return makeSymbol(AvatarFromSysMLSymbols.SUBJECT); + } + case 365: break; + case 148: + { return makeSymbol(AvatarFromSysMLSymbols.BFIFO_T); + } + case 366: break; + case 170: + { return makeSymbol(AvatarFromSysMLSymbols.OBJECTIVE); + } + case 367: break; + case 61: + { return makeSymbol(AvatarFromSysMLSymbols.LOOP); + } + case 368: break; + case 118: + { return makeSymbol(AvatarFromSysMLSymbols.DEFINED); + } + case 369: break; + case 41: + { try { return makeSymbol(AvatarFromSysMLSymbols.REAL, Double.parseDouble(yytext())); } + catch (NumberFormatException nfe) { + setErrorLocation(new Location(yyline, yycolumn)); + throw new Exception ("lexing : bad format for number : " + yytext()); } + } + case 370: break; + case 196: + { return makeSymbol(AvatarFromSysMLSymbols.SPECIALIZES); + } + case 371: break; + case 236: + { return makeSymbol(AvatarFromSysMLSymbols.AVSTARTSTATE_T); + } + case 372: break; + case 160: + { return makeSymbol(AvatarFromSysMLSymbols.AMOUNT_U); + } + case 373: break; + case 14: + { return makeSymbol(AvatarFromSysMLSymbols.MOD); + } + case 374: break; + case 16: + { return makeSymbol(AvatarFromSysMLSymbols.OR); + } + case 375: break; + case 116: + { return makeSymbol(AvatarFromSysMLSymbols.FIFO_T); + } + case 376: break; + case 154: + { return makeSymbol(AvatarFromSysMLSymbols.READONLY); + } + case 377: break; + case 89: + { return makeSymbol(AvatarFromSysMLSymbols.AFTER); + } + case 378: break; + case 222: + { return makeSymbol(AvatarFromSysMLSymbols.TIMERRESETMSG_T); + } + case 379: break; + case 194: + { return makeSymbol(AvatarFromSysMLSymbols.RELATION_T); + } + case 380: break; + case 21: + { return makeSymbol(AvatarFromSysMLSymbols.LBRAC); + } + case 381: break; + case 210: + { return makeSymbol(AvatarFromSysMLSymbols.TIMERSETMSG_T); + } + case 382: break; + case 52: + { return makeSymbol(AvatarFromSysMLSymbols.END); + } + case 383: break; + case 79: + { return makeSymbol(AvatarFromSysMLSymbols.BLOCK); + } + case 384: break; + case 228: + { return makeSymbol(AvatarFromSysMLSymbols.AVDATATYPE_T); + } + case 385: break; + case 44: + { return makeSymbol(AvatarFromSysMLSymbols.DOC); + } + case 386: break; + case 28: + { return makeSymbol(AvatarFromSysMLSymbols.GETS); + } + case 387: break; + case 60: + { return makeSymbol(AvatarFromSysMLSymbols.BIND); + } + case 388: break; + case 4: + { return makeSymbol(AvatarFromSysMLSymbols.POINT); + } + case 389: break; + case 212: + { return makeSymbol(AvatarFromSysMLSymbols.AVTIMER_T); + } + case 390: break; + case 209: + { return makeSymbol(AvatarFromSysMLSymbols.NOKREQUEST_U); + } + case 391: break; + case 179: + { return makeSymbol(AvatarFromSysMLSymbols.PRIVATE_F); + } + case 392: break; + case 11: + { return makeSymbol(AvatarFromSysMLSymbols.DIV); + } + case 393: break; + case 128: + { return makeSymbol(AvatarFromSysMLSymbols.REQUIRE); + } + case 394: break; + case 172: + { return makeSymbol(AvatarFromSysMLSymbols.VIEWPOINT); + } + case 395: break; + case 163: + { return makeSymbol(AvatarFromSysMLSymbols.NBFIFO_T); + } + case 396: break; + case 237: + { return makeSymbol(AvatarFromSysMLSymbols.AVCALCMETHOD_T); + } + case 397: break; + case 171: + { return makeSymbol(AvatarFromSysMLSymbols.PROTECTED); + } + case 398: break; + case 103: + { return makeSymbol(AvatarFromSysMLSymbols.ASSIGN); + } + case 399: break; + case 175: + { return makeSymbol(AvatarFromSysMLSymbols.IDENT, new Ident(AvatarFromSysMLSyntax.STARTSTATENAME,yytext())); + } + case 400: break; + case 53: + { return makeSymbol(AvatarFromSysMLSymbols.USE); + } + case 401: break; + case 137: + { return makeSymbol(AvatarFromSysMLSymbols.EXHIBIT); + } + case 402: break; + case 93: + { return makeSymbol(AvatarFromSysMLSymbols.MERGE); + } + case 403: break; + case 84: + { return makeSymbol(AvatarFromSysMLSymbols.BOOL, Boolean.FALSE); + } + case 404: break; + case 36: + { return makeSymbol(AvatarFromSysMLSymbols.OF); + } + case 405: break; + case 250: + { return makeSymbol(AvatarFromSysMLSymbols.SETTIMERREQUEST_T); + } + case 406: break; + case 227: + { return makeSymbol(AvatarFromSysMLSymbols.TRIVIALREQUEST_T); + } + case 407: break; + case 231: + { return makeSymbol(AvatarFromSysMLSymbols.AVSTOPSTATE_T); + } + case 408: break; + case 156: + { return makeSymbol(AvatarFromSysMLSymbols.METADATA); + } + case 409: break; + case 145: + { return makeSymbol(AvatarFromSysMLSymbols.INDEX_F); + } + case 410: break; + case 81: + { return makeSymbol(AvatarFromSysMLSymbols.START_U); + } + case 411: break; + case 115: + { return makeSymbol(AvatarFromSysMLSymbols.POOL_F); + } + case 412: break; + case 71: + { return makeSymbol(AvatarFromSysMLSymbols.CASE); + } + case 413: break; + case 63: + { return makeSymbol(AvatarFromSysMLSymbols.ITEM); + } + case 414: break; + case 239: + { return makeSymbol(AvatarFromSysMLSymbols.AVTRANSITION_T); + } + case 415: break; + case 25: + { return makeSymbol(AvatarFromSysMLSymbols.DO); + } + case 416: break; + case 173: + { return makeSymbol(AvatarFromSysMLSymbols.VARIATION); + } + case 417: break; + case 191: + { return makeSymbol(AvatarFromSysMLSymbols.RELATION_F); + } + case 418: break; + case 200: + { return makeSymbol(AvatarFromSysMLSymbols.VERIFICATION); + } + case 419: break; + case 152: + { return makeSymbol(AvatarFromSysMLSymbols.ALLOCATE); + } + case 420: break; + case 169: + { return makeSymbol(AvatarFromSysMLSymbols.RENDERING); + } + case 421: break; + case 15: + { return makeSymbol(AvatarFromSysMLSymbols.AND); + } + case 422: break; + case 98: + { return makeSymbol(AvatarFromSysMLSymbols.DECIDE); + } + case 423: break; + case 78: + { return makeSymbol(AvatarFromSysMLSymbols.JOIN); + } + case 424: break; + case 7: + { return makeSymbol(AvatarFromSysMLSymbols.MINUS); + } + case 425: break; + case 109: + { return makeSymbol(AvatarFromSysMLSymbols.RENDER); + } + case 426: break; + case 64: + { return makeSymbol(AvatarFromSysMLSymbols.NULL); + } + case 427: break; + case 66: + { return makeSymbol(AvatarFromSysMLSymbols.FROM); + } + case 428: break; + case 20: + { return makeSymbol(AvatarFromSysMLSymbols.RPAR); + } + case 429: break; + case 165: + { return makeSymbol(AvatarFromSysMLSymbols.INTERFACE); + } + case 430: break; + case 224: + { return makeSymbol(AvatarFromSysMLSymbols.IDENT, new Ident(AvatarFromSysMLSyntax.PRESENDSTATENAME,yytext())); + } + case 431: break; + case 190: + { return makeSymbol(AvatarFromSysMLSymbols.CONNECTION); + } + case 432: break; + case 92: + { return makeSymbol(AvatarFromSysMLSymbols.EVENT); + } + case 433: break; + case 208: + { return makeSymbol(AvatarFromSysMLSymbols.SENDREQUEST_T); + } + case 434: break; + case 134: + { return makeSymbol(AvatarFromSysMLSymbols.CONCERN); + } + case 435: break; + case 238: + { return makeSymbol(AvatarFromSysMLSymbols.AVCOUNTSTATE_T); + } + case 436: break; + case 38: + { return makeSymbol(AvatarFromSysMLSymbols.DIF); + } + case 437: break; + case 91: + { return makeSymbol(AvatarFromSysMLSymbols.ENTRY); + } + case 438: break; + case 246: + { return makeSymbol(AvatarFromSysMLSymbols.AVPRESENDSTATE_T); + } + case 439: break; + case 213: + { return makeSymbol(AvatarFromSysMLSymbols.IDENT, new Ident(AvatarFromSysMLSyntax.RESETTIMERSTATENAME,yytext())); + } + case 440: break; + case 202: + { return makeSymbol(AvatarFromSysMLSymbols.IDENT, new Ident(AvatarFromSysMLSyntax.SETTIMERSTATENAME,yytext())); + } + case 441: break; + case 201: + { return makeSymbol(AvatarFromSysMLSymbols.IDENT, new Ident(AvatarFromSysMLSyntax.CHANNELNAME,yytext())); + } + case 442: break; + case 205: + { return makeSymbol(AvatarFromSysMLSymbols.ASSIGNMENT_T); + } + case 443: break; + case 182: + { return makeSymbol(AvatarFromSysMLSymbols.DEPENDENCY); + } + case 444: break; + case 5: + { return makeSymbol(AvatarFromSysMLSymbols.IDENT, new Ident(AvatarFromSysMLSyntax.AVATARNAME,yytext())); + } + case 445: break; + case 217: + { return makeSymbol(AvatarFromSysMLSymbols.BOUNDRANDOM_U); + } + case 446: break; + case 8: + { return makeSymbol(AvatarFromSysMLSymbols.GT); + } + case 447: break; + case 218: + { return makeSymbol(AvatarFromSysMLSymbols.IDENT, new Ident(AvatarFromSysMLSyntax.STANDARDSTATENAME,yytext())); + } + case 448: break; + case 149: + { return makeSymbol(AvatarFromSysMLSymbols.LANGUAGE); + } + case 449: break; + case 77: + { return makeSymbol(AvatarFromSysMLSymbols.REAL_T); + } + case 450: break; + case 204: + { return makeSymbol(AvatarFromSysMLSymbols.OUTMESSAGE_T); + } + case 451: break; + case 83: + { return makeSymbol(AvatarFromSysMLSymbols.FIRST); + } + case 452: break; + case 96: + { return makeSymbol(AvatarFromSysMLSymbols.SET_TM); + } + case 453: break; + case 223: + { return makeSymbol(AvatarFromSysMLSymbols.IDENT, new Ident(AvatarFromSysMLSyntax.RECEIVESTATENAME,yytext())); + } + case 454: break; + case 195: + { return makeSymbol(AvatarFromSysMLSymbols.STAKEHOLDER); + } + case 455: break; + case 185: + { return makeSymbol(AvatarFromSysMLSymbols.INDIVIDUAL); + } + case 456: break; + case 167: + { return makeSymbol(AvatarFromSysMLSymbols.ATTRIBUTE); + } + case 457: break; + case 95: + { return makeSymbol(AvatarFromSysMLSymbols.WHILE); + } + case 458: break; + case 3: + { try { return makeSymbol(AvatarFromSysMLSymbols.INT, Integer.parseInt(yytext())); } + catch (NumberFormatException nfe) { + setErrorLocation(new Location(yyline, yycolumn)); + throw new Exception ("lexing : bad format for number : " + yytext()); } + } + case 459: break; + case 251: + { return makeSymbol(AvatarFromSysMLSymbols.AVRESETTIMERSTATE_T); + } + case 460: break; + case 119: + { return makeSymbol(AvatarFromSysMLSymbols.DEFAULT); + } + case 461: break; + case 87: + { return makeSymbol(AvatarFromSysMLSymbols.ALIAS); + } + case 462: break; + case 2: + { break; + } + case 463: break; + case 219: + { return makeSymbol(AvatarFromSysMLSymbols.IDENT, new Ident(AvatarFromSysMLSyntax.PRESETTIMERSTATENAME,yytext())); + } + case 464: break; + case 50: + { return makeSymbol(AvatarFromSysMLSymbols.REP); + } + case 465: break; + case 141: + { return makeSymbol(AvatarFromSysMLSymbols.DELAY_F); + } + case 466: break; + case 9: + { return makeSymbol(AvatarFromSysMLSymbols.LT); + } + case 467: break; + case 39: + { return makeSymbol(AvatarFromSysMLSymbols.EQ); + } + case 468: break; + case 241: + { return makeSymbol(AvatarFromSysMLSymbols.IDENT, new Ident(AvatarFromSysMLSyntax.PRERECEIVESTATENAME,yytext())); + } + case 469: break; + case 45: + { return makeSymbol(AvatarFromSysMLSymbols.DEF); + } + case 470: break; + case 143: + { return makeSymbol(AvatarFromSysMLSymbols.IDENT, new Ident(AvatarFromSysMLSyntax.BLOCKNAME,yytext())); + } + case 471: break; + case 73: + { return makeSymbol(AvatarFromSysMLSymbols.ENUM); + } + case 472: break; + case 198: + { return makeSymbol(AvatarFromSysMLSymbols.BFIFOREL_T); + } + case 473: break; + case 127: + { return makeSymbol(AvatarFromSysMLSymbols.IMPLIES); + } + case 474: break; + case 230: + { return makeSymbol(AvatarFromSysMLSymbols.INSIGNALBINDING_T); + } + case 475: break; + case 74: + { return makeSymbol(AvatarFromSysMLSymbols.EXIT); + } + case 476: break; + case 136: + { return makeSymbol(AvatarFromSysMLSymbols.HASTYPE); + } + case 477: break; + case 240: + { return makeSymbol(AvatarFromSysMLSymbols.AVVOIDMETHOD_T); + } + case 478: break; + case 107: + { return makeSymbol(AvatarFromSysMLSymbols.ACCEPT); + } + case 479: break; + case 129: + { return makeSymbol(AvatarFromSysMLSymbols.ORDERED); + } + case 480: break; + case 216: + { return makeSymbol(AvatarFromSysMLSymbols.STATEMACHINE); + } + case 481: break; + case 99: + { return makeSymbol(AvatarFromSysMLSymbols.STRING_T); + } + case 482: break; + case 49: + { return makeSymbol(AvatarFromSysMLSymbols.REF); + } + case 483: break; + case 199: + { return makeSymbol(AvatarFromSysMLSymbols.INMESSAGE_T); + } + case 484: break; + case 80: + { return makeSymbol(AvatarFromSysMLSymbols.STATE); + } + case 485: break; + case 90: + { return makeSymbol(AvatarFromSysMLSymbols.ACTOR); + } + case 486: break; + case 220: + { return makeSymbol(AvatarFromSysMLSymbols.IDENT, new Ident(AvatarFromSysMLSyntax.EXPIRETIMERSTATENAME,yytext())); + } + case 487: break; + case 126: + { return makeSymbol(AvatarFromSysMLSymbols.INCLUDE); + } + case 488: break; + case 113: + { return makeSymbol(AvatarFromSysMLSymbols.IDENT, new Ident(AvatarFromSysMLSyntax.CHANNELPRENAME,yytext())); + } + case 489: break; + case 120: + { return makeSymbol(AvatarFromSysMLSymbols.DERIVED); + } + case 490: break; + case 123: + { return makeSymbol(AvatarFromSysMLSymbols.SATISFY); + } + case 491: break; + case 168: + { return makeSymbol(AvatarFromSysMLSymbols.REDEFINES); + } + case 492: break; + case 110: + { return makeSymbol(AvatarFromSysMLSymbols.PUBLIC); + } + case 493: break; + case 192: + { return makeSymbol(AvatarFromSysMLSymbols.MAXSIZE_F); + } + case 494: break; + case 188: + { return makeSymbol(AvatarFromSysMLSymbols.OCCURRENCE); + } + case 495: break; + case 35: + { return makeSymbol(AvatarFromSysMLSymbols.AS); + } + case 496: break; + case 131: + { return makeSymbol(AvatarFromSysMLSymbols.PRIVATE); + } + case 497: break; + case 88: + { return makeSymbol(AvatarFromSysMLSymbols.ASSOC); + } + case 498: break; + case 211: + { return makeSymbol(AvatarFromSysMLSymbols.AVBLOCK_T); + } + case 499: break; + case 151: + { return makeSymbol(AvatarFromSysMLSymbols.ABSTRACT); + } + case 500: break; + case 124: + { return makeSymbol(AvatarFromSysMLSymbols.SUBSETS); + } + case 501: break; + case 249: + { return makeSymbol(AvatarFromSysMLSymbols.DISTRIBUTION_A); + } + case 502: break; + case 106: + { return makeSymbol(AvatarFromSysMLSymbols.ACTION); + } + case 503: break; + case 215: + { return makeSymbol(AvatarFromSysMLSymbols.STATEACTION_F); + } + case 504: break; + case 214: + { return makeSymbol(AvatarFromSysMLSymbols.IDENT, new Ident(AvatarFromSysMLSyntax.COUNTSTATENAME,yytext())); + } + case 505: break; + case 62: + { return makeSymbol(AvatarFromSysMLSymbols.SEND); + } + case 506: break; + case 157: + { return makeSymbol(AvatarFromSysMLSymbols.TARGET_F); + } + case 507: break; + case 164: + { return makeSymbol(AvatarFromSysMLSymbols.TIMESLICE); + } + case 508: break; + case 31: + { return makeSymbol(AvatarFromSysMLSymbols.LEQ); + } + case 509: break; + case 75: + { return makeSymbol(AvatarFromSysMLSymbols.VIEW); + } + case 510: break; + default: + if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { + zzAtEOF = true; + zzDoEOF(); + { return makeSymbol(AvatarFromSysMLSymbols.EOF); + } + } + else { + zzScanError(ZZ_NO_MATCH); + } + } + } + } + + +} diff --git a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLParser.java b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLParser.java new file mode 100644 index 0000000000000000000000000000000000000000..61a38dda95cacaa1ca223a6fc5738002822f1174 --- /dev/null +++ b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLParser.java @@ -0,0 +1,6524 @@ + +//---------------------------------------------------- +// The following code was generated by CUP v0.11b 20210814 (GIT d69c832) +//---------------------------------------------------- + +package avatartranslator.tosysmlv2; + +import java_cup.runtime.*; +import java.util.ArrayList; +import java.util.HashMap; +import avatartranslator.tosysmlv2.AvatarFromSysMLSyntax.*; +import java.util.function.BiConsumer; +import static java.lang.System.out; +import java_cup.runtime.ComplexSymbolFactory.Location; +import java_cup.runtime.XMLElement; + +/** CUP v0.11b 20210814 (GIT d69c832) generated parser. + */ +@SuppressWarnings("unused") +public class AvatarFromSysMLParser extends java_cup.runtime.lr_parser { + + @Override + public final Class<?> getSymbolContainer() { + return AvatarFromSysMLSymbols.class; +} + + /** Default constructor. */ + @Deprecated + public AvatarFromSysMLParser() {super();} + + /** Constructor which sets the default scanner. */ + @Deprecated + public AvatarFromSysMLParser(java_cup.runtime.Scanner s) {super(s);} + + /** Constructor which sets the default scanner. */ + public AvatarFromSysMLParser(java_cup.runtime.Scanner s, java_cup.runtime.SymbolFactory sf) {super(s,sf);} + + /** Production table. */ + protected static final short _production_table[][] = + unpackFromStrings(new String[] { + "\000\u0146\000\002\004\007\000\002\002\004\000\002\004" + + "\006\000\002\005\003\000\002\005\004\000\002\006\004" + + "\000\002\006\004\000\002\006\003\000\002\006\003\000" + + "\002\006\003\000\002\006\003\000\002\006\003\000\002" + + "\006\003\000\002\006\003\000\002\002\003\000\002\002" + + "\003\000\002\002\003\000\002\007\003\000\002\007\003" + + "\000\002\010\003\000\002\010\003\000\002\011\013\000" + + "\002\012\003\000\002\012\005\000\002\013\006\000\002" + + "\013\005\000\002\014\007\000\002\015\003\000\002\015" + + "\004\000\002\016\005\000\002\101\006\000\002\102\002" + + "\000\002\102\004\000\002\102\005\000\002\017\003\000" + + "\002\017\003\000\002\017\003\000\002\020\006\000\002" + + "\032\011\000\002\021\006\000\002\033\011\000\002\022" + + "\006\000\002\034\011\000\002\023\003\000\002\023\005" + + "\000\002\024\003\000\002\024\003\000\002\024\003\000" + + "\002\024\003\000\002\024\003\000\002\025\005\000\002" + + "\026\005\000\002\027\005\000\002\030\005\000\002\031" + + "\005\000\002\035\003\000\002\035\003\000\002\035\003" + + "\000\002\036\016\000\002\037\016\000\002\040\016\000" + + "\002\041\003\000\002\041\003\000\002\042\014\000\002" + + "\042\014\000\002\043\014\000\002\043\014\000\002\044" + + "\003\000\002\044\003\000\002\045\004\000\002\053\010" + + "\000\002\047\004\000\002\047\005\000\002\047\005\000" + + "\002\050\012\000\002\050\010\000\002\046\004\000\002" + + "\046\005\000\002\046\005\000\002\054\011\000\002\054" + + "\011\000\002\051\004\000\002\051\004\000\002\052\007" + + "\000\002\055\004\000\002\055\004\000\002\056\007\000" + + "\002\057\004\000\002\057\004\000\002\060\003\000\002" + + "\060\003\000\002\060\003\000\002\060\003\000\002\060" + + "\003\000\002\060\003\000\002\060\003\000\002\061\004" + + "\000\002\061\006\000\002\061\007\000\002\063\006\000" + + "\002\062\004\000\002\062\006\000\002\100\007\000\002" + + "\064\003\000\002\064\003\000\002\065\005\000\002\065" + + "\004\000\002\065\006\000\002\076\006\000\002\066\005" + + "\000\002\066\006\000\002\077\006\000\002\067\003\000" + + "\002\067\004\000\002\070\003\000\002\070\006\000\002" + + "\071\007\000\002\071\007\000\002\072\013\000\002\072" + + "\007\000\002\073\006\000\002\073\005\000\002\073\004" + + "\000\002\171\007\000\002\074\003\000\002\074\004\000" + + "\002\075\003\000\002\075\003\000\002\103\003\000\002" + + "\103\003\000\002\103\003\000\002\103\003\000\002\103" + + "\003\000\002\103\003\000\002\103\003\000\002\103\003" + + "\000\002\103\003\000\002\103\003\000\002\103\003\000" + + "\002\103\003\000\002\104\004\000\002\104\010\000\002" + + "\104\011\000\002\155\007\000\002\105\004\000\002\105" + + "\010\000\002\105\011\000\002\156\006\000\002\106\004" + + "\000\002\106\010\000\002\157\007\000\002\107\004\000" + + "\002\107\010\000\002\107\011\000\002\160\006\000\002" + + "\110\004\000\002\110\010\000\002\110\011\000\002\161" + + "\006\000\002\111\013\000\002\111\013\000\002\111\011" + + "\000\002\162\006\000\002\112\011\000\002\112\013\000" + + "\002\112\013\000\002\163\006\000\002\113\011\000\002" + + "\164\006\000\002\114\011\000\002\165\006\000\002\115" + + "\011\000\002\115\010\000\002\115\004\000\002\166\006" + + "\000\002\116\011\000\002\116\010\000\002\116\004\000" + + "\002\167\006\000\002\117\011\000\002\117\010\000\002" + + "\117\004\000\002\170\006\000\002\120\010\000\002\120" + + "\007\000\002\120\011\000\002\120\005\000\002\121\005" + + "\000\002\122\003\000\002\122\005\000\002\123\014\000" + + "\002\123\004\000\002\227\002\000\002\124\003\000\002" + + "\124\003\000\002\124\003\000\002\124\003\000\002\124" + + "\003\000\002\124\003\000\002\125\003\000\002\125\005" + + "\000\002\147\004\000\002\130\005\000\002\150\004\000" + + "\002\131\005\000\002\151\004\000\002\132\005\000\002" + + "\152\004\000\002\133\005\000\002\153\004\000\002\134" + + "\005\000\002\154\004\000\002\126\003\000\002\126\005" + + "\000\002\127\003\000\002\127\003\000\002\127\003\000" + + "\002\127\003\000\002\127\003\000\002\127\003\000\002" + + "\127\003\000\002\135\005\000\002\136\005\000\002\226" + + "\003\000\002\137\003\000\002\137\003\000\002\141\010" + + "\000\002\142\007\000\002\142\006\000\002\142\004\000" + + "\002\142\007\000\002\142\006\000\002\172\004\000\002" + + "\143\005\000\002\144\007\000\002\145\007\000\002\146" + + "\007\000\002\204\003\000\002\204\005\000\002\174\005" + + "\000\002\212\003\000\002\213\003\000\002\213\005\000" + + "\002\173\012\000\002\173\012\000\002\175\005\000\002" + + "\140\010\000\002\176\012\000\002\176\012\000\002\177" + + "\011\000\002\200\006\000\002\200\007\000\002\200\010" + + "\000\002\200\011\000\002\205\007\000\002\205\013\000" + + "\002\201\005\000\002\201\006\000\002\201\005\000\002" + + "\201\006\000\002\214\006\000\002\215\006\000\002\207" + + "\010\000\002\207\006\000\002\202\007\000\002\202\005" + + "\000\002\203\007\000\002\203\006\000\002\211\003\000" + + "\002\003\003\000\002\210\004\000\002\210\004\000\002" + + "\216\013\000\002\217\010\000\002\217\006\000\002\220" + + "\006\000\002\220\004\000\002\221\012\000\002\206\004" + + "\000\002\206\005\000\002\222\003\000\002\222\003\000" + + "\002\222\003\000\002\223\010\000\002\224\010\000\002" + + "\224\010\000\002\225\010\000\002\225\010\000\002\230" + + "\003\000\002\230\003\000\002\230\003\000\002\231\003" + + "\000\002\233\003\000\002\233\003\000\002\234\005\000" + + "\002\234\005\000\002\234\005\000\002\234\005\000\002" + + "\234\005\000\002\234\004\000\002\234\005\000\002\234" + + "\005\000\002\234\004\000\002\234\005\000\002\234\005" + + "\000\002\234\005\000\002\234\005\000\002\234\005\000" + + "\002\234\005\000\002\234\005\000\002\234\003\000\002" + + "\234\003\000\002\235\003\000\002\235\005\000\002\232" + + "\004\000\002\232\005\000\002\236\004\000\002\243\003" + + "\000\002\243\005\000\002\240\003\000\002\237\003\000" + + "\002\237\003\000\002\237\003\000\002\241\004\000\002" + + "\241\005\000\002\242\004" }); + + /** Access to production table. */ + @Override + public short[][] production_table() {return _production_table;} + + /** Parse-action table. */ + protected static final short[][] _action_table = + unpackFromStrings(new String[] { + "\000\u0338\000\004\260\005\001\002\000\004\002\u033a\001" + + "\002\000\004\141\006\001\002\000\004\014\007\001\002" + + "\000\016\015\031\164\020\166\041\262\047\265\014\267" + + "\025\001\002\000\016\015\ufff4\164\ufff4\166\ufff4\262\ufff4" + + "\265\ufff4\267\ufff4\001\002\000\016\015\ufff7\164\ufff7\166" + + "\ufff7\262\ufff7\265\ufff7\267\ufff7\001\002\000\016\015\uffdd" + + "\164\uffdd\166\uffdd\262\uffdd\265\uffdd\267\uffdd\001\002\000" + + "\016\015\uffde\164\uffde\166\uffde\262\uffde\265\uffde\267\uffde" + + "\001\002\000\004\232\u0339\001\002\000\016\015\uffbe\164" + + "\uffbe\166\uffbe\262\uffbe\265\uffbe\267\uffbe\001\002\000\014" + + "\025\u031b\026\u031e\027\u0315\031\u031c\032\u0314\001\002\000" + + "\016\015\uffc4\164\uffc4\166\uffc4\262\uffc4\265\uffc4\267\uffc4" + + "\001\002\000\004\201\u0332\001\002\000\016\015\ufffe\164" + + "\020\166\041\262\047\265\014\267\025\001\002\000\014" + + "\025\u031b\026\u031e\027\u0315\031\u031c\032\u0314\001\002\000" + + "\016\015\uffc9\164\uffc9\166\uffc9\262\uffc9\265\uffc9\267\uffc9" + + "\001\002\000\016\015\ufff9\164\ufff9\166\ufff9\262\ufff9\265" + + "\ufff9\267\ufff9\001\002\000\004\232\u032d\001\002\000\016" + + "\015\uffca\164\uffca\166\uffca\262\uffca\265\uffca\267\uffca\001" + + "\002\000\016\015\uffc3\164\uffc3\166\uffc3\262\uffc3\265\uffc3" + + "\267\uffc3\001\002\000\016\015\uffc8\164\uffc8\166\uffc8\262" + + "\uffc8\265\uffc8\267\uffc8\001\002\000\004\002\uffff\001\002" + + "\000\016\015\uffbd\164\uffbd\166\uffbd\262\uffbd\265\uffbd\267" + + "\uffbd\001\002\000\014\025\u031b\026\u031e\027\u0315\031\u031c" + + "\032\u0314\001\002\000\006\014\u0308\017\u0307\001\002\000" + + "\016\015\ufff6\164\ufff6\166\ufff6\262\ufff6\265\ufff6\267\ufff6" + + "\001\002\000\016\015\ufffa\164\ufffa\166\ufffa\262\ufffa\265" + + "\ufffa\267\ufffa\001\002\000\006\164\277\265\u02f7\001\002" + + "\000\004\014\u02f0\001\002\000\004\020\u02d5\001\002\000" + + "\020\015\164\145\172\164\157\171\163\215\154\262\201" + + "\270\156\001\002\000\004\015\152\001\002\000\016\015" + + "\ufff5\164\ufff5\166\ufff5\262\ufff5\265\ufff5\267\ufff5\001\002" + + "\000\016\015\uffdf\164\uffdf\166\uffdf\262\uffdf\265\uffdf\267" + + "\uffdf\001\002\000\016\015\ufff8\164\ufff8\166\ufff8\262\ufff8" + + "\265\ufff8\267\ufff8\001\002\000\006\141\051\201\050\001" + + "\002\000\004\141\136\001\002\000\004\020\052\001\002" + + "\000\020\050\060\051\061\052\056\057\054\060\057\061" + + "\053\101\055\001\002\000\004\022\126\001\002\000\004" + + "\022\116\001\002\000\010\014\104\311\106\333\105\001" + + "\002\000\004\022\100\001\002\000\004\022\070\001\002" + + "\000\004\022\065\001\002\000\004\022\062\001\002\000" + + "\004\051\063\001\002\000\004\012\064\001\002\000\014" + + "\025\uffd7\026\uffd7\027\uffd7\031\uffd7\032\uffd7\001\002\000" + + "\004\050\066\001\002\000\004\012\067\001\002\000\014" + + "\025\uffdb\026\uffdb\027\uffdb\031\uffdb\032\uffdb\001\002\000" + + "\004\060\071\001\002\000\004\012\072\001\002\000\004" + + "\030\073\001\002\000\004\022\074\001\002\000\004\141" + + "\075\001\002\000\004\013\076\001\002\000\004\017\077" + + "\001\002\000\016\015\uffc6\164\uffc6\166\uffc6\262\uffc6\265" + + "\uffc6\267\uffc6\001\002\000\004\052\101\001\002\000\004" + + "\012\102\001\002\000\014\025\uffd9\026\uffd9\027\uffd9\031" + + "\uffd9\032\uffd9\001\002\000\004\141\110\001\002\000\020" + + "\015\uffab\145\uffab\164\uffab\171\uffab\215\uffab\262\uffab\270" + + "\uffab\001\002\000\004\141\uffed\001\002\000\004\141\uffee" + + "\001\002\000\004\022\113\001\002\000\010\017\uffeb\021" + + "\111\022\uffeb\001\002\000\004\141\110\001\002\000\006" + + "\017\uffea\022\uffea\001\002\000\004\141\110\001\002\000" + + "\004\017\115\001\002\000\016\015\uffec\164\uffec\166\uffec" + + "\262\uffec\265\uffec\267\uffec\001\002\000\004\057\117\001" + + "\002\000\004\012\120\001\002\000\004\030\121\001\002" + + "\000\004\022\122\001\002\000\004\141\123\001\002\000" + + "\004\013\124\001\002\000\004\017\125\001\002\000\016" + + "\015\uffc5\164\uffc5\166\uffc5\262\uffc5\265\uffc5\267\uffc5\001" + + "\002\000\004\061\127\001\002\000\004\012\130\001\002" + + "\000\004\030\131\001\002\000\004\022\132\001\002\000" + + "\004\141\133\001\002\000\004\013\134\001\002\000\004" + + "\017\135\001\002\000\016\015\uffc7\164\uffc7\166\uffc7\262" + + "\uffc7\265\uffc7\267\uffc7\001\002\000\006\305\137\333\141" + + "\001\002\000\012\053\ufff0\054\ufff0\100\ufff0\141\ufff0\001" + + "\002\000\010\053\142\054\144\141\143\001\002\000\012" + + "\053\uffef\054\uffef\100\uffef\141\uffef\001\002\000\004\014" + + "\151\001\002\000\004\016\147\001\002\000\004\016\145" + + "\001\002\000\004\141\146\001\002\000\006\014\uffb2\017" + + "\uffb2\001\002\000\004\054\150\001\002\000\006\014\uffb1" + + "\017\uffb1\001\002\000\006\164\uffbb\265\uffbb\001\002\000" + + "\004\002\001\001\002\000\020\015\uff99\145\uff99\164\uff99" + + "\171\uff99\215\uff99\262\uff99\270\uff99\001\002\000\004\307" + + "\u02d1\001\002\000\020\015\uffa3\145\uffa3\164\uffa3\171\uffa3" + + "\215\uffa3\262\uffa3\270\uffa3\001\002\000\004\164\u02cd\001" + + "\002\000\004\141\u02ca\001\002\000\020\015\uffa4\145\uffa4" + + "\164\uffa4\171\uffa4\215\uffa4\262\uffa4\270\uffa4\001\002\000" + + "\010\017\u02c3\023\u02c4\202\u02c2\001\002\000\020\015\uffa7" + + "\145\uffa7\164\uffa7\171\uffa7\215\uffa7\262\uffa7\270\uffa7\001" + + "\002\000\004\141\u02bf\001\002\000\026\015\uffad\145\uffad" + + "\164\uffad\166\uffad\171\uffad\215\uffad\262\uffad\265\uffad\267" + + "\uffad\270\uffad\001\002\000\004\014\u02b4\001\002\000\020" + + "\015\u02b2\145\172\164\157\171\163\215\154\262\201\270" + + "\156\001\002\000\020\015\uffa6\145\uffa6\164\uffa6\171\uffa6" + + "\215\uffa6\262\uffa6\270\uffa6\001\002\000\026\015\uffac\145" + + "\uffac\164\uffac\166\uffac\171\uffac\215\uffac\262\uffac\265\uffac" + + "\267\uffac\270\uffac\001\002\000\020\015\uff9a\145\uff9a\164" + + "\uff9a\171\uff9a\215\uff9a\262\uff9a\270\uff9a\001\002\000\004" + + "\141\u02af\001\002\000\020\015\uffa5\145\uffa5\164\uffa5\171" + + "\uffa5\215\uffa5\262\uffa5\270\uffa5\001\002\000\006\014\323" + + "\017\322\001\002\000\006\014\275\017\274\001\002\000" + + "\020\015\uffa8\145\uffa8\164\uffa8\171\uffa8\215\uffa8\262\uffa8" + + "\270\uffa8\001\002\000\006\017\220\023\221\001\002\000" + + "\020\015\uffa2\145\uffa2\164\uffa2\171\uffa2\215\uffa2\262\uffa2" + + "\270\uffa2\001\002\000\004\141\202\001\002\000\004\020" + + "\203\001\002\000\012\055\206\056\204\101\205\133\207" + + "\001\002\000\004\017\217\001\002\000\004\014\104\001" + + "\002\000\004\017\216\001\002\000\006\017\210\022\211" + + "\001\002\000\020\015\uff8a\145\uff8a\164\uff8a\171\uff8a\215" + + "\uff8a\262\uff8a\270\uff8a\001\002\000\004\133\212\001\002" + + "\000\004\012\213\001\002\000\004\013\214\001\002\000" + + "\004\017\215\001\002\000\020\015\uff8b\145\uff8b\164\uff8b" + + "\171\uff8b\215\uff8b\262\uff8b\270\uff8b\001\002\000\020\015" + + "\uff8c\145\uff8c\164\uff8c\171\uff8c\215\uff8c\262\uff8c\270\uff8c" + + "\001\002\000\020\015\uff8d\145\uff8d\164\uff8d\171\uff8d\215" + + "\uff8d\262\uff8d\270\uff8d\001\002\000\020\015\uff9d\145\uff9d" + + "\164\uff9d\171\uff9d\215\uff9d\262\uff9d\270\uff9d\001\002\000" + + "\016\004\223\005\225\012\227\141\224\251\232\336\222" + + "\001\002\000\016\004\223\005\225\012\227\141\224\251" + + "\232\336\222\001\002\000\044\011\ufecb\013\ufecb\016\ufecb" + + "\017\ufecb\024\ufecb\155\ufecb\255\ufecb\335\ufecb\336\ufecb\337" + + "\ufecb\340\ufecb\341\ufecb\342\ufecb\343\ufecb\344\ufecb\345\ufecb" + + "\346\ufecb\001\002\000\046\011\ufec9\013\ufec9\016\ufec9\017" + + "\ufec9\021\271\024\ufec9\155\ufec9\255\ufec9\335\ufec9\336\ufec9" + + "\337\ufec9\340\ufec9\341\ufec9\342\ufec9\343\ufec9\344\ufec9\345" + + "\ufec9\346\ufec9\001\002\000\044\011\ufeca\013\ufeca\016\ufeca" + + "\017\ufeca\024\ufeca\155\ufeca\255\ufeca\335\ufeca\336\ufeca\337" + + "\ufeca\340\ufeca\341\ufeca\342\ufeca\343\ufeca\344\ufeca\345\ufeca" + + "\346\ufeca\001\002\000\044\011\ufedc\013\ufedc\016\ufedc\017" + + "\ufedc\024\ufedc\155\ufedc\255\ufedc\335\ufedc\336\ufedc\337\ufedc" + + "\340\ufedc\341\ufedc\342\ufedc\343\ufedc\344\ufedc\345\ufedc\346" + + "\ufedc\001\002\000\016\004\223\005\225\012\227\141\224" + + "\251\232\336\222\001\002\000\036\011\242\017\266\155" + + "\235\255\247\335\241\336\234\337\236\340\243\341\237" + + "\342\240\343\246\344\244\345\250\346\245\001\002\000" + + "\044\011\ufedd\013\ufedd\016\ufedd\017\ufedd\024\ufedd\155\ufedd" + + "\255\ufedd\335\ufedd\336\ufedd\337\ufedd\340\ufedd\341\ufedd\342" + + "\ufedd\343\ufedd\344\ufedd\345\ufedd\346\ufedd\001\002\000\016" + + "\004\223\005\225\012\227\141\224\251\232\336\222\001" + + "\002\000\044\011\242\013\ufed3\016\ufed3\017\ufed3\024\ufed3" + + "\155\ufed3\255\ufed3\335\241\336\234\337\236\340\243\341" + + "\237\342\240\343\246\344\244\345\250\346\245\001\002" + + "\000\016\004\223\005\225\012\227\141\224\251\232\336" + + "\222\001\002\000\016\004\223\005\225\012\227\141\224" + + "\251\232\336\222\001\002\000\016\004\223\005\225\012" + + "\227\141\224\251\232\336\222\001\002\000\016\004\223" + + "\005\225\012\227\141\224\251\232\336\222\001\002\000" + + "\016\004\223\005\225\012\227\141\224\251\232\336\222" + + "\001\002\000\016\004\223\005\225\012\227\141\224\251" + + "\232\336\222\001\002\000\016\004\223\005\225\012\227" + + "\141\224\251\232\336\222\001\002\000\016\004\223\005" + + "\225\012\227\141\224\251\232\336\222\001\002\000\016" + + "\004\223\005\225\012\227\141\224\251\232\336\222\001" + + "\002\000\016\004\223\005\225\012\227\141\224\251\232" + + "\336\222\001\002\000\016\004\223\005\225\012\227\141" + + "\224\251\232\336\222\001\002\000\016\004\223\005\225" + + "\012\227\141\224\251\232\336\222\001\002\000\016\004" + + "\223\005\225\012\227\141\224\251\232\336\222\001\002" + + "\000\034\011\ufed0\013\ufed0\016\ufed0\017\ufed0\024\ufed0\155" + + "\ufed0\255\ufed0\335\241\336\234\337\236\340\243\341\237" + + "\342\ufed0\001\002\000\044\011\242\013\ufed5\016\ufed5\017" + + "\ufed5\024\ufed5\155\235\255\ufed5\335\241\336\234\337\236" + + "\340\243\341\237\342\240\343\246\344\244\345\250\346" + + "\245\001\002\000\034\011\ufed2\013\ufed2\016\ufed2\017\ufed2" + + "\024\ufed2\155\ufed2\255\ufed2\335\241\336\234\337\236\340" + + "\243\341\237\342\ufed2\001\002\000\034\011\ufecf\013\ufecf" + + "\016\ufecf\017\ufecf\024\ufecf\155\ufecf\255\ufecf\335\241\336" + + "\234\337\236\340\243\341\237\342\ufecf\001\002\000\034" + + "\011\ufed1\013\ufed1\016\ufed1\017\ufed1\024\ufed1\155\ufed1\255" + + "\ufed1\335\241\336\234\337\236\340\243\341\237\342\ufed1" + + "\001\002\000\044\011\ufed8\013\ufed8\016\ufed8\017\ufed8\024" + + "\ufed8\155\ufed8\255\ufed8\335\ufed8\336\ufed8\337\ufed8\340\ufed8" + + "\341\ufed8\342\ufed8\343\ufed8\344\ufed8\345\ufed8\346\ufed8\001" + + "\002\000\044\011\ufece\013\ufece\016\ufece\017\ufece\024\ufece" + + "\155\ufece\255\ufece\335\241\336\234\337\236\340\243\341" + + "\237\342\ufece\343\246\344\244\345\250\346\245\001\002" + + "\000\044\011\ufedb\013\ufedb\016\ufedb\017\ufedb\024\ufedb\155" + + "\ufedb\255\ufedb\335\ufedb\336\ufedb\337\236\340\243\341\237" + + "\342\ufedb\343\ufedb\344\ufedb\345\ufedb\346\ufedb\001\002\000" + + "\044\011\ufecd\013\ufecd\016\ufecd\017\ufecd\024\ufecd\155\ufecd" + + "\255\ufecd\335\241\336\234\337\236\340\243\341\237\342" + + "\ufecd\343\246\344\244\345\250\346\245\001\002\000\044" + + "\011\ufed7\013\ufed7\016\ufed7\017\ufed7\024\ufed7\155\ufed7\255" + + "\ufed7\335\ufed7\336\ufed7\337\ufed7\340\ufed7\341\ufed7\342\ufed7" + + "\343\ufed7\344\ufed7\345\ufed7\346\ufed7\001\002\000\044\011" + + "\ufed9\013\ufed9\016\ufed9\017\ufed9\024\ufed9\155\ufed9\255\ufed9" + + "\335\ufed9\336\ufed9\337\ufed9\340\ufed9\341\ufed9\342\ufed9\343" + + "\ufed9\344\ufed9\345\ufed9\346\ufed9\001\002\000\044\011\242" + + "\013\ufed4\016\ufed4\017\ufed4\024\ufed4\155\ufed4\255\ufed4\335" + + "\241\336\234\337\236\340\243\341\237\342\240\343\246" + + "\344\244\345\250\346\245\001\002\000\044\011\ufeda\013" + + "\ufeda\016\ufeda\017\ufeda\024\ufeda\155\ufeda\255\ufeda\335\ufeda" + + "\336\ufeda\337\236\340\243\341\237\342\ufeda\343\ufeda\344" + + "\ufeda\345\ufeda\346\ufeda\001\002\000\020\015\uff9c\145\uff9c" + + "\164\uff9c\171\uff9c\215\uff9c\262\uff9c\270\uff9c\001\002\000" + + "\036\011\242\013\270\155\235\255\247\335\241\336\234" + + "\337\236\340\243\341\237\342\240\343\246\344\244\345" + + "\250\346\245\001\002\000\044\011\ufecc\013\ufecc\016\ufecc" + + "\017\ufecc\024\ufecc\155\ufecc\255\ufecc\335\ufecc\336\ufecc\337" + + "\ufecc\340\ufecc\341\ufecc\342\ufecc\343\ufecc\344\ufecc\345\ufecc" + + "\346\ufecc\001\002\000\004\141\224\001\002\000\044\011" + + "\ufec8\013\ufec8\016\ufec8\017\ufec8\024\ufec8\155\ufec8\255\ufec8" + + "\335\ufec8\336\ufec8\337\ufec8\340\ufec8\341\ufec8\342\ufec8\343" + + "\ufec8\344\ufec8\345\ufec8\346\ufec8\001\002\000\044\011\ufed6" + + "\013\ufed6\016\ufed6\017\ufed6\024\ufed6\155\ufed6\255\ufed6\335" + + "\ufed6\336\ufed6\337\ufed6\340\ufed6\341\ufed6\342\ufed6\343\ufed6" + + "\344\ufed6\345\ufed6\346\ufed6\001\002\000\020\015\uff97\145" + + "\uff97\164\uff97\171\uff97\215\uff97\262\uff97\270\uff97\001\002" + + "\000\006\015\300\164\277\001\002\000\004\015\321\001" + + "\002\000\004\141\313\001\002\000\020\015\uff98\145\uff98" + + "\164\uff98\171\uff98\215\uff98\262\uff98\270\uff98\001\002\000" + + "\010\015\uffe6\164\277\265\uffe6\001\002\000\010\017\uffe2" + + "\023\304\202\303\001\002\000\004\023\310\001\002\000" + + "\016\004\223\005\225\012\227\141\224\251\232\336\222" + + "\001\002\000\004\017\306\001\002\000\012\015\uffe4\164" + + "\uffe4\265\uffe4\301\uffe4\001\002\000\036\011\242\017\uffe1" + + "\155\235\255\247\335\241\336\234\337\236\340\243\341" + + "\237\342\240\343\246\344\244\345\250\346\245\001\002" + + "\000\016\004\223\005\225\012\227\141\224\251\232\336" + + "\222\001\002\000\036\011\242\017\uffe0\155\235\255\247" + + "\335\241\336\234\337\236\340\243\341\237\342\240\343" + + "\246\344\244\345\250\346\245\001\002\000\006\015\uffe5" + + "\265\uffe5\001\002\000\004\020\314\001\002\000\010\074" + + "\320\075\317\141\316\001\002\000\010\017\uffe3\023\uffe3" + + "\202\uffe3\001\002\000\010\017\ufff1\023\ufff1\202\ufff1\001" + + "\002\000\010\017\ufff3\023\ufff3\202\ufff3\001\002\000\010" + + "\017\ufff2\023\ufff2\202\ufff2\001\002\000\020\015\uff96\145" + + "\uff96\164\uff96\171\uff96\215\uff96\262\uff96\270\uff96\001\002" + + "\000\020\015\uff87\145\uff87\164\uff87\171\uff87\215\uff87\262" + + "\uff87\270\uff87\001\002\000\014\015\344\212\353\216\324" + + "\307\356\316\365\001\002\000\004\145\u02ab\001\002\000" + + "\004\022\u0289\001\002\000\014\015\uff7c\212\uff7c\216\uff7c" + + "\307\uff7c\316\uff7c\001\002\000\014\015\uff77\212\uff77\216" + + "\uff77\307\uff77\316\uff77\001\002\000\006\017\u0280\022\u0281" + + "\001\002\000\014\015\uff7f\212\uff7f\216\uff7f\307\uff7f\316" + + "\uff7f\001\002\000\004\022\u0258\001\002\000\006\017\u024f" + + "\022\u0250\001\002\000\014\015\uff83\212\uff83\216\uff83\307" + + "\uff83\316\uff83\001\002\000\006\206\u01dc\313\u01de\001\002" + + "\000\014\015\uff78\212\uff78\216\uff78\307\uff78\316\uff78\001" + + "\002\000\014\015\uff80\212\uff80\216\uff80\307\uff80\316\uff80" + + "\001\002\000\014\015\uff81\212\uff81\216\uff81\307\uff81\316" + + "\uff81\001\002\000\014\015\uff79\212\uff79\216\uff79\307\uff79" + + "\316\uff79\001\002\000\006\017\u01c4\022\u01c5\001\002\000" + + "\014\015\uff76\212\uff76\216\uff76\307\uff76\316\uff76\001\002" + + "\000\020\015\uff88\145\uff88\164\uff88\171\uff88\215\uff88\262" + + "\uff88\270\uff88\001\002\000\004\015\u01c3\001\002\000\006" + + "\017\u01ba\022\u01bb\001\002\000\006\017\u01b1\022\u01b2\001" + + "\002\000\006\017\u01ab\022\u01ac\001\002\000\004\022\u01a5" + + "\001\002\000\014\015\uff85\212\353\216\324\307\356\316" + + "\365\001\002\000\004\145\u01a0\001\002\000\014\015\uff7a" + + "\212\uff7a\216\uff7a\307\uff7a\316\uff7a\001\002\000\014\015" + + "\uff7d\212\uff7d\216\uff7d\307\uff7d\316\uff7d\001\002\000\004" + + "\141\u0194\001\002\000\014\015\uff7e\212\uff7e\216\uff7e\307" + + "\uff7e\316\uff7e\001\002\000\014\015\uff82\212\uff82\216\uff82" + + "\307\uff82\316\uff82\001\002\000\006\017\u018b\022\u018c\001" + + "\002\000\004\022\u0185\001\002\000\006\017\376\022\377" + + "\001\002\000\014\015\uff7b\212\uff7b\216\uff7b\307\uff7b\316" + + "\uff7b\001\002\000\004\020\366\001\002\000\004\115\367" + + "\001\002\000\004\221\370\001\002\000\004\141\371\001" + + "\002\000\010\206\uff03\230\372\313\uff03\001\002\000\004" + + "\036\373\001\002\000\004\011\374\001\002\000\004\004" + + "\375\001\002\000\006\206\uff02\313\uff02\001\002\000\014" + + "\015\uff4c\212\uff4c\216\uff4c\307\uff4c\316\uff4c\001\002\000" + + "\004\124\u0100\001\002\000\004\012\u0101\001\002\000\006" + + "\013\u0104\034\u0102\001\002\000\004\022\u0108\001\002\000" + + "\004\013\u0106\001\002\000\004\017\u0105\001\002\000\014" + + "\015\uff4d\212\uff4d\216\uff4d\307\uff4d\316\uff4d\001\002\000" + + "\004\017\u0107\001\002\000\014\015\uff4e\212\uff4e\216\uff4e" + + "\307\uff4e\316\uff4e\001\002\000\022\065\uff41\066\uff41\067" + + "\uff41\070\uff41\125\uff41\126\uff41\127\uff41\230\uff41\001\002" + + "\000\006\013\uff46\016\uff46\001\002\000\022\065\u011c\066" + + "\u0110\067\u010f\070\u0113\125\u011b\126\u0119\127\u010d\230\u0111" + + "\001\002\000\010\013\uff3e\016\uff3e\210\uff3e\001\002\000" + + "\012\036\u0128\037\u012b\040\u0122\041\u0129\001\002\000\004" + + "\012\u0182\001\002\000\012\036\u0128\037\u012b\040\u0122\041" + + "\u0129\001\002\000\004\012\u017f\001\002\000\010\013\uff3a" + + "\016\uff3a\210\uff3a\001\002\000\016\004\223\005\225\012" + + "\227\141\224\251\232\336\222\001\002\000\012\036\u0128" + + "\037\u012b\040\u0122\041\u0129\001\002\000\004\012\u0174\001" + + "\002\000\010\013\uff3d\016\uff3d\210\uff3d\001\002\000\012" + + "\036\u0128\037\u012b\040\u0122\041\u0129\001\002\000\012\036" + + "\u0128\037\u012b\040\u0122\041\u0129\001\002\000\006\013\uff42" + + "\016\uff42\001\002\000\010\013\uff3c\016\uff3c\210\uff3c\001" + + "\002\000\004\012\u016f\001\002\000\010\013\uff40\016\uff40" + + "\210\uff40\001\002\000\004\012\u016e\001\002\000\004\012" + + "\u016d\001\002\000\010\013\uff3b\016\uff3b\210\uff3b\001\002" + + "\000\010\013\uff3f\016\uff3f\210\uff3f\001\002\000\012\036" + + "\u0128\037\u012b\040\u0122\041\u0129\001\002\000\006\013\uff2a" + + "\016\uff2a\001\002\000\006\013\uff27\016\uff27\001\002\000" + + "\004\022\u016c\001\002\000\006\013\uff2b\016\uff2b\001\002" + + "\000\004\013\u016b\001\002\000\006\013\uff2d\016\u0169\001" + + "\002\000\010\130\u0142\131\u0141\141\u0143\001\002\000\006" + + "\013\uff28\016\uff28\001\002\000\004\022\u013f\001\002\000" + + "\004\022\u0139\001\002\000\006\013\uff25\016\uff25\001\002" + + "\000\004\022\uff22\001\002\000\006\013\uff26\016\uff26\001" + + "\002\000\004\022\u012f\001\002\000\006\013\uff29\016\uff29" + + "\001\002\000\020\004\223\005\225\012\227\073\u0131\141" + + "\224\251\232\336\222\001\002\000\006\013\uff23\016\uff23" + + "\001\002\000\004\012\u0134\001\002\000\006\013\uff20\016" + + "\uff20\001\002\000\040\011\242\013\uff21\016\uff21\155\235" + + "\255\247\335\241\336\234\337\236\340\243\341\237\342" + + "\240\343\246\344\244\345\250\346\245\001\002\000\016" + + "\004\223\005\225\012\227\141\224\251\232\336\222\001" + + "\002\000\036\011\242\016\u0136\155\235\255\247\335\241" + + "\336\234\337\236\340\243\341\237\342\240\343\246\344" + + "\244\345\250\346\245\001\002\000\016\004\223\005\225" + + "\012\227\141\224\251\232\336\222\001\002\000\036\011" + + "\242\013\u0138\155\235\255\247\335\241\336\234\337\236" + + "\340\243\341\237\342\240\343\246\344\244\345\250\346" + + "\245\001\002\000\006\013\uff1f\016\uff1f\001\002\000\004" + + "\141\u013a\001\002\000\010\013\uff18\016\uff18\021\u013b\001" + + "\002\000\010\134\u013c\135\u013e\136\u013d\001\002\000\006" + + "\013\uff17\016\uff17\001\002\000\006\013\uff15\016\uff15\001" + + "\002\000\006\013\uff16\016\uff16\001\002\000\004\004\u0140" + + "\001\002\000\006\013\uff24\016\uff24\001\002\000\004\012" + + "\u0167\001\002\000\004\012\u0163\001\002\000\010\012\u0144" + + "\013\uff1c\016\uff1c\001\002\000\020\004\223\005\225\012" + + "\227\013\u014b\141\u0147\251\232\336\222\001\002\000\006" + + "\013\uff14\016\uff14\001\002\000\020\004\223\005\225\012" + + "\227\013\u0158\141\u0154\251\232\336\222\001\002\000\046" + + "\011\ufec9\012\u0151\013\ufec9\016\ufec9\017\ufec9\021\271\155" + + "\ufec9\255\ufec9\335\ufec9\336\ufec9\337\ufec9\340\ufec9\341\ufec9" + + "\342\ufec9\343\ufec9\344\ufec9\345\ufec9\346\ufec9\001\002\000" + + "\042\011\ufedc\013\ufedf\016\ufedf\017\ufedf\155\ufedc\255\ufedc" + + "\335\ufedc\336\ufedc\337\ufedc\340\ufedc\341\ufedc\342\ufedc\343" + + "\ufedc\344\ufedc\345\ufedc\346\ufedc\001\002\000\006\013\u014f" + + "\016\u014e\001\002\000\034\011\242\155\235\255\247\335" + + "\241\336\234\337\236\340\243\341\237\342\240\343\246" + + "\344\244\345\250\346\245\001\002\000\006\013\uff1d\016" + + "\uff1d\001\002\000\042\011\ufedd\013\ufee0\016\ufee0\017\ufee0" + + "\155\ufedd\255\ufedd\335\ufedd\336\ufedd\337\ufedd\340\ufedd\341" + + "\ufedd\342\ufedd\343\ufedd\344\ufedd\345\ufedd\346\ufedd\001\002" + + "\000\010\013\ufee1\016\ufee1\017\ufee1\001\002\000\016\004" + + "\223\005\225\012\227\141\u0147\251\232\336\222\001\002" + + "\000\006\013\uff1e\016\uff1e\001\002\000\006\013\uff13\016" + + "\uff13\001\002\000\020\004\ufec5\005\ufec5\012\ufec5\013\ufec5" + + "\141\ufec5\251\ufec5\336\ufec5\001\002\000\016\004\223\005" + + "\225\012\227\141\u0154\251\232\336\222\001\002\000\004" + + "\013\u0160\001\002\000\044\011\ufec9\012\u015f\013\ufec9\016" + + "\ufec9\021\271\155\ufec9\255\ufec9\335\ufec9\336\ufec9\337\ufec9" + + "\340\ufec9\341\ufec9\342\ufec9\343\ufec9\344\ufec9\345\ufec9\346" + + "\ufec9\001\002\000\006\013\ufec4\016\u015c\001\002\000\040" + + "\011\ufedc\013\ufec0\016\ufec0\155\ufedc\255\ufedc\335\ufedc\336" + + "\ufedc\337\ufedc\340\ufedc\341\ufedc\342\ufedc\343\ufedc\344\ufedc" + + "\345\ufedc\346\ufedc\001\002\000\004\013\u015b\001\002\000" + + "\010\013\ufec7\016\ufec7\017\ufec7\001\002\000\040\011\ufedd" + + "\013\ufec1\016\ufec1\155\ufedd\255\ufedd\335\ufedd\336\ufedd\337" + + "\ufedd\340\ufedd\341\ufedd\342\ufedd\343\ufedd\344\ufedd\345\ufedd" + + "\346\ufedd\001\002\000\006\013\ufebf\016\ufebf\001\002\000" + + "\010\013\ufec6\016\ufec6\017\ufec6\001\002\000\016\004\ufec2" + + "\005\ufec2\012\ufec2\141\ufec2\251\ufec2\336\ufec2\001\002\000" + + "\016\004\223\005\225\012\227\141\u0154\251\232\336\222" + + "\001\002\000\004\013\ufec3\001\002\000\020\004\ufec5\005" + + "\ufec5\012\ufec5\013\ufebc\141\ufec5\251\ufec5\336\ufec5\001\002" + + "\000\006\013\ufebe\016\ufebe\001\002\000\004\013\u0162\001" + + "\002\000\006\013\ufebd\016\ufebd\001\002\000\016\004\223" + + "\005\225\012\227\141\224\251\232\336\222\001\002\000" + + "\036\011\242\013\ufede\155\235\255\247\335\241\336\234" + + "\337\236\340\243\341\237\342\240\343\246\344\244\345" + + "\250\346\245\001\002\000\004\013\u0166\001\002\000\006" + + "\013\uff1b\016\uff1b\001\002\000\004\013\u0168\001\002\000" + + "\006\013\uff1a\016\uff1a\001\002\000\012\036\u0128\037\u012b" + + "\040\u0122\041\u0129\001\002\000\004\013\uff2c\001\002\000" + + "\010\013\uff31\016\uff31\210\uff31\001\002\000\010\130\uff19" + + "\131\uff19\141\uff19\001\002\000\012\036\uff38\037\uff38\040" + + "\uff38\041\uff38\001\002\000\012\036\uff32\037\uff32\040\uff32" + + "\041\uff32\001\002\000\012\036\uff30\037\uff30\040\uff30\041" + + "\uff30\001\002\000\004\013\u0171\001\002\000\010\013\uff2f" + + "\016\uff2f\210\uff2f\001\002\000\004\013\u0173\001\002\000" + + "\010\013\uff35\016\uff35\210\uff35\001\002\000\012\036\uff34" + + "\037\uff34\040\uff34\041\uff34\001\002\000\004\013\u0176\001" + + "\002\000\010\013\uff39\016\uff39\210\uff39\001\002\000\036" + + "\011\242\024\u0178\155\235\255\247\335\241\336\234\337" + + "\236\340\243\341\237\342\240\343\246\344\244\345\250" + + "\346\245\001\002\000\020\065\u011c\066\u0110\067\u010f\070" + + "\u0113\125\u011b\126\u0119\127\u010d\001\002\000\004\210\u017a" + + "\001\002\000\004\064\u017b\001\002\000\004\012\u017c\001" + + "\002\000\004\004\u017d\001\002\000\004\013\u017e\001\002" + + "\000\006\013\uff43\016\uff43\001\002\000\012\036\uff36\037" + + "\uff36\040\uff36\041\uff36\001\002\000\004\013\u0181\001\002" + + "\000\010\013\uff37\016\uff37\210\uff37\001\002\000\012\036" + + "\uff2e\037\uff2e\040\uff2e\041\uff2e\001\002\000\004\013\u0184" + + "\001\002\000\010\013\uff33\016\uff33\210\uff33\001\002\000" + + "\004\113\u0186\001\002\000\004\012\u0187\001\002\000\004" + + "\034\u0102\001\002\000\004\013\u0189\001\002\000\004\017" + + "\u018a\001\002\000\014\015\uff5a\212\uff5a\216\uff5a\307\uff5a" + + "\316\uff5a\001\002\000\014\015\uff50\212\uff50\216\uff50\307" + + "\uff50\316\uff50\001\002\000\004\123\u018d\001\002\000\004" + + "\012\u018e\001\002\000\006\013\u0190\034\u0102\001\002\000" + + "\004\013\u0192\001\002\000\004\017\u0191\001\002\000\014" + + "\015\uff51\212\uff51\216\uff51\307\uff51\316\uff51\001\002\000" + + "\004\017\u0193\001\002\000\014\015\uff52\212\uff52\216\uff52" + + "\307\uff52\316\uff52\001\002\000\004\020\u0195\001\002\000" + + "\026\104\u0198\107\u0199\110\u0197\111\u019a\112\u019d\113\u019f" + + "\114\u019b\122\u019c\123\u0196\124\u019e\001\002\000\006\017" + + "\uff4f\022\uff4f\001\002\000\006\017\uff63\022\uff63\001\002" + + "\000\006\017\uff6e\022\uff6e\001\002\000\006\017\uff67\022" + + "\uff67\001\002\000\004\022\uff5f\001\002\000\004\022\uff57" + + "\001\002\000\006\017\uff53\022\uff53\001\002\000\004\022" + + "\uff5b\001\002\000\006\017\uff4b\022\uff4b\001\002\000\004" + + "\022\uff59\001\002\000\004\141\u01a1\001\002\000\004\020" + + "\u01a2\001\002\000\004\106\u01a3\001\002\000\006\017\uff72" + + "\022\uff72\001\002\000\004\015\uff84\001\002\000\004\114" + + "\u01a6\001\002\000\004\012\u01a7\001\002\000\004\034\u0102" + + "\001\002\000\004\013\u01a9\001\002\000\004\017\u01aa\001" + + "\002\000\014\015\uff58\212\uff58\216\uff58\307\uff58\316\uff58" + + "\001\002\000\014\015\uff6d\212\uff6d\216\uff6d\307\uff6d\316" + + "\uff6d\001\002\000\004\105\u01ad\001\002\000\004\012\u01ae" + + "\001\002\000\004\013\u01af\001\002\000\004\017\u01b0\001" + + "\002\000\014\015\uff6c\212\uff6c\216\uff6c\307\uff6c\316\uff6c" + + "\001\002\000\014\015\uff6a\212\uff6a\216\uff6a\307\uff6a\316" + + "\uff6a\001\002\000\004\107\u01b3\001\002\000\004\012\u01b4" + + "\001\002\000\006\013\u01b6\034\u0102\001\002\000\004\013" + + "\u01b8\001\002\000\004\017\u01b7\001\002\000\014\015\uff69" + + "\212\uff69\216\uff69\307\uff69\316\uff69\001\002\000\004\017" + + "\u01b9\001\002\000\014\015\uff68\212\uff68\216\uff68\307\uff68" + + "\316\uff68\001\002\000\014\015\uff54\212\uff54\216\uff54\307" + + "\uff54\316\uff54\001\002\000\004\122\u01bc\001\002\000\004" + + "\012\u01bd\001\002\000\006\013\u01bf\034\u0102\001\002\000" + + "\004\013\u01c1\001\002\000\004\017\u01c0\001\002\000\014" + + "\015\uff55\212\uff55\216\uff55\307\uff55\316\uff55\001\002\000" + + "\004\017\u01c2\001\002\000\014\015\uff56\212\uff56\216\uff56" + + "\307\uff56\316\uff56\001\002\000\020\015\uff89\145\uff89\164" + + "\uff89\171\uff89\215\uff89\262\uff89\270\uff89\001\002\000\014" + + "\015\uff71\212\uff71\216\uff71\307\uff71\316\uff71\001\002\000" + + "\004\104\u01c6\001\002\000\004\012\u01c7\001\002\000\006" + + "\013\u01ca\033\u01c9\001\002\000\004\013\u01da\001\002\000" + + "\004\022\u01cc\001\002\000\004\017\u01cb\001\002\000\014" + + "\015\uff70\212\uff70\216\uff70\307\uff70\316\uff70\001\002\000" + + "\024\014\u01cd\065\uff41\066\uff41\067\uff41\070\uff41\125\uff41" + + "\126\uff41\127\uff41\230\uff41\001\002\000\006\012\u01cf\334" + + "\u01d0\001\002\000\004\013\uff47\001\002\000\024\013\u01d4" + + "\065\uff41\066\uff41\067\uff41\070\uff41\125\uff41\126\uff41\127" + + "\uff41\230\uff41\001\002\000\004\015\u01d1\001\002\000\004" + + "\013\uff49\001\002\000\004\013\u01d8\001\002\000\006\013" + + "\uff45\016\u01d6\001\002\000\004\015\u01d5\001\002\000\004" + + "\013\uff4a\001\002\000\022\065\uff41\066\uff41\067\uff41\070" + + "\uff41\125\uff41\126\uff41\127\uff41\230\uff41\001\002\000\004" + + "\013\uff44\001\002\000\004\015\u01d9\001\002\000\004\013" + + "\uff48\001\002\000\004\017\u01db\001\002\000\014\015\uff6f" + + "\212\uff6f\216\uff6f\307\uff6f\316\uff6f\001\002\000\004\145" + + "\u024b\001\002\000\004\014\u0227\001\002\000\004\141\u0222" + + "\001\002\000\004\014\u0203\001\002\000\004\313\u01e1\001" + + "\002\000\004\141\u01e2\001\002\000\006\014\u01e4\017\u01e3" + + "\001\002\000\014\015\uff06\212\uff06\216\uff06\307\uff06\316" + + "\uff06\001\002\000\004\164\u01e6\001\002\000\004\017\u0201" + + "\001\002\000\012\007\u01ef\137\u01ec\140\u01ed\141\u01ee\001" + + "\002\000\004\015\u01eb\001\002\000\004\017\ufee7\001\002" + + "\000\004\017\ufee8\001\002\000\004\017\ufee9\001\002\000" + + "\014\015\uff04\212\uff04\216\uff04\307\uff04\316\uff04\001\002" + + "\000\004\020\u01fd\001\002\000\004\020\u01f8\001\002\000" + + "\004\020\u01f4\001\002\000\004\020\u01f0\001\002\000\004" + + "\076\u01f1\001\002\000\004\022\u01f2\001\002\000\004\006" + + "\u01f3\001\002\000\004\017\ufee3\001\002\000\004\076\u01f5" + + "\001\002\000\004\022\u01f6\001\002\000\004\006\u01f7\001" + + "\002\000\004\017\ufee2\001\002\000\004\077\u01f9\001\002" + + "\000\004\022\u01fa\001\002\000\006\004\u01fc\010\u01fb\001" + + "\002\000\004\017\ufee5\001\002\000\004\017\ufee4\001\002" + + "\000\004\076\u01fe\001\002\000\004\022\u01ff\001\002\000" + + "\004\006\u0200\001\002\000\004\017\ufee6\001\002\000\006" + + "\015\ufeeb\164\u01e6\001\002\000\004\015\ufeea\001\002\000" + + "\006\015\u0205\221\u0206\001\002\000\004\015\u0221\001\002" + + "\000\004\313\uff01\001\002\000\004\045\u0207\001\002\000" + + "\004\017\u0208\001\002\000\004\313\u0209\001\002\000\010" + + "\046\u020b\145\u020e\160\u020f\001\002\000\004\015\ufefa\001" + + "\002\000\004\017\u0220\001\002\000\004\313\u021c\001\002" + + "\000\004\141\u0215\001\002\000\004\022\u0210\001\002\000" + + "\004\141\ufef5\001\002\000\004\141\u0211\001\002\000\004" + + "\012\u0151\001\002\000\004\017\u0213\001\002\000\004\313" + + "\ufef6\001\002\000\006\021\u021a\023\ufef4\001\002\000\012" + + "\013\uff10\016\uff10\021\uff10\023\uff10\001\002\000\004\023" + + "\u0217\001\002\000\016\004\223\005\225\012\227\141\u0147" + + "\251\232\336\222\001\002\000\004\017\u0219\001\002\000" + + "\004\313\ufef7\001\002\000\004\141\u021b\001\002\000\012" + + "\013\uff0f\016\uff0f\021\uff0f\023\uff0f\001\002\000\010\046" + + "\u021e\145\u020e\160\u020f\001\002\000\004\015\ufef8\001\002" + + "\000\004\017\u021f\001\002\000\004\015\ufef9\001\002\000" + + "\004\015\ufefb\001\002\000\004\313\uff00\001\002\000\006" + + "\014\u0224\017\u0223\001\002\000\014\015\uff07\212\uff07\216" + + "\uff07\307\uff07\316\uff07\001\002\000\004\164\u01e6\001\002" + + "\000\004\015\u0226\001\002\000\014\015\uff05\212\uff05\216" + + "\uff05\307\uff05\316\uff05\001\002\000\010\015\u022b\221\u022d" + + "\241\u0229\001\002\000\004\221\u022d\001\002\000\004\071" + + "\u0242\001\002\000\004\241\u0229\001\002\000\004\313\ufeff" + + "\001\002\000\004\015\u0240\001\002\000\004\045\u022e\001" + + "\002\000\004\017\u022f\001\002\000\004\313\u0230\001\002" + + "\000\006\046\u023e\160\u020f\001\002\000\004\313\u0233\001" + + "\002\000\006\015\ufeef\241\ufeef\001\002\000\006\046\u0235" + + "\160\u020f\001\002\000\006\015\ufeed\241\ufeed\001\002\000" + + "\004\017\u023d\001\002\000\004\141\u0215\001\002\000\006" + + "\021\u021a\023\u0238\001\002\000\004\071\u0239\001\002\000" + + "\004\021\u023a\001\002\000\004\141\u023b\001\002\000\004" + + "\017\u023c\001\002\000\004\313\ufeec\001\002\000\006\015" + + "\ufeee\241\ufeee\001\002\000\004\017\u023f\001\002\000\006" + + "\015\ufef0\241\ufef0\001\002\000\004\313\ufefe\001\002\000" + + "\004\015\ufef2\001\002\000\004\020\u0243\001\002\000\004" + + "\141\u0244\001\002\000\004\022\u0245\001\002\000\004\040" + + "\u0246\001\002\000\004\156\u0247\001\002\000\004\141\u0248" + + "\001\002\000\004\017\u0249\001\002\000\006\015\ufef1\221" + + "\ufef1\001\002\000\004\015\ufef3\001\002\000\004\020\u024c" + + "\001\002\000\006\117\u024d\120\u024e\001\002\000\004\014" + + "\ufefc\001\002\000\004\014\ufefd\001\002\000\014\015\uff66" + + "\212\uff66\216\uff66\307\uff66\316\uff66\001\002\000\004\110" + + "\u0251\001\002\000\004\012\u0252\001\002\000\006\013\u0254" + + "\034\u0102\001\002\000\004\013\u0256\001\002\000\004\017" + + "\u0255\001\002\000\014\015\uff65\212\uff65\216\uff65\307\uff65" + + "\316\uff65\001\002\000\004\017\u0257\001\002\000\014\015" + + "\uff64\212\uff64\216\uff64\307\uff64\316\uff64\001\002\000\004" + + "\111\u0259\001\002\000\004\012\u025a\001\002\000\006\034" + + "\u0102\035\u025b\001\002\000\004\022\u0268\001\002\000\004" + + "\016\u0264\001\002\000\006\013\u025f\016\u025e\001\002\000" + + "\004\034\u0102\001\002\000\004\017\u0260\001\002\000\014" + + "\015\uff60\212\uff60\216\uff60\307\uff60\316\uff60\001\002\000" + + "\004\013\u0262\001\002\000\004\017\u0263\001\002\000\014" + + "\015\uff62\212\uff62\216\uff62\307\uff62\316\uff62\001\002\000" + + "\004\035\u025b\001\002\000\004\013\u0266\001\002\000\004" + + "\017\u0267\001\002\000\014\015\uff61\212\uff61\216\uff61\307" + + "\uff61\316\uff61\001\002\000\004\072\u0269\001\002\000\004" + + "\012\u026a\001\002\000\006\042\u026b\043\u026d\001\002\000" + + "\004\022\u0278\001\002\000\004\016\u0275\001\002\000\004" + + "\022\uff11\001\002\000\004\016\u0272\001\002\000\004\022" + + "\u0270\001\002\000\004\141\u0215\001\002\000\010\013\uff12" + + "\016\uff12\021\u021a\001\002\000\004\042\u026b\001\002\000" + + "\004\013\u0274\001\002\000\006\013\uff0e\016\uff0e\001\002" + + "\000\004\043\u026d\001\002\000\004\013\u0277\001\002\000" + + "\006\013\uff0d\016\uff0d\001\002\000\004\073\u0279\001\002" + + "\000\004\012\u027b\001\002\000\006\013\uff0c\016\uff0c\001" + + "\002\000\016\004\223\005\225\012\227\141\224\251\232" + + "\336\222\001\002\000\036\011\242\016\u027d\155\235\255" + + "\247\335\241\336\234\337\236\340\243\341\237\342\240" + + "\343\246\344\244\345\250\346\245\001\002\000\016\004" + + "\223\005\225\012\227\141\224\251\232\336\222\001\002" + + "\000\036\011\242\013\u027f\155\235\255\247\335\241\336" + + "\234\337\236\340\243\341\237\342\240\343\246\344\244" + + "\345\250\346\245\001\002\000\006\013\uff0b\016\uff0b\001" + + "\002\000\014\015\uff75\212\uff75\216\uff75\307\uff75\316\uff75" + + "\001\002\000\004\106\u0282\001\002\000\004\012\u0283\001" + + "\002\000\006\013\u0285\034\u0102\001\002\000\004\013\u0287" + + "\001\002\000\004\017\u0286\001\002\000\014\015\uff74\212" + + "\uff74\216\uff74\307\uff74\316\uff74\001\002\000\004\017\u0288" + + "\001\002\000\014\015\uff73\212\uff73\216\uff73\307\uff73\316" + + "\uff73\001\002\000\004\112\u028a\001\002\000\004\012\u028b" + + "\001\002\000\006\034\u0102\035\u028c\001\002\000\004\022" + + "\u0299\001\002\000\006\013\u0294\016\u0293\001\002\000\004" + + "\016\u028f\001\002\000\004\035\u028c\001\002\000\004\013" + + "\u0291\001\002\000\004\017\u0292\001\002\000\014\015\uff5d" + + "\212\uff5d\216\uff5d\307\uff5d\316\uff5d\001\002\000\004\034" + + "\u0102\001\002\000\004\017\u0295\001\002\000\014\015\uff5e" + + "\212\uff5e\216\uff5e\307\uff5e\316\uff5e\001\002\000\004\013" + + "\u0297\001\002\000\004\017\u0298\001\002\000\014\015\uff5c" + + "\212\uff5c\216\uff5c\307\uff5c\316\uff5c\001\002\000\004\072" + + "\u029a\001\002\000\004\012\u029b\001\002\000\006\042\u029c" + + "\043\u026d\001\002\000\004\022\u02a5\001\002\000\004\016" + + "\u02a2\001\002\000\004\016\u029f\001\002\000\004\043\u026d" + + "\001\002\000\004\013\u02a1\001\002\000\006\013\uff09\016" + + "\uff09\001\002\000\004\042\u029c\001\002\000\004\013\u02a4" + + "\001\002\000\006\013\uff0a\016\uff0a\001\002\000\004\141" + + "\u02a6\001\002\000\004\021\u02a7\001\002\000\004\044\u02a8" + + "\001\002\000\004\012\u02a9\001\002\000\004\013\u02aa\001" + + "\002\000\006\013\uff08\016\uff08\001\002\000\004\141\u02ac" + + "\001\002\000\004\020\u02ad\001\002\000\004\105\u02ae\001" + + "\002\000\006\017\uff6b\022\uff6b\001\002\000\004\020\u02b0" + + "\001\002\000\004\102\u02b1\001\002\000\006\014\uff95\017" + + "\uff95\001\002\000\026\015\uffaa\145\uffaa\164\uffaa\166\uffaa" + + "\171\uffaa\215\uffaa\262\uffaa\265\uffaa\267\uffaa\270\uffaa\001" + + "\002\000\026\015\uffa9\145\uffa9\164\uffa9\166\uffa9\171\uffa9" + + "\215\uffa9\262\uffa9\265\uffa9\267\uffa9\270\uffa9\001\002\000" + + "\010\015\u02b8\164\277\301\u02b6\001\002\000\004\015\u02be" + + "\001\002\000\004\020\u02bb\001\002\000\010\015\uff91\164" + + "\277\301\u02b6\001\002\000\020\015\uff94\145\uff94\164\uff94" + + "\171\uff94\215\uff94\262\uff94\270\uff94\001\002\000\010\015" + + "\uff8f\164\uff8f\301\uff8f\001\002\000\004\015\uff90\001\002" + + "\000\010\074\320\075\317\141\316\001\002\000\004\017" + + "\u02bd\001\002\000\010\015\uff8e\164\uff8e\301\uff8e\001\002" + + "\000\020\015\uff93\145\uff93\164\uff93\171\uff93\215\uff93\262" + + "\uff93\270\uff93\001\002\000\004\020\u02c0\001\002\000\004" + + "\103\u02c1\001\002\000\004\014\uff92\001\002\000\004\023" + + "\u02c7\001\002\000\020\015\uffa1\145\uffa1\164\uffa1\171\uffa1" + + "\215\uffa1\262\uffa1\270\uffa1\001\002\000\016\004\223\005" + + "\225\012\227\141\224\251\232\336\222\001\002\000\036" + + "\011\242\017\u02c6\155\235\255\247\335\241\336\234\337" + + "\236\340\243\341\237\342\240\343\246\344\244\345\250" + + "\346\245\001\002\000\020\015\uffa0\145\uffa0\164\uffa0\171" + + "\uffa0\215\uffa0\262\uffa0\270\uffa0\001\002\000\016\004\223" + + "\005\225\012\227\141\224\251\232\336\222\001\002\000" + + "\036\011\242\017\u02c9\155\235\255\247\335\241\336\234" + + "\337\236\340\243\341\237\342\240\343\246\344\244\345" + + "\250\346\245\001\002\000\020\015\uff9f\145\uff9f\164\uff9f" + + "\171\uff9f\215\uff9f\262\uff9f\270\uff9f\001\002\000\004\020" + + "\u02cb\001\002\000\010\074\320\075\317\141\316\001\002" + + "\000\010\017\uff9e\023\uff9e\202\uff9e\001\002\000\004\141" + + "\u02ce\001\002\000\004\020\u02cf\001\002\000\010\074\320" + + "\075\317\141\316\001\002\000\006\017\uff9b\023\uff9b\001" + + "\002\000\004\121\u02d2\001\002\000\004\020\u02d3\001\002" + + "\000\004\116\u02d4\001\002\000\006\014\uff86\017\uff86\001" + + "\002\000\006\062\u02d7\063\u02d6\001\002\000\004\165\u02e4" + + "\001\002\000\004\165\u02d8\001\002\000\004\141\u02d9\001" + + "\002\000\006\021\u02da\022\u02db\001\002\000\004\141\u02e0" + + "\001\002\000\004\141\u02dc\001\002\000\004\021\u02dd\001" + + "\002\000\004\141\u02de\001\002\000\004\017\u02df\001\002" + + "\000\016\015\uffc1\164\uffc1\166\uffc1\262\uffc1\265\uffc1\267" + + "\uffc1\001\002\000\004\022\u02e1\001\002\000\004\141\u02e2" + + "\001\002\000\004\017\u02e3\001\002\000\016\015\uffc2\164" + + "\uffc2\166\uffc2\262\uffc2\265\uffc2\267\uffc2\001\002\000\004" + + "\141\u02e5\001\002\000\006\021\u02e6\022\u02e7\001\002\000" + + "\004\141\u02ec\001\002\000\004\141\u02e8\001\002\000\004" + + "\021\u02e9\001\002\000\004\141\u02ea\001\002\000\004\017" + + "\u02eb\001\002\000\016\015\uffbf\164\uffbf\166\uffbf\262\uffbf" + + "\265\uffbf\267\uffbf\001\002\000\004\022\u02ed\001\002\000" + + "\004\141\u02ee\001\002\000\004\017\u02ef\001\002\000\016" + + "\015\uffc0\164\uffc0\166\uffc0\262\uffc0\265\uffc0\267\uffc0\001" + + "\002\000\006\015\u02f2\164\277\001\002\000\004\015\u02f3" + + "\001\002\000\016\015\uffe8\164\uffe8\166\uffe8\262\uffe8\265" + + "\uffe8\267\uffe8\001\002\000\016\015\uffe9\164\uffe9\166\uffe9" + + "\262\uffe9\265\uffe9\267\uffe9\001\002\000\004\265\u02f7\001" + + "\002\000\016\015\uffbc\164\uffbc\166\uffbc\262\uffbc\265\uffbc" + + "\267\uffbc\001\002\000\006\015\u0303\164\277\001\002\000" + + "\004\262\u02f8\001\002\000\004\041\u02f9\001\002\000\006" + + "\020\u02fb\022\u02fa\001\002\000\004\141\u0300\001\002\000" + + "\004\055\u02fc\001\002\000\004\022\u02fd\001\002\000\004" + + "\141\u02fe\001\002\000\004\017\u02ff\001\002\000\006\015" + + "\uffb7\164\uffb7\001\002\000\004\017\u0301\001\002\000\006" + + "\015\uffb6\164\uffb6\001\002\000\004\015\u0304\001\002\000" + + "\016\015\uffba\164\uffba\166\uffba\262\uffba\265\uffba\267\uffba" + + "\001\002\000\016\015\uffb9\164\uffb9\166\uffb9\262\uffb9\265" + + "\uffb9\267\uffb9\001\002\000\004\015\u0306\001\002\000\016" + + "\015\uffb8\164\uffb8\166\uffb8\262\uffb8\265\uffb8\267\uffb8\001" + + "\002\000\016\015\uffb5\164\uffb5\166\uffb5\262\uffb5\265\uffb5" + + "\267\uffb5\001\002\000\006\015\u030b\164\u0309\001\002\000" + + "\004\141\u030f\001\002\000\016\015\uffb3\164\uffb3\166\uffb3" + + "\262\uffb3\265\uffb3\267\uffb3\001\002\000\016\015\uffb4\164" + + "\uffb4\166\uffb4\262\uffb4\265\uffb4\267\uffb4\001\002\000\006" + + "\015\u030e\164\u0309\001\002\000\016\015\uffaf\164\uffaf\166" + + "\uffaf\262\uffaf\265\uffaf\267\uffaf\001\002\000\016\015\uffb0" + + "\164\uffb0\166\uffb0\262\uffb0\265\uffb0\267\uffb0\001\002\000" + + "\004\271\u0310\001\002\000\004\141\u0311\001\002\000\004" + + "\017\u0312\001\002\000\006\015\uffae\164\uffae\001\002\000" + + "\006\013\uffd2\016\uffd2\001\002\000\004\022\u032b\001\002" + + "\000\004\022\u0329\001\002\000\006\013\uffd3\016\uffd3\001" + + "\002\000\004\013\u0327\001\002\000\006\013\uffd0\016\uffd0" + + "\001\002\000\006\013\uffd6\016\u0325\001\002\000\006\013" + + "\uffd1\016\uffd1\001\002\000\004\022\u0323\001\002\000\004" + + "\022\u0321\001\002\000\006\013\uffd4\016\uffd4\001\002\000" + + "\004\022\u031f\001\002\000\004\004\u0320\001\002\000\006" + + "\013\uffcc\016\uffcc\001\002\000\004\141\u0322\001\002\000" + + "\006\013\uffcf\016\uffcf\001\002\000\004\005\u0324\001\002" + + "\000\006\013\uffcb\016\uffcb\001\002\000\014\025\u031b\026" + + "\u031e\027\u0315\031\u031c\032\u0314\001\002\000\004\013\uffd5" + + "\001\002\000\004\017\u0328\001\002\000\016\015\uffdc\164" + + "\uffdc\166\uffdc\262\uffdc\265\uffdc\267\uffdc\001\002\000\004" + + "\005\u032a\001\002\000\006\013\uffcd\016\uffcd\001\002\000" + + "\004\141\u032c\001\002\000\006\013\uffce\016\uffce\001\002" + + "\000\016\015\ufffb\164\ufffb\166\ufffb\262\ufffb\265\ufffb\267" + + "\ufffb\001\002\000\004\013\u032f\001\002\000\004\017\u0330" + + "\001\002\000\016\015\uffd8\164\uffd8\166\uffd8\262\uffd8\265" + + "\uffd8\267\uffd8\001\002\000\004\015\ufffd\001\002\000\004" + + "\141\u0333\001\002\000\006\305\137\333\141\001\002\000" + + "\004\100\u0335\001\002\000\004\014\uffe7\001\002\000\004" + + "\013\u0337\001\002\000\004\017\u0338\001\002\000\016\015" + + "\uffda\164\uffda\166\uffda\262\uffda\265\uffda\267\uffda\001\002" + + "\000\016\015\ufffc\164\ufffc\166\ufffc\262\ufffc\265\ufffc\267" + + "\ufffc\001\002\000\004\002\000\001\002" }); + + /** Access to parse-action table. */ + @Override + public short[][] action_table() {return _action_table;} + + /** <code>reduce_goto</code> table. */ + protected static final short[][] _reduce_table = + unpackFromStrings(new String[] { + "\000\u0338\000\004\004\003\001\001\000\002\001\001\000" + + "\002\001\001\000\002\001\001\000\066\005\042\006\020" + + "\011\007\013\035\014\037\017\023\020\044\021\012\022" + + "\011\032\032\033\015\034\021\035\045\036\025\037\022" + + "\040\027\041\010\042\016\043\026\044\034\045\014\046" + + "\031\053\036\054\033\055\043\056\041\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\020\023\u0335" + + "\024\u0318\025\u031c\026\u0315\027\u0312\030\u0319\031\u0317\001" + + "\001\000\002\001\001\000\002\001\001\000\066\005\u0330" + + "\006\020\011\007\013\035\014\037\017\023\020\044\021" + + "\012\022\011\032\032\033\015\034\021\035\045\036\025" + + "\037\022\040\027\041\010\042\016\043\026\044\034\045" + + "\014\046\031\053\036\054\033\055\043\056\041\001\001" + + "\000\020\023\u032d\024\u0318\025\u031c\026\u0315\027\u0312\030" + + "\u0319\031\u0317\001\001\000\002\001\001\000\002\001\001" + + "\000\002\001\001\000\002\001\001\000\002\001\001\000" + + "\002\001\001\000\002\001\001\000\002\001\001\000\020" + + "\023\u0316\024\u0318\025\u031c\026\u0315\027\u0312\030\u0319\031" + + "\u0317\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\014\015\u02f3\016\300\047\u02f4\050\u02f5\101" + + "\301\001\001\000\002\001\001\000\002\001\001\000\044" + + "\055\177\056\041\057\167\060\165\061\175\062\161\063" + + "\160\064\166\065\170\066\152\071\172\072\157\073\154" + + "\076\174\077\164\100\176\171\173\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\002\001\001" + + "\000\002\001\001\000\002\001\001\000\002\001\001\000" + + "\002\001\001\000\002\001\001\000\002\001\001\000\004" + + "\010\102\001\001\000\002\001\001\000\002\001\001\000" + + "\002\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\002\001\001" + + "\000\002\001\001\000\002\001\001\000\002\001\001\000" + + "\002\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\004\012" + + "\106\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\004\012" + + "\111\001\001\000\002\001\001\000\004\012\113\001\001" + + "\000\002\001\001\000\002\001\001\000\002\001\001\000" + + "\002\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\002\001\001" + + "\000\002\001\001\000\002\001\001\000\002\001\001\000" + + "\002\001\001\000\002\001\001\000\004\007\137\001\001" + + "\000\002\001\001\000\002\001\001\000\002\001\001\000" + + "\002\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\002\001\001" + + "\000\002\001\001\000\002\001\001\000\002\001\001\000" + + "\002\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\044\055\177\056\041\057\u02b2\060\165\061\175" + + "\062\161\063\160\064\166\065\170\066\152\071\172\072" + + "\157\073\154\076\174\077\164\100\176\171\173\001\001" + + "\000\002\001\001\000\002\001\001\000\002\001\001\000" + + "\002\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\002\001\001" + + "\000\002\001\001\000\002\001\001\000\002\001\001\000" + + "\002\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\002\001\001" + + "\000\010\233\227\234\230\235\225\001\001\000\010\233" + + "\272\234\230\235\225\001\001\000\002\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\010\233" + + "\266\234\230\235\225\001\001\000\002\001\001\000\002" + + "\001\001\000\010\233\232\234\230\235\225\001\001\000" + + "\002\001\001\000\010\233\264\234\230\235\225\001\001" + + "\000\010\233\263\234\230\235\225\001\001\000\010\233" + + "\262\234\230\235\225\001\001\000\010\233\261\234\230" + + "\235\225\001\001\000\010\233\260\234\230\235\225\001" + + "\001\000\010\233\257\234\230\235\225\001\001\000\010" + + "\233\256\234\230\235\225\001\001\000\010\233\255\234" + + "\230\235\225\001\001\000\010\233\254\234\230\235\225" + + "\001\001\000\010\233\253\234\230\235\225\001\001\000" + + "\010\233\252\234\230\235\225\001\001\000\010\233\251" + + "\234\230\235\225\001\001\000\010\233\250\234\230\235" + + "\225\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\002\001\001" + + "\000\002\001\001\000\002\001\001\000\002\001\001\000" + + "\002\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\004\235\271\001\001\000\002\001\001\000" + + "\002\001\001\000\002\001\001\000\010\015\275\016\300" + + "\101\301\001\001\000\002\001\001\000\002\001\001\000" + + "\002\001\001\000\010\015\311\016\300\101\301\001\001" + + "\000\004\102\304\001\001\000\002\001\001\000\010\233" + + "\306\234\230\235\225\001\001\000\002\001\001\000\002" + + "\001\001\000\002\001\001\000\010\233\310\234\230\235" + + "\225\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\004\002\314\001\001\000\002\001\001\000" + + "\002\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\002\001\001\000\074\074\344\075\351\103" + + "\333\104\330\105\337\106\336\107\356\110\354\111\325" + + "\112\363\113\353\114\340\115\335\116\326\117\342\155" + + "\327\156\341\157\347\160\346\161\332\162\331\163\324" + + "\164\361\165\350\166\345\167\360\170\362\200\357\205" + + "\334\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\002\001\001" + + "\000\010\201\u01df\214\u01de\215\u01dc\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\002\001\001" + + "\000\002\001\001\000\002\001\001\000\002\001\001\000" + + "\002\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\002\001\001\000\074\074\u01a3\075\351\103" + + "\333\104\330\105\337\106\336\107\356\110\354\111\325" + + "\112\363\113\353\114\340\115\335\116\326\117\342\155" + + "\327\156\341\157\347\160\346\161\332\162\331\163\324" + + "\164\361\165\350\166\345\167\360\170\362\200\357\205" + + "\334\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\002\001\001" + + "\000\002\001\001\000\002\001\001\000\002\001\001\000" + + "\002\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\002\001\001" + + "\000\004\121\u0102\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\002\001\001" + + "\000\002\001\001\000\006\123\u0108\227\u0109\001\001\000" + + "\002\001\001\000\034\124\u0116\125\u0119\130\u011d\131\u010a" + + "\132\u0113\133\u0117\134\u011c\147\u0111\150\u010d\151\u0114\152" + + "\u010b\153\u011e\154\u0115\001\001\000\002\001\001\000\030" + + "\126\u0182\127\u0124\135\u0122\136\u011f\142\u0126\143\u012d\144" + + "\u0120\145\u012b\146\u0129\172\u0125\226\u012c\001\001\000\002" + + "\001\001\000\030\126\u017f\127\u0124\135\u0122\136\u011f\142" + + "\u0126\143\u012d\144\u0120\145\u012b\146\u0129\172\u0125\226\u012c" + + "\001\001\000\002\001\001\000\002\001\001\000\010\233" + + "\u0176\234\230\235\225\001\001\000\030\126\u0174\127\u0124" + + "\135\u0122\136\u011f\142\u0126\143\u012d\144\u0120\145\u012b\146" + + "\u0129\172\u0125\226\u012c\001\001\000\002\001\001\000\002" + + "\001\001\000\030\126\u0171\127\u0124\135\u0122\136\u011f\142" + + "\u0126\143\u012d\144\u0120\145\u012b\146\u0129\172\u0125\226\u012c" + + "\001\001\000\030\126\u016f\127\u0124\135\u0122\136\u011f\142" + + "\u0126\143\u012d\144\u0120\145\u012b\146\u0129\172\u0125\226\u012c" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\002\001\001" + + "\000\002\001\001\000\002\001\001\000\030\126\u0123\127" + + "\u0124\135\u0122\136\u011f\142\u0126\143\u012d\144\u0120\145\u012b" + + "\146\u0129\172\u0125\226\u012c\001\001\000\002\001\001\000" + + "\002\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\002\001\001" + + "\000\002\001\001\000\002\001\001\000\002\001\001\000" + + "\002\001\001\000\014\137\u012f\141\u0131\233\u0132\234\230" + + "\235\225\001\001\000\002\001\001\000\002\001\001\000" + + "\002\001\001\000\002\001\001\000\010\233\u0134\234\230" + + "\235\225\001\001\000\002\001\001\000\010\233\u0136\234" + + "\230\235\225\001\001\000\002\001\001\000\002\001\001" + + "\000\002\001\001\000\002\001\001\000\002\001\001\000" + + "\002\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\020\204\u0148\230\u0144\232\u014c" + + "\233\u0149\234\u014b\235\u0147\236\u0145\001\001\000\002\001" + + "\001\000\022\233\u0149\234\u0158\235\u0155\236\u0151\237\u0154" + + "\241\u0159\242\u0152\243\u0156\001\001\000\002\001\001\000" + + "\002\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\016\230" + + "\u014f\232\u014c\233\u0149\234\u014b\235\u0147\236\u0145\001\001" + + "\000\002\001\001\000\002\001\001\000\002\001\001\000" + + "\022\233\u0149\234\u0158\235\u0155\236\u0151\237\u0154\241\u0159" + + "\242\u0152\243\u0160\001\001\000\002\001\001\000\002\001" + + "\001\000\004\240\u015c\001\001\000\002\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\022\233\u0149" + + "\234\u0158\235\u0155\236\u0151\237\u0154\241\u0159\242\u0152\243" + + "\u015d\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\012\231" + + "\u0164\233\u0163\234\230\235\225\001\001\000\002\001\001" + + "\000\002\001\001\000\002\001\001\000\002\001\001\000" + + "\002\001\001\000\030\126\u0169\127\u0124\135\u0122\136\u011f" + + "\142\u0126\143\u012d\144\u0120\145\u012b\146\u0129\172\u0125\226" + + "\u012c\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\002\001\001" + + "\000\002\001\001\000\002\001\001\000\002\001\001\000" + + "\002\001\001\000\002\001\001\000\034\124\u0178\125\u0119" + + "\130\u011d\131\u010a\132\u0113\133\u0117\134\u011c\147\u0111\150" + + "\u010d\151\u0114\152\u010b\153\u011e\154\u0115\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\002\001\001" + + "\000\002\001\001\000\002\001\001\000\002\001\001\000" + + "\002\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\004\121\u0187\001\001\000\002\001\001\000" + + "\002\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\002\001\001\000\004\121\u018e\001\001\000" + + "\002\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\002\001\001" + + "\000\002\001\001\000\002\001\001\000\002\001\001\000" + + "\002\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\002\001\001" + + "\000\002\001\001\000\004\121\u01a7\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\002\001\001" + + "\000\002\001\001\000\002\001\001\000\002\001\001\000" + + "\002\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\002\001\001\000\004\121\u01b4\001\001\000" + + "\002\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\004\121\u01bd\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\002\001\001" + + "\000\002\001\001\000\002\001\001\000\004\120\u01c7\001" + + "\001\000\002\001\001\000\002\001\001\000\002\001\001" + + "\000\002\001\001\000\006\123\u01cd\227\u0109\001\001\000" + + "\002\001\001\000\002\001\001\000\010\122\u01d1\123\u01d2" + + "\227\u0109\001\001\000\002\001\001\000\002\001\001\000" + + "\002\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\010\122\u01d6\123\u01d2\227\u0109\001\001\000" + + "\002\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\002\001\001" + + "\000\002\001\001\000\002\001\001\000\002\001\001\000" + + "\014\206\u01e6\222\u01e4\223\u01e9\224\u01e8\225\u01e7\001\001" + + "\000\002\001\001\000\002\001\001\000\002\001\001\000" + + "\002\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\002\001\001" + + "\000\002\001\001\000\002\001\001\000\002\001\001\000" + + "\002\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\002\001\001" + + "\000\002\001\001\000\002\001\001\000\014\206\u0201\222" + + "\u01e4\223\u01e9\224\u01e8\225\u01e7\001\001\000\002\001\001" + + "\000\004\207\u0203\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\004\202\u0209" + + "\001\001\000\006\203\u020b\211\u020c\001\001\000\002\001" + + "\001\000\002\001\001\000\004\202\u021c\001\001\000\006" + + "\003\u0215\213\u0213\001\001\000\002\001\001\000\002\001" + + "\001\000\006\232\u0211\236\u0145\001\001\000\002\001\001" + + "\000\002\001\001\000\002\001\001\000\002\001\001\000" + + "\002\001\001\000\002\001\001\000\016\230\u0217\232\u014c" + + "\233\u0149\234\u014b\235\u0147\236\u0145\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\002\001\001" + + "\000\006\203\u020b\211\u020c\001\001\000\002\001\001\000" + + "\002\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\014\206" + + "\u0224\222\u01e4\223\u01e9\224\u01e8\225\u01e7\001\001\000\002" + + "\001\001\000\002\001\001\000\010\210\u022b\216\u0227\217" + + "\u0229\001\001\000\004\217\u0249\001\001\000\002\001\001" + + "\000\004\216\u0240\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\006\220\u0231" + + "\221\u0230\001\001\000\004\211\u0235\001\001\000\006\220" + + "\u0233\221\u0230\001\001\000\002\001\001\000\004\211\u0235" + + "\001\001\000\002\001\001\000\002\001\001\000\004\213" + + "\u0236\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\002\001\001" + + "\000\002\001\001\000\002\001\001\000\002\001\001\000" + + "\002\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\002\001\001" + + "\000\002\001\001\000\002\001\001\000\002\001\001\000" + + "\002\001\001\000\002\001\001\000\004\121\u0252\001\001" + + "\000\002\001\001\000\002\001\001\000\002\001\001\000" + + "\002\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\006\121\u025b\173\u025c\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\004\121\u0260" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\004\173\u0264" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\010\174\u026d" + + "\175\u026b\212\u026e\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\002\001\001" + + "\000\004\213\u0270\001\001\000\002\001\001\000\004\175" + + "\u0272\001\001\000\002\001\001\000\002\001\001\000\006" + + "\174\u0275\212\u026e\001\001\000\002\001\001\000\002\001" + + "\001\000\004\140\u0279\001\001\000\002\001\001\000\002" + + "\001\001\000\010\233\u027b\234\230\235\225\001\001\000" + + "\002\001\001\000\010\233\u027d\234\230\235\225\001\001" + + "\000\002\001\001\000\002\001\001\000\002\001\001\000" + + "\002\001\001\000\002\001\001\000\004\121\u0283\001\001" + + "\000\002\001\001\000\002\001\001\000\002\001\001\000" + + "\002\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\006\121\u028d\176\u028c\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\004\176\u028f" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\004\121\u0295\001\001\000\002\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\010\174\u029c" + + "\177\u029d\212\u026e\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\006\174\u029f\212\u026e\001\001" + + "\000\002\001\001\000\002\001\001\000\004\177\u02a2\001" + + "\001\000\002\001\001\000\002\001\001\000\002\001\001" + + "\000\002\001\001\000\002\001\001\000\002\001\001\000" + + "\002\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\002\001\001" + + "\000\002\001\001\000\012\016\u02b8\067\u02b4\070\u02b6\101" + + "\301\001\001\000\002\001\001\000\002\001\001\000\012" + + "\016\u02b8\067\u02b9\070\u02b6\101\301\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\004\002\u02bb" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\002\001\001" + + "\000\002\001\001\000\002\001\001\000\010\233\u02c4\234" + + "\230\235\225\001\001\000\002\001\001\000\002\001\001" + + "\000\010\233\u02c7\234\230\235\225\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\004\002\u02cb" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\004\002\u02cf\001\001\000\002\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\002\001\001" + + "\000\002\001\001\000\002\001\001\000\002\001\001\000" + + "\002\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\002\001\001" + + "\000\002\001\001\000\002\001\001\000\002\001\001\000" + + "\002\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\010\015\u02f0\016\300\101\301" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\004\050\u0304\001\001\000\002\001\001\000\010" + + "\015\u0301\016\300\101\301\001\001\000\002\001\001\000" + + "\002\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\002\001\001" + + "\000\002\001\001\000\002\001\001\000\002\001\001\000" + + "\002\001\001\000\002\001\001\000\002\001\001\000\006" + + "\051\u0309\052\u030b\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\006\051\u030c\052\u030b\001\001" + + "\000\002\001\001\000\002\001\001\000\002\001\001\000" + + "\002\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\002\001\001" + + "\000\002\001\001\000\002\001\001\000\002\001\001\000" + + "\002\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\020\023\u0325\024\u0318\025\u031c" + + "\026\u0315\027\u0312\030\u0319\031\u0317\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\002\001\001" + + "\000\002\001\001\000\002\001\001\000\002\001\001\000" + + "\002\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\004\007" + + "\u0333\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001" }); + + /** Access to <code>reduce_goto</code> table. */ + @Override + public short[][] reduce_table() {return _reduce_table;} + + /** Instance of action encapsulation class. */ + protected CUP$AvatarFromSysMLParser$actions action_obj; + + /** Action encapsulation object initializer. */ + @Override + protected void init_actions() + { + action_obj = new CUP$AvatarFromSysMLParser$actions(this); + } + + /** Invoke a user supplied parse action. */ + @Override + public java_cup.runtime.Symbol do_action( + int act_num, + java_cup.runtime.lr_parser parser, + java.util.Stack<java_cup.runtime.Symbol> stack, + int top) + throws java.lang.Exception + { + /* call code in generated class */ + return action_obj.CUP$AvatarFromSysMLParser$do_action(act_num, parser, stack, top); + } + + /** Indicates start state. */ + @Override + public int start_state() {return 0;} + /** Indicates start production. */ + @Override + public int start_production() {return 1;} + + /** <code>EOF</code> Symbol index. */ + @Override + public int EOF_sym() {return 0;} + + /** <code>error</code> Symbol index. */ + @Override + public int error_sym() {return 1;} + + + + // %%%%%%%%%%%%%%%%%%% BEGINNING OF USER CODE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + /** Parse the current buffer and returns the abstract syntax tree (AST) of the described specification. + * + * <p> At the end of parsing, the true AST components are in variables dataTypeMap, relationMap, channelMap, + * blockMap and signalMap. The invoked AST constructor (StxModel) also receives some other parameters: the + * list of errors encountered while parsing and some information it uses in a post-processing that finalizes + * the AST structure (complete some fields). + */ + + // %%%%%%%%%%%%%%%%%%%%%%%%%%% MAIN FUNCTION %%%%%%%%%%%%%%%%%%%%%%%%%%%% + + public StxModel parseModel() { + try { + parse(); + return new StxModel(errors,dataTypeMap,relationMap,channelMap,blockMap,signalMap,outMessageMap,commTransitions); + } + catch (java.lang.Exception e) { + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, lexer.getErrorLocation(), e.getMessage())); + return new StxModel(errors,dataTypeMap,relationMap,channelMap,blockMap,signalMap,outMessageMap,commTransitions); + } + } + + // %%%%%%%%%%%%%%%%%%%%%%%%%%% IMPLEMENTATION %%%%%%%%%%%%%%%%%%%%%%%%%%%% + + // %%%%%%%%%%%%% LEXER + + /** to make lexer access easier */ + private AvatarFromSysMLLexer lexer = (AvatarFromSysMLLexer) getScanner(); + + // %%%%%%%%%%%%%% ERROR HANDLING + + /** to handle errors encountered while parsing */ + private ArrayList<AvatarFromSysMLError> errors; + /** register an error */ + private void addError(AvatarFromSysMLError _err) { errors.add(_err); } + /** get encountered errors */ + public ArrayList<AvatarFromSysMLError> getErrors() { return errors; } + + // %%%%%%%%%%%%%%%%%% INITIALIZE + + @Override + public void user_init() { + errors = new ArrayList<AvatarFromSysMLError>(); + dataTypeMap = new HashMap<String,StxDataType>(); + relationMap = new HashMap<String,StxRelation>(); + channelMap = new HashMap<String,StxChannel>(); + blockMap = new HashMap<String,StxBlock>(); + signalMap = new HashMap<String,StxSignal>(); + inMessageMap = new HashMap<String,StxInMessage>(); + outMessageMap = new HashMap<String,StxOutMessage>(); + blockHierarchy = new ArrayList<StxBlock>(); + attributeHierarchy = new ArrayList<HashMap<String,StxAttribute>>(); + methodHierarchy = new ArrayList<HashMap<String,StxMethod>>(); + commTransitions = new ArrayList<StxTransition>(); + theBlock = null; + } + + // %%%%%%%%%%%%%%%%% GLOBAL STRUCTURES FILLED BY PARSING + + /** datatypes collected from SysML source while parsing, to put in final AST */ + private HashMap<String,StxDataType> dataTypeMap; + /** relations collected from SysML source while parsing, to put in final AST */ + private HashMap<String,StxRelation> relationMap; + /** channels collected from SysML source while parsing, to put in final AST */ + private HashMap<String,StxChannel> channelMap; + /** blocks collected from SysML source while parsing, to put in final AST */ + private HashMap<String,StxBlock> blockMap; + /** signals collected from SysML source while parsing, to put in final AST */ + private HashMap<String,StxSignal> signalMap; + + /** signal input profiles collected from SysML source while parsing, internal, technical */ + private HashMap<String,StxInMessage> inMessageMap; // theStructure + /** signal outout profiles collected from SysML source while parsing, to finalize final AST */ + private HashMap<String,StxOutMessage> outMessageMap; + + /** communication transitions, to finalize final AST. They are collected while parsing as they + * require a post-processing after it, when their containing block hierarchy is fully known, + * to find their associated signal from its name. + */ + ArrayList<StxTransition> commTransitions; + + /** attributes, one map per block. Technical variable: memorize to avoid duplicates */ + private HashMap<String,StxAttribute> attributeMap; + + /** methods, one map per block. Technical variable: memorize to avoid duplicates */ + private HashMap<String,StxMethod> methodMap; + + private StringBuffer stringAcc = new StringBuffer(); + + // %%%%%%%%%%%%%%%%%%%% "PATH" STATE VARIABLES + // context information for parsing + // they locate the current position being parsed in the specification structure + + /** path state variable: current field */ + private StxField theField; + /** path state variable: current input profile or method */ + private StxStructure theStructure; + /** path state variable: current relation */ + private StxRelation theRelation; + /** path state variable: current Channel */ + private StxChannel theChannel; + /** path state variable: current block */ + private StxBlock theBlock; + /** path state variable: current signal */ + private StxSignal theSignal; + /** path state variable: current output profile */ + private StxOutMessage theOutMessage; + /** path state variable: current attribute */ + private StxAttribute theAttribute; + /** path state variable: current state */ + private StxState theState; + /** path state variable: current transition */ + private StxTransition theTransition; + /** path state variable: transition request index + * Idea: thState->transition(requestIndex) correspond to theTransition + */ + private int requestIndex; + + /** current path in block hierarchy, ancestors in order: last element is father of current block. */ + private ArrayList<StxBlock> blockHierarchy; + /** attributes associated to ancestor blocks, respects blockHierarchy order */ + private ArrayList<HashMap<String,StxAttribute>> attributeHierarchy; + /** methods associated to ancestor blocks, respects blockHierarchy order */ + private ArrayList<HashMap<String,StxMethod>> methodHierarchy; + /** to detect multiple state machines in a single block */ + private Location stateMachine = null; + /** state machine flags associated to ancestor blocks, respects blockHierarchy order */ + private ArrayList<Location> machineHierarchy = new ArrayList<Location>(); + + // %%%%%%%%%%%%%%%%%%%% UPDATE PATH STATE VARIABLES + + // ++++++++++++++++ RELATIONS + + /** set current relation. Create-and-Register it if necessary. */ + private void getRelation(String _name) { + theRelation = relationMap.get(_name); + if (theRelation == null) { + theRelation = new StxRelation(_name); + relationMap.put(_name, theRelation); + } + } + + /** (to avoid duplicates) not null if a block1 parameter has been encountered for current relation */ + private Location block1ParamFlag; + /** (to avoid duplicates) not null if a block2 parameter has been encountered for current relation */ + private Location block2ParamFlag; + /** (to avoid duplicates) not null if a private parameter has been encountered for current relation */ + private Location privateParamFlag; + /** (to avoid duplicates) not null if a maxsize parameter has been encountered for current relation */ + private Location maxsizeParamFlag; + /** (to avoid duplicates) not null if a lossy parameter has been encountered for current relation */ + private Location lossyParamFlag; + + /** to clear the relevant anti-duplicate flags (locations) at the beginning of a relation parsing */ + private void clearRelationParams() { + block1ParamFlag = null; + block2ParamFlag = null; + privateParamFlag = null; + maxsizeParamFlag = null; + lossyParamFlag = null; + } + + // ++++++++++++++++ CHANNELS + + /** set current channel. Create-and-Register it if necessary. */ + private void getChannel(String _name) { + theChannel = channelMap.get(_name); + if (theChannel == null) { + theChannel = new StxChannel(_name); + channelMap.put(_name, theChannel); + } + } + + // ++++++++++++++++ BLOCKS + + /** set current block. Create-and-Register it if necessary. */ + private void getBlock(String _name) { + theBlock = blockMap.get(_name); + if (theBlock == null) { + theBlock = new StxBlock(_name); + blockMap.put(_name, theBlock); + } + } + + // ++++++++++++++++ SIGNALS + + /** set current signal. Create-and-Register it if necessary. */ + private void getSignal(String _blockname, String _signalname) { + String key = _blockname + "." + _signalname; + theSignal = signalMap.get(key); + if (theSignal == null) { + theSignal = new StxSignal(_signalname); + signalMap.put(key, theSignal); + } + } + + // ++++++++++++++++ INPUT PROFILE + + /** (to avoid duplicates) not null if a message channel parameter has been encountered for current relation */ + private Location messageChannelParam; + + /** set current in message in theStructure. Create-and-Register it if necessary. */ + private void getInMessage(String _name) { + theStructure = inMessageMap.get(_name); + if (theStructure == null) { + theStructure = new StxInMessage(_name); + inMessageMap.put(_name, (StxInMessage)theStructure); + } + } + + // ++++++++++++++++ OUTPUT PROFILE + + /** set current out message. Create-and-Register it if necessary. */ + private void getOutMessage(String _name, StxInMessage _msg) { + theOutMessage = outMessageMap.get(_name); + if (theOutMessage == null) { + theOutMessage = new StxOutMessage(_name, _msg); + outMessageMap.put(_name, theOutMessage); + } + } + + // ++++++++++++++++ ENTER / EXIT BLOCK + + /** enter block: extend path to current block (push blockHierarchy, attributeHierarchy, methodHierarchy) */ + private void pushBlock() { + blockHierarchy.add(theBlock); + theBlock = null; + attributeHierarchy.add(attributeMap); + attributeMap = new HashMap<String,StxAttribute>(); + methodHierarchy.add(methodMap); + methodMap = new HashMap<String,StxMethod>(); + machineHierarchy.add(stateMachine); + stateMachine = null; + } + + /** exit block: shorten path to current block (pop blockHierarchy, attributeHierarchy, methodHierarchy) */ + private void popBlock() { + theBlock = blockHierarchy.get(blockHierarchy.size() -1); + blockHierarchy.remove(blockHierarchy.size() -1); + attributeMap = attributeHierarchy.get(attributeHierarchy.size() -1); + attributeHierarchy.remove(attributeHierarchy.size() -1); + methodMap = methodHierarchy.get(methodHierarchy.size() -1); + methodHierarchy.remove(methodHierarchy.size() -1); + stateMachine = machineHierarchy.remove(machineHierarchy.size() -1); + } + + + + /** set current attribute. Create-and-Register it if necessary. */ + private void getAttribute(String _name, String _type) { + theAttribute = attributeMap.get(_name); + if (theAttribute == null) { + theAttribute = new StxAttribute(_name, _type); + attributeMap.put(_name, theAttribute); + } + } + + /** set current method. Create-and-Register it if necessary. */ + private void getMethod(String _name) { + theStructure = new StxMethod(_name); + if (theStructure == null) { + theStructure = new StxMethod(_name); + methodMap.put(_name, (StxMethod)theStructure); + } + } + + /** set current state. Create-and-Register it if necessary. */ + private HashMap<String,StxState> stateMap; + private void getState(String _name) { + theState = stateMap.get(_name); + if (theState == null) { + theState = new StxState(_name); + stateMap.put(_name, theState); + } + } + + /** set current transition. Create and register it with current state if necessary */ + private void getTransition(int _index) { + theTransition = theState.getTransition(_index); + } + + /** (to avoid duplicates) not null if an index parameter has been encountered for current request */ + private Location indexArg; + /** (to avoid duplicates) not null if a delay parameter has been encountered for current request */ + private Location delayArg; + /** (to avoid duplicates) not null if a channel parameter has been encountered for current request */ + private Location channelArg; + /** (to avoid duplicates) not null if a payload parameter has been encountered for current request */ + private Location payloadArg; + /** (to avoid duplicates) not null if a timer parameter has been encountered for current request */ + private Location settimerArg; + /** (to avoid duplicates) not null if a timer parameter has been encountered for current request */ + private Location resettimerArg; + /** (to avoid duplicates) not null if a timer parameter has been encountered for current request */ + private Location expiretimerArg; + + private boolean argOK; + private void clearRequestArgs() { + indexArg = null; + delayArg = null; + channelArg = null; + payloadArg = null; + settimerArg = null; + resettimerArg = null; + expiretimerArg = null; + } + + private ArrayList<StxTerm> argList; + private ArrayList<StxAction> actionList; + private HashMap<String,String> receiveMap; + HashMap<String,String> delayExtraMap = null; + private StxCall theCall; + + /** (to avoid duplicates) not null if a distribution law attribute has been encountered for current transition labels section */ + private Location distributionLbl; + /** (to avoid duplicates) not null if a weight attribute has been encountered for current transition labels section */ + private Location weightLbl; + /** to clear the relevant anti-duplicate flags (locations) at the beginning of a transition labels section */ + private void clearTransitionLbls() { + distributionLbl = null; + weightLbl = null; + } + private boolean okRequest; + + /** customized error handling, throw exception with message, and location in lexer's errorLocation */ + public void report_fatal_error(String message, Object info) throws Exception { + this.done_parsing(); + ComplexSymbolFactory.ComplexSymbol cs = (ComplexSymbolFactory.ComplexSymbol)info; + lexer.setErrorLocation(cs.getLeft()); + throw new Exception("parser: syntax error for input symbol \"" + cs.getName() + "\""); + } + /** customized error handling */ + public void report_error(String message, Object info) {} + /** customized error handling */ + public void syntax_error(Symbol cur_token) {} + + /** set current transition w.r.t. requestIndex and request it and type it as trivial request (if not already requested) */ + private void tryTrivialRequest(Location left, Location right) { + getTransition(requestIndex); + if (theTransition.isRequested()) { + addError( new AvatarFromSysMLError( + AvatarFromSysMLError.LOWERROR, + left, + "Transition " + requestIndex + " is already requested", + theTransition.getRleft()) ); + } else { + theTransition.setRleft(left); + theTransition.setRright(right); + theTransition.setRequested(true); + theTransition.setType(AvatarFromSysMLSyntax.STXTRIVIALTRANSITION); + } + } + + /** a multiusage Flag */ + private boolean flag; + /** a block specific flag */ + private ArrayList<Boolean> blockFlags = new ArrayList<Boolean>(); + private void pushBlockFlag(Boolean f) { blockFlags.add(f); } + private boolean popBlockFlag() { + boolean res = blockFlags.get(blockFlags.size() -1); + blockFlags.remove(blockFlags.size() -1); + return res; + } + + + +/** Cup generated class to encapsulate user supplied action code.*/ +class CUP$AvatarFromSysMLParser$actions { + private final AvatarFromSysMLParser parser; + + /** Constructor */ + CUP$AvatarFromSysMLParser$actions(AvatarFromSysMLParser parser) { + this.parser = parser; + } + + /** Method 0 with the actual generated action code for actions 0 to 300. */ + public final java_cup.runtime.Symbol CUP$AvatarFromSysMLParser$do_action_part00000000( + int CUP$AvatarFromSysMLParser$act_num, + java_cup.runtime.lr_parser CUP$AvatarFromSysMLParser$parser, + java.util.Stack<java_cup.runtime.Symbol> CUP$AvatarFromSysMLParser$stack, + int CUP$AvatarFromSysMLParser$top) + throws java.lang.Exception + { + /* Symbol object for return from actions */ + java_cup.runtime.Symbol CUP$AvatarFromSysMLParser$result; + + /* select the action based on the action number */ + switch (CUP$AvatarFromSysMLParser$act_num) + { + /*. . . . . . . . . . . . . . . . . . . .*/ + case 0: // model ::= PACKAGE IDENT LBRAC featureList RBRAC + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("model",2, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 1: // $START ::= model EOF + { + Object RESULT =null; + Location start_valxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xleft; + Location start_valxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xright; + Object start_val = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1).<Object>value(); + RESULT = start_val; + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("$START",0, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + /* ACCEPT */ + CUP$AvatarFromSysMLParser$parser.done_parsing(); + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 2: // model ::= PACKAGE IDENT LBRAC RBRAC + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("model",2, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 3: // featureList ::= feature + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("featureList",3, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 4: // featureList ::= feature featureList + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("featureList",3, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 5: // feature ::= PRIVATE IMPORT + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("feature",4, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 6: // feature ::= PUBLIC IMPORT + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("feature",4, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 7: // feature ::= datatypeDecl + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("feature",4, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 8: // feature ::= relationDecl + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("feature",4, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 9: // feature ::= channelDecl + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("feature",4, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 10: // feature ::= signalBinding + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("feature",4, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 11: // feature ::= messageDecl + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("feature",4, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 12: // feature ::= blockDecl + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("feature",4, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 13: // feature ::= blockAlias + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("feature",4, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 14: // typeIdent ::= INTEGER_T + { + String RESULT =null; + RESULT = "Integer"; + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("typeIdent",0, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 15: // typeIdent ::= BOOLEAN_T + { + String RESULT =null; + RESULT = "Boolean"; + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("typeIdent",0, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 16: // typeIdent ::= IDENT + { + String RESULT =null; + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.peek().<Ident>value(); + RESULT = id.getAvatarName(); + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("typeIdent",0, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 17: // specializes ::= SPECIALIZES + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("specializes",5, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 18: // specializes ::= REFINES + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("specializes",5, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 19: // subsets ::= SUBSETS + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("subsets",6, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 20: // subsets ::= REFINES + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("subsets",6, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 21: // blockAlias ::= PART IDENT COLON AVBLOCK_T subsets blockChain EQUAL blockChain SEMICOLON + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("blockAlias",7, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-8), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 22: // blockChain ::= IDENT + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("blockChain",8, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 23: // blockChain ::= IDENT POINT blockChain + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("blockChain",8, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 24: // datatypeDecl ::= datatypeDeclHEADER LBRAC fieldDecls RBRAC + { + Object RESULT =null; + Location bxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location bxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object b = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + if (flag) theStructure.setRight(bxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("datatypeDecl",9, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 25: // datatypeDecl ::= datatypeDeclHEADER LBRAC RBRAC + { + Object RESULT =null; + Location bxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location bxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object b = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + if (flag) theStructure.setRight(bxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("datatypeDecl",9, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 26: // datatypeDeclHEADER ::= ATTRIBUTE DEF IDENT specializes AVDATATYPE_T + { + Object RESULT =null; + Location axleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xleft; + Location axright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xright; + Object a = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4).<Object>value(); + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<Ident>value(); + + theStructure = dataTypeMap.get(id.getAvatarName()); + if (theStructure == null) { + theStructure = new StxDataType(id.getAvatarName()); + dataTypeMap.put(id.getAvatarName(), (StxDataType) theStructure); + } + if (! theStructure.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, axleft, "Datatype " + id.getAvatarName() + + " is already declared", theStructure.getLeft()) ); + flag = false; + } else { + theStructure.setLeft(axleft); + flag = true; + } + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("datatypeDeclHEADER",10, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 27: // fieldDecls ::= fieldDecl + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("fieldDecls",11, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 28: // fieldDecls ::= fieldDecl fieldDecls + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("fieldDecls",11, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 29: // fieldDecl ::= fieldDeclBegin fieldVal SEMICOLON + { + Object RESULT =null; + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + theField.setRight(qxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("fieldDecl",12, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 30: // fieldDeclBegin ::= ATTRIBUTE IDENT COLON typeIdent + { + Object RESULT =null; + Location axleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xleft; + Location axright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xright; + Object a = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3).<Object>value(); + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<Ident>value(); + Location tpxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location tpxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + String tp = CUP$AvatarFromSysMLParser$stack.peek().<String>value(); + + theField = new StxField(axleft, axright, id.getAvatarName(), tp); + StxField clash = theStructure.addField(theField); + if (clash != null) // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHWARNING, axleft, "Field " + id.getAvatarName() + + " is already declared", clash.getLeft()) ); + theField.setLeft(axleft); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("fieldDeclBegin",63, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 31: // fieldVal ::= + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("fieldVal",64, CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 32: // fieldVal ::= GETS iexpr + { + Object RESULT =null; + Location exleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location exright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + String e = CUP$AvatarFromSysMLParser$stack.peek().<String>value(); + theField.setInitialValue(e); + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("fieldVal",64, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 33: // fieldVal ::= DEFAULT GETS iexpr + { + Object RESULT =null; + Location exleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location exright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + String e = CUP$AvatarFromSysMLParser$stack.peek().<String>value(); + theField.setInitialValue(e); theField.setDefaultValue(true); + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("fieldVal",64, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 34: // relationDecl ::= syncRelDecl + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("relationDecl",13, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 35: // relationDecl ::= nbfRelDecl + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("relationDecl",13, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 36: // relationDecl ::= bfRelDecl + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("relationDecl",13, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 37: // syncRelDecl ::= syncRelDeclBegin relParams RPAR SEMICOLON + { + Object RESULT =null; + Location xxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location xxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object x = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + if (flag) theRelation.setRight(xxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("syncRelDecl",14, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 38: // syncRelDeclBegin ::= PART IDENT COLON SYNCREL_T EQUAL SYNCREL_T LPAR + { + Object RESULT =null; + Location pxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-6)).xleft; + Location pxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-6)).xright; + Object p = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-6).<Object>value(); + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5)).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5)).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5).<Ident>value(); + + Location l = idxleft; + getRelation(id.getAvatarName()); + if (! theRelation.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Relation " + id.getAvatarName() + + " is already declared", theRelation.getLeft()) ); + flag = false; + } else { + theRelation.setAsynchronous(false); + theRelation.setLeft(pxleft); + flag = true; + } + clearRelationParams(); // at beginning, no parameter has been parsed + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("syncRelDeclBegin",24, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-6), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 39: // nbfRelDecl ::= nbfRelDeclBegin relParams RPAR SEMICOLON + { + Object RESULT =null; + Location xxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location xxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object x = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + if (flag) theRelation.setRight(xxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("nbfRelDecl",15, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 40: // nbfRelDeclBegin ::= PART IDENT COLON NBFIFOREL_T EQUAL NBFIFOREL_T LPAR + { + Object RESULT =null; + Location pxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-6)).xleft; + Location pxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-6)).xright; + Object p = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-6).<Object>value(); + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5)).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5)).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5).<Ident>value(); + + getRelation(id.getAvatarName()); + if (! theRelation.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Relation " + id.getAvatarName() + + " is already declared", theRelation.getLeft()) ); + flag = false; + } else { + theRelation.setAsynchronous(true); + theRelation.setBlocking(false); + theRelation.setLeft(pxleft); + flag = true; + } + clearRelationParams(); // at beginning, no parameter has been parsed + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("nbfRelDeclBegin",25, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-6), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 41: // bfRelDecl ::= bfRelDeclBegin relParams RPAR SEMICOLON + { + Object RESULT =null; + Location xxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location xxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object x = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + if (flag) theRelation.setRight(xxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("bfRelDecl",16, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 42: // bfRelDeclBegin ::= PART IDENT COLON BFIFOREL_T EQUAL BFIFOREL_T LPAR + { + Object RESULT =null; + Location pxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-6)).xleft; + Location pxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-6)).xright; + Object p = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-6).<Object>value(); + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5)).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5)).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5).<Ident>value(); + + getRelation(id.getAvatarName()); + if (! theRelation.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Relation " + id.getAvatarName() + + " is already declared", theRelation.getLeft()) ); + flag = false; + } else { + theRelation.setAsynchronous(true); + theRelation.setBlocking(true); + theRelation.setLeft(pxleft); + flag = true; + } + clearRelationParams(); // at beginning, no parameter has been parsed + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("bfRelDeclBegin",26, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-6), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 43: // relParams ::= relParam + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("relParams",17, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 44: // relParams ::= relParam COMMA relParams + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("relParams",17, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 45: // relParam ::= block1Param + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("relParam",18, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 46: // relParam ::= block2Param + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("relParam",18, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 47: // relParam ::= privateParam + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("relParam",18, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 48: // relParam ::= maxsizeParam + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("relParam",18, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 49: // relParam ::= lossyParam + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("relParam",18, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 50: // block1Param ::= BLOCK1_F EQUAL IDENT + { + Object RESULT =null; + Location bxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location bxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + Object b = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<Object>value(); + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.peek().<Ident>value(); + + if (block1ParamFlag == null) { // param has not yet been parsed + StxBlock tmp = theBlock; + getBlock(id.getAvatarName()); + theRelation.setBlock1(theBlock); + theBlock = tmp; + block1ParamFlag = bxleft; // now, param has been parsed + } else + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHWARNING,bxleft,"bloc1 is already set\n", block1ParamFlag)); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("block1Param",19, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 51: // block2Param ::= BLOCK2_F EQUAL IDENT + { + Object RESULT =null; + Location bxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location bxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + Object b = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<Object>value(); + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.peek().<Ident>value(); + + if (block2ParamFlag == null) { // param has not yet been parsed + StxBlock tmp = theBlock; // save current block + getBlock(id.getAvatarName()); + theRelation.setBlock2(theBlock); // set param + theBlock = tmp; // restore current block + block2ParamFlag = bxleft; // now, param has been parsed + } else + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHWARNING, bxleft,"bloc2 is already set\n", block2ParamFlag)); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("block2Param",20, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 52: // privateParam ::= PRIVATE_F EQUAL BOOL + { + Object RESULT =null; + Location pxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location pxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + Object p = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<Object>value(); + Location bxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location bxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Boolean b = CUP$AvatarFromSysMLParser$stack.peek().<Boolean>value(); + + if (privateParamFlag == null) { // param has not yet been parsed + theRelation.setPrivate(b); // set param + privateParamFlag = pxleft; // now, param has been parsed + } else + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHWARNING, bxleft,"private parameter is already set\n", privateParamFlag)); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("privateParam",21, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 53: // maxsizeParam ::= MAXSIZE_F EQUAL INT + { + Object RESULT =null; + Location zxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location zxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + Object z = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<Object>value(); + Location ixleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location ixright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Integer i = CUP$AvatarFromSysMLParser$stack.peek().<Integer>value(); + + if (maxsizeParamFlag == null) { // param has not yet been parsed + if (! theRelation.getAsynchronous()) // irrelevant parameter + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, zxleft, "synchroneous relations don't have maxsize parameter\n")); + else { + theRelation.setFifoSize(i); // set param + maxsizeParamFlag = zxleft; // now, param has been parsed + } + } else + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHWARNING, zxleft, "maxsize is already set\n", maxsizeParamFlag)); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("maxsizeParam",22, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 54: // lossyParam ::= LOSSY_F EQUAL BOOL + { + Object RESULT =null; + Location zxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location zxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + Object z = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<Object>value(); + Location bxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location bxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Boolean b = CUP$AvatarFromSysMLParser$stack.peek().<Boolean>value(); + + if (lossyParamFlag == null) { // param has not yet been parsed + if (! theRelation.getAsynchronous()) // irrelevant parameter + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, zxleft, "synchroneous relations don't have lossy parameter\n")); + else { + theRelation.setLossy(b); // set param + lossyParamFlag = zxleft; // now, param has been parsed + } + } else + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHWARNING, zxleft, "lossy is already set\n", lossyParamFlag)); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("lossyParam",23, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 55: // channelDecl ::= syncChDecl + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("channelDecl",27, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 56: // channelDecl ::= nbfChDecl + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("channelDecl",27, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 57: // channelDecl ::= bfChDecl + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("channelDecl",27, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 58: // syncChDecl ::= PART IDENT COLON SYNC_T EQUAL SYNC_T LPAR RELATION_F EQUAL IDENT RPAR SEMICOLON + { + Object RESULT =null; + Location pxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-11)).xleft; + Location pxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-11)).xright; + Object p = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-11).<Object>value(); + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-10)).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-10)).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-10).<Ident>value(); + Location rlxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location rlxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + Ident rl = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<Ident>value(); + Location sxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location sxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object s = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + getRelation(rl.getAvatarName()); + getChannel(id.getAvatarName()); + if (! theChannel.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Channel " + id.getAvatarName() + + " is already declared", theChannel.getLeft()) ); + } else { + if (theRelation.getAsynchronous()) // incompatible relation and channel types + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHWARNING, + pxleft, "synchroneous channels require a synchroneous relation\n")); + theRelation.addChannel(theChannel); + theChannel.setLeft(pxleft); + theChannel.setRight(sxright); + } + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("syncChDecl",28, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-11), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 59: // nbfChDecl ::= PART IDENT COLON NBFIFO_T EQUAL NBFIFO_T LPAR RELATION_F EQUAL IDENT RPAR SEMICOLON + { + Object RESULT =null; + Location pxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-11)).xleft; + Location pxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-11)).xright; + Object p = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-11).<Object>value(); + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-10)).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-10)).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-10).<Ident>value(); + Location rlxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location rlxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + Ident rl = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<Ident>value(); + Location sxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location sxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object s = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + getRelation(rl.getAvatarName()); + getChannel(id.getAvatarName()); + if (! theChannel.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Channel " + id.getAvatarName() + + " is already declared", theChannel.getLeft()) ); + } else { + if (! theRelation.getAsynchronous()) // incompatible relation and channel types + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHWARNING, + pxleft, "FIFO channels require an asynchroneous relation\n")); + theRelation.addChannel(theChannel); + theChannel.setLeft(pxleft); + theChannel.setRight(sxright); + } + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("nbfChDecl",29, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-11), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 60: // bfChDecl ::= PART IDENT COLON BFIFO_T EQUAL BFIFO_T LPAR RELATION_F EQUAL IDENT RPAR SEMICOLON + { + Object RESULT =null; + Location pxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-11)).xleft; + Location pxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-11)).xright; + Object p = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-11).<Object>value(); + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-10)).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-10)).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-10).<Ident>value(); + Location rlxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location rlxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + Ident rl = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<Ident>value(); + Location sxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location sxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object s = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + getRelation(rl.getAvatarName()); + getChannel(id.getAvatarName()); + if (! theChannel.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Channel " + id.getAvatarName() + + " is already declared", theChannel.getLeft()) ); + } else { + if (! theRelation.getAsynchronous()) // incompatible relation and channel types + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHWARNING, + pxleft, "FIFO channels require an asynchroneous relation\n")); + theRelation.addChannel(theChannel); + theChannel.setLeft(pxleft); + theChannel.setRight(sxright); + } + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("bfChDecl",30, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-11), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 61: // signalBinding ::= inSignalBinding + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("signalBinding",31, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 62: // signalBinding ::= outSignalBinding + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("signalBinding",31, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 63: // inSignalBinding ::= BINDING COLON INSIGNALBINDING_T BIND IDENT POINT IDENT EQUAL IDENT SEMICOLON + { + Object RESULT =null; + Location bxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5)).xleft; + Location bxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5)).xright; + Ident b = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5).<Ident>value(); + Location sxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xleft; + Location sxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xright; + Ident s = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3).<Ident>value(); + Location cxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xleft; + Location cxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xright; + Ident c = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1).<Ident>value(); + + getChannel(c.getAvatarName()); // set relevant channel as current + StxBlock tmp = theBlock; // save current block + getBlock(b.getAvatarName()); // get block of signal (in current block) + getSignal(b.getAvatarName(),s.getAvatarName()); // set relevant signal as current + theSignal.setInput(true); // update structure + theBlock.addSignal(theSignal); // update structure + theSignal.setChannel(theChannel); // update structure + theChannel.setSignal(b.getAvatarName(), theSignal); // update structure + theBlock = tmp; // restore current block + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("inSignalBinding",32, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-9), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 64: // inSignalBinding ::= BINDING COLON INSIGNALBINDING_T BIND IDENT EQUAL IDENT POINT IDENT SEMICOLON + { + Object RESULT =null; + Location cxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5)).xleft; + Location cxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5)).xright; + Ident c = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5).<Ident>value(); + Location bxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xleft; + Location bxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xright; + Ident b = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3).<Ident>value(); + Location sxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xleft; + Location sxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xright; + Ident s = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1).<Ident>value(); + + getChannel(c.getAvatarName()); // set relevant channel as current + StxBlock tmp = theBlock; // save current block + getBlock(b.getAvatarName()); // get block of signal (in current block) + getSignal(b.getAvatarName(),s.getAvatarName()); // set relevant signal as current + theSignal.setInput(true); // update structure + theBlock.addSignal(theSignal); // update structure + theSignal.setChannel(theChannel); // update structure + theChannel.setSignal(b.getAvatarName(), theSignal); // update structure + theBlock = tmp; // restore current block + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("inSignalBinding",32, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-9), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 65: // outSignalBinding ::= BINDING COLON OUTSIGNALBINDING_T BIND IDENT POINT IDENT EQUAL IDENT SEMICOLON + { + Object RESULT =null; + Location bxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5)).xleft; + Location bxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5)).xright; + Ident b = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5).<Ident>value(); + Location sxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xleft; + Location sxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xright; + Ident s = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3).<Ident>value(); + Location cxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xleft; + Location cxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xright; + Ident c = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1).<Ident>value(); + + getChannel(c.getAvatarName()); // set relevant channel as current + StxBlock tmp = theBlock; // save current block + getBlock(b.getAvatarName()); // get block of signal (in current block) + getSignal(b.getAvatarName(),s.getAvatarName()); // set relevant signal as current + theSignal.setInput(false); // update structure + theBlock.addSignal(theSignal); // update structure + theSignal.setChannel(theChannel); // update structure + theChannel.setSignal(b.getAvatarName(), theSignal); // update structure + theBlock = tmp; // restore current block + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("outSignalBinding",33, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-9), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 66: // outSignalBinding ::= BINDING COLON OUTSIGNALBINDING_T BIND IDENT EQUAL IDENT POINT IDENT SEMICOLON + { + Object RESULT =null; + Location cxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5)).xleft; + Location cxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5)).xright; + Ident c = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5).<Ident>value(); + Location bxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xleft; + Location bxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xright; + Ident b = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3).<Ident>value(); + Location sxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xleft; + Location sxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xright; + Ident s = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1).<Ident>value(); + + getChannel(c.getAvatarName()); // set relevant channel as current + StxBlock tmp = theBlock; // save current block + getBlock(b.getAvatarName()); // get block of signal (in current block) + getSignal(b.getAvatarName(),s.getAvatarName()); // set relevant signal as current + theSignal.setInput(false); // update structure + theBlock.addSignal(theSignal); // update structure + theSignal.setChannel(theChannel); // update structure + theChannel.setSignal(b.getAvatarName(), theSignal); // update structure + theBlock = tmp; // restore current block + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("outSignalBinding",33, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-9), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 67: // messageDecl ::= inMessageDecl + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("messageDecl",34, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 68: // messageDecl ::= outMessageDecl + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("messageDecl",34, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 69: // inMessageDecl ::= inMessageDeclBegin inMessageDeclBODY + { + Object RESULT =null; + Location mxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xleft; + Location mxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xright; + Object m = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1).<Object>value(); + Location bxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location bxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object b = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + if (messageChannelParam == null) // missing channel parameter + addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, mxleft, "In-message channel has not been set", null) ); + if (flag) theStructure.setRight(bxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("inMessageDecl",35, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 70: // inMessageDeclBegin ::= PART DEF IDENT specializes INMESSAGE_T LBRAC + { + Object RESULT =null; + Location pxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5)).xleft; + Location pxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5)).xright; + Object p = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5).<Object>value(); + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3).<Ident>value(); + + getInMessage(id.getAvatarName()); + if (! theStructure.declare() ) { //duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "In-message profile " + id.getAvatarName() + + " is already declared", theStructure.getLeft()) ); + flag = false; + } else { + theStructure.setLeft(pxleft); + messageChannelParam = null; + flag = true; + } + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("inMessageDeclBegin",41, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 71: // inMessageDeclBODY ::= messageChannel RBRAC + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("inMessageDeclBODY",37, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 72: // inMessageDeclBODY ::= messageChannel fieldDecls RBRAC + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("inMessageDeclBODY",37, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 73: // inMessageDeclBODY ::= fieldDecls messageChannel RBRAC + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("inMessageDeclBODY",37, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 74: // messageChannel ::= PRIVATE PART CHANNEL_F COLON CHANNEL_T EQUAL IDENT SEMICOLON + { + Object RESULT =null; + Location pxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-7)).xleft; + Location pxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-7)).xright; + Object p = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-7).<Object>value(); + Location chxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xleft; + Location chxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xright; + Ident ch = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1).<Ident>value(); + + if (messageChannelParam != null) // duplicate + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, + "in-message channel has already been set", messageChannelParam)); + else { // message param is not set + getChannel(ch.getAvatarName()); + theChannel.setInProfile((StxInMessage)theStructure); + ((StxInMessage)theStructure).setChannel(theChannel); + messageChannelParam = pxleft; // now it is + } + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("messageChannel",38, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-7), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 75: // messageChannel ::= PRIVATE PART CHANNEL_F EQUAL IDENT SEMICOLON + { + Object RESULT =null; + Location pxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5)).xleft; + Location pxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5)).xright; + Object p = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5).<Object>value(); + Location chxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xleft; + Location chxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xright; + Ident ch = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1).<Ident>value(); + + if (messageChannelParam != null) // duplicate + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, + "in-message channel has already been set", messageChannelParam)); + else { // message param is not set + getChannel(ch.getAvatarName()); + theChannel.setInProfile((StxInMessage)theStructure); + ((StxInMessage)theStructure).setChannel(theChannel); + messageChannelParam = pxleft; // now it is + } + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("messageChannel",38, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 76: // outMessageDecl ::= outMessageDeclBegin SEMICOLON + { + Object RESULT =null; + Location bxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location bxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object b = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + if (flag) theOutMessage.setRight(bxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("outMessageDecl",36, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 77: // outMessageDecl ::= outMessageDeclBegin LBRAC RBRAC + { + Object RESULT =null; + Location bxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location bxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object b = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + if (flag) theOutMessage.setRight(bxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("outMessageDecl",36, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 78: // outMessageDecl ::= outMessageDeclBegin LBRAC outMessageDeclBODY + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("outMessageDecl",36, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 79: // outMessageDeclBegin ::= PART DEF IDENT specializes OUTMESSAGE_T COMMA IDENT + { + Object RESULT =null; + Location pxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-6)).xleft; + Location pxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-6)).xright; + Object p = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-6).<Object>value(); + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4).<Ident>value(); + Location mxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location mxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Ident m = CUP$AvatarFromSysMLParser$stack.peek().<Ident>value(); + + getInMessage(m.getAvatarName()); + getOutMessage(id.getAvatarName(), (StxInMessage)theStructure); + if (! theOutMessage.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Out-message profile " + id.getAvatarName() + + " is already declared", theStructure.getLeft()) ); + flag = false; + } else { + theOutMessage.setLeft(pxleft); + flag = true; + } + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("outMessageDeclBegin",42, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-6), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 80: // outMessageDeclBegin ::= PART DEF IDENT specializes IDENT COMMA OUTMESSAGE_T + { + Object RESULT =null; + Location pxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-6)).xleft; + Location pxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-6)).xright; + Object p = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-6).<Object>value(); + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4).<Ident>value(); + Location mxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location mxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + Ident m = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<Ident>value(); + + getInMessage(m.getAvatarName()); + if (! theOutMessage.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Out-message profile " + id.getAvatarName() + + " is already declared", theStructure.getLeft()) ); + flag = false; + } else { + theOutMessage.setLeft(pxleft); + flag = true; + } + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("outMessageDeclBegin",42, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-6), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 81: // outMessageDeclBODY ::= redefineField RBRAC + { + Object RESULT =null; + Location bxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location bxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object b = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + if (flag) theOutMessage.setRight(bxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("outMessageDeclBODY",39, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 82: // outMessageDeclBODY ::= redefineField outMessageDeclBODY + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("outMessageDeclBODY",39, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 83: // redefineField ::= ATTRIBUTE IDENT REDEFINES IDENT SEMICOLON + { + Object RESULT =null; + Location axleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xleft; + Location axright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xright; + Object a = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4).<Object>value(); + Location oxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xleft; + Location oxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xright; + Ident o = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3).<Ident>value(); + Location ixleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xleft; + Location ixright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xright; + Ident i = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1).<Ident>value(); + + StxField ofield = new StxField(axleft, axright, o.getAvatarName(), ""); + // maps output field to its dual input field + if (! theOutMessage.addFieldLink(ofield, i.getAvatarName())) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, axleft, "Field " + o.getAvatarName() + + " is already declared") ); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("redefineField",40, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 84: // blockDecl ::= blockDeclBegin RBRAC + { + Object RESULT =null; + Location exleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location exright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object e = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + if (popBlockFlag()) theBlock.setRight(exright); popBlock(); + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("blockDecl",43, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 85: // blockDecl ::= blockDeclBegin blockDeclBODY + { + Object RESULT =null; + Location exleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location exright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object e = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + if (popBlockFlag()) theBlock.setRight(exright); popBlock(); + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("blockDecl",43, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 86: // blockDeclBegin ::= PART IDENT COLON AVBLOCK_T LBRAC + { + Object RESULT =null; + Location pxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xleft; + Location pxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xright; + Object p = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4).<Object>value(); + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3).<Ident>value(); + + StxBlock tmp = theBlock; // locally memorize father + pushBlock(); // globally memorize father state + getBlock(id.getAvatarName()); // set current block + if (! theBlock.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Block " + id.getAvatarName() + + " is already declared", theBlock.getLeft()) ); + pushBlockFlag(false); + } else { + theBlock.setFather(tmp); + theBlock.setLeft(pxleft); + pushBlockFlag(true); + } + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("blockDeclBegin",44, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 87: // blockDeclBODY ::= blockItem RBRAC + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("blockDeclBODY",45, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 88: // blockDeclBODY ::= blockItem blockDeclBODY + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("blockDeclBODY",45, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 89: // blockItem ::= attributeDecl + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("blockItem",46, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 90: // blockItem ::= constantDecl + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("blockItem",46, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 91: // blockItem ::= methodDecl + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("blockItem",46, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 92: // blockItem ::= signalDecl + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("blockItem",46, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 93: // blockItem ::= timerDecl + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("blockItem",46, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 94: // blockItem ::= stateMachine + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("blockItem",46, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 95: // blockItem ::= blockDecl + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("blockItem",46, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 96: // attributeDecl ::= attributeDeclHEADER SEMICOLON + { + Object RESULT =null; + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + if (flag) theAttribute.setRight(qxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("attributeDecl",47, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 97: // attributeDecl ::= attributeDeclHEADER GETS iexpr SEMICOLON + { + Object RESULT =null; + Location exleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xleft; + Location exright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xright; + String e = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1).<String>value(); + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + theAttribute.setInit(e); + if (flag) theAttribute.setRight(qxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("attributeDecl",47, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 98: // attributeDecl ::= attributeDeclHEADER DEFAULT GETS iexpr SEMICOLON + { + Object RESULT =null; + Location exleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xleft; + Location exright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xright; + String e = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1).<String>value(); + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + theAttribute.setInit(e); + if (flag) theAttribute.setRight(qxright); + theAttribute.setDefaultValue(true); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("attributeDecl",47, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 99: // attributeDeclHEADER ::= ATTRIBUTE IDENT COLON typeIdent + { + Object RESULT =null; + Location axleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xleft; + Location axright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xright; + Object a = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3).<Object>value(); + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<Ident>value(); + Location tpxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location tpxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + String tp = CUP$AvatarFromSysMLParser$stack.peek().<String>value(); + + getAttribute(id.getAvatarName(), tp); + if (! theAttribute.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, axleft, "Attribute " + id.getAvatarName() + + " is already declared (or there is an attribute with same name)", theAttribute.getLeft()) ); + flag = false; + } else { + StxElement e = theBlock.addAttribute(theAttribute); + if (e != null) + if (e instanceof StxTimer) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, axleft, "Attribute " + id.getAvatarName() + + " cannot be added: name already used for method", e.getLeft())); + else if (e instanceof StxMethod) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, axleft, "Attribute " + id.getAvatarName() + + " cannot be added: name already used for method", e.getLeft())); + else if (e instanceof StxSignal) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, axleft, "Attribute " + id.getAvatarName() + + " cannot be added: name already used for signal", e.getLeft())); + else ; + flag = true; + theAttribute.setLeft(axleft); + } + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("attributeDeclHEADER",49, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 100: // constantDecl ::= constantDeclHEADER SEMICOLON + { + Object RESULT =null; + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + if (flag) theAttribute.setRight(qxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("constantDecl",48, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 101: // constantDecl ::= constantDeclHEADER GETS iexpr SEMICOLON + { + Object RESULT =null; + Location exleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xleft; + Location exright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xright; + String e = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1).<String>value(); + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + theAttribute.setInit(e); + if (flag) theAttribute.setRight(qxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("constantDecl",48, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 102: // constantDeclHEADER ::= READONLY ATTRIBUTE IDENT COLON typeIdent + { + Object RESULT =null; + Location rxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xleft; + Location rxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xright; + Object r = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4).<Object>value(); + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<Ident>value(); + Location tpxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location tpxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + String tp = CUP$AvatarFromSysMLParser$stack.peek().<String>value(); + + getAttribute(id.getAvatarName(), tp); + if (! theAttribute.declare() ) { + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, rxleft, "Constant " + id.getAvatarName() + + " is already declared (or there is an attribute with same name)", theAttribute.getLeft()) ); + flag = false; + } else { + StxElement e = theBlock.addConstant(theAttribute); + if (e != null) + if (e instanceof StxTimer) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, rxleft, "Constant " + id.getAvatarName() + + " cannot be added: name already used for method", e.getLeft())); + else if (e instanceof StxMethod) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, rxleft, "Constant " + id.getAvatarName() + + " cannot be added: name already used for method", e.getLeft())); + else if (e instanceof StxSignal) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, rxleft, "Constant " + id.getAvatarName() + + " cannot be added: name already used for signal", e.getLeft())); + else ; + flag = true; + theAttribute.setLeft(rxleft); + } + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("constantDeclHEADER",62, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 103: // methodDecl ::= voidMethodDecl + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("methodDecl",50, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 104: // methodDecl ::= calcMethodDecl + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("methodDecl",50, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 105: // voidMethodDecl ::= voidMethodDeclBegin LBRAC RBRAC + { + Object RESULT =null; + Location bxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location bxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object b = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + if (flag) theStructure.setRight(bxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("voidMethodDecl",51, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 106: // voidMethodDecl ::= voidMethodDeclBegin SEMICOLON + { + Object RESULT =null; + Location bxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location bxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object b = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + if (flag) theStructure.setRight(bxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("voidMethodDecl",51, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 107: // voidMethodDecl ::= voidMethodDeclBegin LBRAC fieldDecls RBRAC + { + Object RESULT =null; + Location bxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location bxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object b = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + if (flag) theStructure.setRight(bxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("voidMethodDecl",51, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 108: // voidMethodDeclBegin ::= ACTION IDENT COLON AVVOIDMETHOD_T + { + Object RESULT =null; + Location axleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xleft; + Location axright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xright; + Object a = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3).<Object>value(); + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<Ident>value(); + + getMethod(id.getAvatarName()); + if (! theStructure.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, axleft, "Method " + id.getAvatarName() + + " is already declared", theStructure.getLeft()) ); + flag = false; + } else { + StxElement e = theBlock.addMethod((StxMethod)theStructure); + if (e != null) + if (e instanceof StxTimer) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, axleft, "Method " + id.getAvatarName() + + " cannot be added: name already used for timer", e.getLeft())); + else if (e instanceof StxAttribute) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, axleft, "Method " + id.getAvatarName() + + " cannot be added: name already used for constant or attribute", e.getLeft())); + else if (e instanceof StxSignal) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, axleft, "Method " + id.getAvatarName() + + " cannot be added: name already used for signal", e.getLeft())); + else ; + flag = true; + theStructure.setLeft(axleft); + } + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("voidMethodDeclBegin",60, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 109: // calcMethodDecl ::= calcMethodDeclBegin LBRAC RBRAC + { + Object RESULT =null; + Location bxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location bxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object b = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + if (flag) theStructure.setRight(bxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("calcMethodDecl",52, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 110: // calcMethodDecl ::= calcMethodDeclBegin LBRAC calcMethodItems RBRAC + { + Object RESULT =null; + Location bxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location bxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object b = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + if (flag) theStructure.setRight(bxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("calcMethodDecl",52, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 111: // calcMethodDeclBegin ::= CALC IDENT COLON AVCALCMETHOD_T + { + Object RESULT =null; + Location cxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xleft; + Location cxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xright; + Object c = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3).<Object>value(); + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<Ident>value(); + + getMethod(id.getAvatarName()); + if (! theStructure.declare() ) { + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, cxleft, "Method " + id.getAvatarName() + + " is already declared", theStructure.getLeft()) ); + flag = false; + } else { + StxElement e = theBlock.addMethod((StxMethod)theStructure); + if (e != null) + if (e instanceof StxTimer) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, cxleft, "Method " + id.getAvatarName() + + " cannot be added: name already used for timer", e.getLeft())); + else if (e instanceof StxAttribute) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, cxleft, "Method " + id.getAvatarName() + + " cannot be added: name already used for constant or attribute", e.getLeft())); + else if (e instanceof StxSignal) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, cxleft, "Method " + id.getAvatarName() + + " cannot be added: name already used for signal", e.getLeft())); + else ; + flag = true; + theStructure.setLeft(cxleft); + } + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("calcMethodDeclBegin",61, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 112: // calcMethodItems ::= calcMethodItem + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("calcMethodItems",53, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 113: // calcMethodItems ::= calcMethodItem calcMethodItems + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("calcMethodItems",53, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 114: // calcMethodItem ::= fieldDecl + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("calcMethodItem",54, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 115: // calcMethodItem ::= RETURN COLON typeIdent SEMICOLON + { + Object RESULT =null; + Location tpxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xleft; + Location tpxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xright; + String tp = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1).<String>value(); + + ((StxMethod)theStructure).setReturnType(tp); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("calcMethodItem",54, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 116: // signalDecl ::= PART IDENT COLON FIFO_T SEMICOLON + { + Object RESULT =null; + Location pxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xleft; + Location pxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xright; + Object p = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4).<Object>value(); + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3).<Ident>value(); + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + getSignal(theBlock.getName(),id.getAvatarName()); + if (! theSignal.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Signal " + id.getAvatarName() + + " is already declared", theSignal.getLeft()) ); + } else { + StxElement e = theBlock.addSignal(theSignal); + if (e != null) + if (e instanceof StxTimer) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Signal " + id.getAvatarName() + + " cannot be added: name already used for timer", e.getLeft())); + else if (e instanceof StxAttribute) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Signal " + id.getAvatarName() + + " cannot be added: name already used for constant or attribute", e.getLeft())); + else if (e instanceof StxMethod) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Signal " + id.getAvatarName() + + " cannot be added: name already used for method", e.getLeft())); + else; + theSignal.setLeft(pxleft); + theSignal.setRight(qxright); + } + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("signalDecl",55, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 117: // signalDecl ::= PART IDENT COLON CHANNEL_T SEMICOLON + { + Object RESULT =null; + Location pxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xleft; + Location pxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xright; + Object p = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4).<Object>value(); + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3).<Ident>value(); + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + getSignal(theBlock.getName(),id.getAvatarName()); + if (! theSignal.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Signal " + id.getAvatarName() + + " is already declared", theSignal.getLeft()) ); + } else { + StxElement e = theBlock.addSignal(theSignal); + if (e != null) + if (e instanceof StxTimer) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Signal " + id.getAvatarName() + + " cannot be added: name already used for timer", e.getLeft())); + else if (e instanceof StxAttribute) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Signal " + id.getAvatarName() + + " cannot be added: name already used for constant or attribute", e.getLeft())); + else if (e instanceof StxMethod) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Signal " + id.getAvatarName() + + " cannot be added: name already used for method", e.getLeft())); + else; + theSignal.setLeft(pxleft); + theSignal.setRight(qxright); + } + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("signalDecl",55, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 118: // timerDecl ::= PART IDENT COLON AVTIMER_T EQUAL AVTIMER_T LPAR RPAR SEMICOLON + { + Object RESULT =null; + Location pxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-8)).xleft; + Location pxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-8)).xright; + Object p = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-8).<Object>value(); + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-7)).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-7)).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-7).<Ident>value(); + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + StxTimer t = new StxTimer(id.getAvatarName(), pxleft, qxright); + StxElement e = theBlock.addTimer(t); + if (e != null) // conflict with existing item e + if (e instanceof StxTimer && !e.declare()) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Timer " + id.getAvatarName() + + " is already declared", e.getLeft())); + else if (e instanceof StxAttribute) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Timer " + id.getAvatarName() + + " cannot be added: name already used for constant or attribute", e.getLeft())); + else if (e instanceof StxMethod) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Timer " + id.getAvatarName() + + " cannot be added: name already used for method", e.getLeft())); + else if (e instanceof StxSignal) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Timer " + id.getAvatarName() + + " cannot be added: name already used for signal", e.getLeft())); + else ; + else t.declare(); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("timerDecl",56, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-8), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 119: // timerDecl ::= PART IDENT COLON AVTIMER_T SEMICOLON + { + Object RESULT =null; + Location pxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xleft; + Location pxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xright; + Object p = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4).<Object>value(); + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3).<Ident>value(); + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + StxTimer t = new StxTimer(id.getAvatarName(), pxleft, qxright); + StxElement e = theBlock.addTimer(t); + if (e != null) // conflict with existing item e + if (e instanceof StxTimer && !e.declare()) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Timer " + id.getAvatarName() + + " is already declared", e.getLeft())); + else if (e instanceof StxAttribute) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Timer " + id.getAvatarName() + + " cannot be added: name already used for constant or attribute", e.getLeft())); + else if (e instanceof StxMethod) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Timer " + id.getAvatarName() + + " cannot be added: name already used for method", e.getLeft())); + else if (e instanceof StxSignal) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Timer " + id.getAvatarName() + + " cannot be added: name already used for signal", e.getLeft())); + else ; + else t.declare(); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("timerDecl",56, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 120: // stateMachine ::= stateMachineBegin LBRAC stateMachineItems RBRAC + { + Object RESULT =null; + + theBlock.setStates(stateMap.values().toArray(new StxState[0])); // all collected information is put in block states + stateMap = null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("stateMachine",57, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 121: // stateMachine ::= stateMachineBegin LBRAC RBRAC + { + Object RESULT =null; + + theBlock.setStates(stateMap.values().toArray(new StxState[0])); // all collected information is put in block states + stateMap = null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("stateMachine",57, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 122: // stateMachine ::= stateMachineBegin SEMICOLON + { + Object RESULT =null; + + theBlock.setStates(stateMap.values().toArray(new StxState[0])); // all collected information is put in block states + stateMap = null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("stateMachine",57, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 123: // stateMachineBegin ::= EXHIBIT STATE STATEMACHINE COLON AVSTATEMACHINE_T + { + Object RESULT =null; + Location exleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xleft; + Location exright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xright; + Object e = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4).<Object>value(); + + if (stateMachine != null) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, exleft, + "State Machine is already declared", stateMachine) ); + else + stateMachine = exleft; + + stateMap = new HashMap<String, StxState>(); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("stateMachineBegin",119, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 124: // stateMachineItems ::= stateMachineItem + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("stateMachineItems",58, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 125: // stateMachineItems ::= stateMachineItem stateMachineItems + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("stateMachineItems",58, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 126: // stateMachineItem ::= state + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("stateMachineItem",59, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 127: // stateMachineItem ::= transition + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("stateMachineItem",59, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 128: // state ::= standardState + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("state",65, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 129: // state ::= stopState + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("state",65, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 130: // state ::= startState + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("state",65, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 131: // state ::= sendState + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("state",65, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 132: // state ::= receiveState + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("state",65, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 133: // state ::= randomState + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("state",65, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 134: // state ::= countState + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("state",65, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 135: // state ::= presendState + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("state",65, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 136: // state ::= prereceiveState + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("state",65, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 137: // state ::= setTimerState + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("state",65, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 138: // state ::= resetTimerState + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("state",65, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 139: // state ::= expireTimerState + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("state",65, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 140: // startState ::= startStateBegin SEMICOLON + { + Object RESULT =null; + Location bxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xleft; + Location bxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xright; + Object b = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1).<Object>value(); + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + tryTrivialRequest(bxleft, qxright); + if (flag) theState.setRight(qxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("startState",66, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 141: // startState ::= startStateBegin EQUAL AVSTARTSTATE_T LPAR RPAR SEMICOLON + { + Object RESULT =null; + Location bxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5)).xleft; + Location bxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5)).xright; + Object b = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5).<Object>value(); + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + tryTrivialRequest(bxleft, qxright); + if (flag) theState.setRight(qxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("startState",66, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 142: // startState ::= startStateBegin EQUAL AVSTARTSTATE_T LPAR requestParam RPAR SEMICOLON + { + Object RESULT =null; + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + if (flag) theState.setRight(qxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("startState",66, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-6), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 143: // startStateBegin ::= ENTRY ACTION IDENT COLON AVSTARTSTATE_T + { + Object RESULT =null; + Location zxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xleft; + Location zxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xright; + Object z = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4).<Object>value(); + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<Ident>value(); + + getState(id.getAvatarName()); + if (! theState.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, zxleft, "State " + id.getAvatarName() + + " is already declared", theState.getLeft()) ); + requestIndex = 0; + flag = false; + } else { + theState.setType(AvatarFromSysMLSyntax.STXSTARTSTATE); + theState.setLeft(zxright); + requestIndex = 0; + flag = true; + } + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("startStateBegin",107, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 144: // standardState ::= standardStateBegin SEMICOLON + { + Object RESULT =null; + Location bxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xleft; + Location bxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xright; + Object b = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1).<Object>value(); + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + tryTrivialRequest(bxleft, qxright); + if (flag) theState.setRight(qxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("standardState",67, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 145: // standardState ::= standardStateBegin EQUAL AVSTANDARDSTATE_T LPAR RPAR SEMICOLON + { + Object RESULT =null; + Location bxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5)).xleft; + Location bxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5)).xright; + Object b = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5).<Object>value(); + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + tryTrivialRequest(bxleft, qxright); + if (flag) theState.setRight(qxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("standardState",67, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 146: // standardState ::= standardStateBegin EQUAL AVSTANDARDSTATE_T LPAR poolParam RPAR SEMICOLON + { + Object RESULT =null; + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + if (flag) theState.setRight(qxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("standardState",67, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-6), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 147: // standardStateBegin ::= STATE IDENT COLON AVSTANDARDSTATE_T + { + Object RESULT =null; + Location zxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xleft; + Location zxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xright; + Object z = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3).<Object>value(); + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<Ident>value(); + + getState(id.getAvatarName()); + if (! theState.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, zxleft, "State " + id.getAvatarName() + + " is already declared", theState.getLeft()) ); + requestIndex = 0; + flag = false; + } else { + theState.setType(AvatarFromSysMLSyntax.STXSTANDARDSTATE); + theState.setName(id.getAvatarName()); + theState.setLeft(zxright); + requestIndex = 0; + flag = true; + } + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("standardStateBegin",108, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 148: // stopState ::= stopStateBegin SEMICOLON + { + Object RESULT =null; + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + if (flag) theState.setRight(qxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("stopState",68, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 149: // stopState ::= stopStateBegin EQUAL AVSTOPSTATE_T LPAR RPAR SEMICOLON + { + Object RESULT =null; + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + if (flag) theState.setRight(qxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("stopState",68, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 150: // stopStateBegin ::= EXIT ACTION IDENT COLON AVSTOPSTATE_T + { + Object RESULT =null; + Location zxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xleft; + Location zxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xright; + Object z = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4).<Object>value(); + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<Ident>value(); + + getState(id.getAvatarName()); + if (! theState.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, zxleft, "State " + id.getAvatarName() + + " is already declared", theState.getLeft()) ); + requestIndex = 0; + flag = false; + } else { + theState.setType(AvatarFromSysMLSyntax.STXSTOPSTATE); + theState.setLeft(zxright); + flag = true; + } + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("stopStateBegin",109, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 151: // sendState ::= sendStateBegin SEMICOLON + { + Object RESULT =null; + Location bxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xleft; + Location bxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xright; + Object b = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1).<Object>value(); + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + tryTrivialRequest(bxleft, qxright); + if (flag) theState.setRight(qxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("sendState",69, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 152: // sendState ::= sendStateBegin EQUAL AVSENDSTATE_T LPAR RPAR SEMICOLON + { + Object RESULT =null; + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + if (flag) theState.setRight(qxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("sendState",69, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 153: // sendState ::= sendStateBegin EQUAL AVSENDSTATE_T LPAR requestParam RPAR SEMICOLON + { + Object RESULT =null; + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + if (flag) theState.setRight(qxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("sendState",69, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-6), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 154: // sendStateBegin ::= STATE IDENT COLON AVSENDSTATE_T + { + Object RESULT =null; + Location zxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xleft; + Location zxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xright; + Object z = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3).<Object>value(); + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<Ident>value(); + + getState(id.getAvatarName()); + if (! theState.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, zxleft, "State " + id.getAvatarName() + + " is already declared", theState.getLeft()) ); + requestIndex = 0; + flag = false; + } else { + theState.setType(AvatarFromSysMLSyntax.STXSENDSTATE); + theState.setLeft(zxright); + requestIndex = 0; + flag = true; + } + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("sendStateBegin",110, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 155: // receiveState ::= receiveStateBegin SEMICOLON + { + Object RESULT =null; + Location bxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xleft; + Location bxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xright; + Object b = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1).<Object>value(); + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + tryTrivialRequest(bxleft, qxright); + if (flag) theState.setRight(qxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("receiveState",70, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 156: // receiveState ::= receiveStateBegin EQUAL AVRECEIVESTATE_T LPAR RPAR SEMICOLON + { + Object RESULT =null; + Location bxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5)).xleft; + Location bxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5)).xright; + Object b = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5).<Object>value(); + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + tryTrivialRequest(bxleft, qxright); + if (flag) theState.setRight(qxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("receiveState",70, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 157: // receiveState ::= receiveStateBegin EQUAL AVRECEIVESTATE_T LPAR requestParam RPAR SEMICOLON + { + Object RESULT =null; + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + if (flag) theState.setRight(qxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("receiveState",70, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-6), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 158: // receiveStateBegin ::= STATE IDENT COLON AVRECEIVESTATE_T + { + Object RESULT =null; + Location zxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xleft; + Location zxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xright; + Object z = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3).<Object>value(); + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<Ident>value(); + + getState(id.getAvatarName()); + if (! theState.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, zxleft, "State " + id.getAvatarName() + + " is already declared", theState.getLeft()) ); + requestIndex = 0; + flag = false; + } else { + theState.setType(AvatarFromSysMLSyntax.STXRECEIVESTATE); + theState.setLeft(zxright); + requestIndex = 0; + flag = true; + } + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("receiveStateBegin",111, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 159: // randomState ::= randomStateBegin EQUAL AVRANDOMSTATE_T LPAR randomAction COMMA requestParam RPAR SEMICOLON + { + Object RESULT =null; + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + if (flag) theState.setRight(qxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("randomState",71, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-8), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 160: // randomState ::= randomStateBegin EQUAL AVRANDOMSTATE_T LPAR requestParam COMMA randomAction RPAR SEMICOLON + { + Object RESULT =null; + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + if (flag) theState.setRight(qxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("randomState",71, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-8), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 161: // randomState ::= randomStateBegin EQUAL AVRANDOMSTATE_T LPAR randomAction RPAR SEMICOLON + { + Object RESULT =null; + Location bxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-6)).xleft; + Location bxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-6)).xright; + Object b = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-6).<Object>value(); + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + tryTrivialRequest(bxleft, qxright); + if (flag) theState.setRight(qxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("randomState",71, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-6), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 162: // randomStateBegin ::= STATE IDENT COLON AVRANDOMSTATE_T + { + Object RESULT =null; + Location zxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xleft; + Location zxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xright; + Object z = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3).<Object>value(); + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<Ident>value(); + + getState(id.getAvatarName()); + if (! theState.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, zxleft, "State " + id.getAvatarName() + + " is already declared", theState.getLeft()) ); + requestIndex = 0; + flag = false; + } else { + theState.setType(AvatarFromSysMLSyntax.STXRANDOMSTATE); + theState.setLeft(zxright); + requestIndex = 0; + flag = true; + } + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("randomStateBegin",112, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 163: // countState ::= countStateBegin EQUAL AVCOUNTSTATE_T LPAR countAction RPAR SEMICOLON + { + Object RESULT =null; + Location bxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-6)).xleft; + Location bxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-6)).xright; + Object b = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-6).<Object>value(); + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + tryTrivialRequest(bxleft, qxright); + if (flag) theState.setRight(qxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("countState",72, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-6), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 164: // countState ::= countStateBegin EQUAL AVCOUNTSTATE_T LPAR requestParam COMMA countAction RPAR SEMICOLON + { + Object RESULT =null; + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + if (flag) theState.setRight(qxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("countState",72, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-8), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 165: // countState ::= countStateBegin EQUAL AVCOUNTSTATE_T LPAR countAction COMMA requestParam RPAR SEMICOLON + { + Object RESULT =null; + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + if (flag) theState.setRight(qxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("countState",72, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-8), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 166: // countStateBegin ::= STATE IDENT COLON AVCOUNTSTATE_T + { + Object RESULT =null; + Location zxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xleft; + Location zxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xright; + Object z = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3).<Object>value(); + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<Ident>value(); + + getState(id.getAvatarName()); + if (! theState.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, zxleft, "State " + id.getAvatarName() + + " is already declared", theState.getLeft()) ); + requestIndex = 0; + flag = false; + } else { + theState.setType(AvatarFromSysMLSyntax.STXCOUNTSTATE); + theState.setLeft(zxright); + requestIndex = 0; + flag = true; + } + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("countStateBegin",113, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 167: // presendState ::= presendStateBegin EQUAL AVPRESENDSTATE_T LPAR requestParam RPAR SEMICOLON + { + Object RESULT =null; + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + if (flag) theState.setRight(qxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("presendState",73, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-6), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 168: // presendStateBegin ::= STATE IDENT COLON AVPRESENDSTATE_T + { + Object RESULT =null; + Location zxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xleft; + Location zxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xright; + Object z = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3).<Object>value(); + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<Ident>value(); + + getState(id.getAvatarName()); + if (! theState.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, zxleft, "State " + id.getAvatarName() + + " is already declared", theState.getLeft()) ); + requestIndex = 0; + flag = false; + } else { + theState.setType(AvatarFromSysMLSyntax.STXPRESENDSTATE); + theState.setLeft(zxright); + requestIndex = 0; + flag = true; + } + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("presendStateBegin",114, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 169: // prereceiveState ::= prereceiveStateBegin EQUAL AVPRERECEIVESTATE_T LPAR requestParam RPAR SEMICOLON + { + Object RESULT =null; + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + if (flag) theState.setRight(qxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("prereceiveState",74, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-6), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 170: // prereceiveStateBegin ::= STATE IDENT COLON AVPRERECEIVESTATE_T + { + Object RESULT =null; + Location zxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xleft; + Location zxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xright; + Object z = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3).<Object>value(); + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<Ident>value(); + + getState(id.getAvatarName()); + if (! theState.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, zxleft, "State " + id.getAvatarName() + + " is already declared", theState.getLeft()) ); + requestIndex = 0; + flag = false; + } else { + theState.setType(AvatarFromSysMLSyntax.STXPRERECEIVESTATE); + theState.setLeft(zxright); + requestIndex = 0; + flag = true; + } + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("prereceiveStateBegin",115, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 171: // setTimerState ::= setTimerStateBegin EQUAL AVSETTIMERSTATE_T LPAR requestParam RPAR SEMICOLON + { + Object RESULT =null; + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + if (flag) theState.setRight(qxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("setTimerState",75, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-6), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 172: // setTimerState ::= setTimerStateBegin EQUAL AVSETTIMERSTATE_T LPAR RPAR SEMICOLON + { + Object RESULT =null; + Location bxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5)).xleft; + Location bxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5)).xright; + Object b = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5).<Object>value(); + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + tryTrivialRequest(bxleft, qxright); + if (flag) theState.setRight(qxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("setTimerState",75, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 173: // setTimerState ::= setTimerStateBegin SEMICOLON + { + Object RESULT =null; + Location bxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xleft; + Location bxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xright; + Object b = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1).<Object>value(); + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + tryTrivialRequest(bxleft, qxright); + if (flag) theState.setRight(qxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("setTimerState",75, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 174: // setTimerStateBegin ::= STATE IDENT COLON AVSETTIMERSTATE_T + { + Object RESULT =null; + Location zxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xleft; + Location zxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xright; + Object z = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3).<Object>value(); + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<Ident>value(); + + getState(id.getAvatarName()); + if (! theState.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, zxleft, "State " + id.getAvatarName() + + " is already declared", theState.getLeft()) ); + requestIndex = 0; + flag = false; + } else { + theState.setType(AvatarFromSysMLSyntax.STXSETTIMERSTATE); + theState.setLeft(zxright); + requestIndex = 0; + flag = true; + } + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("setTimerStateBegin",116, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 175: // resetTimerState ::= resetTimerStateBegin EQUAL AVRESETTIMERSTATE_T LPAR requestParam RPAR SEMICOLON + { + Object RESULT =null; + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + if (flag) theState.setRight(qxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("resetTimerState",76, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-6), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 176: // resetTimerState ::= resetTimerStateBegin EQUAL AVRESETTIMERSTATE_T LPAR RPAR SEMICOLON + { + Object RESULT =null; + Location bxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5)).xleft; + Location bxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5)).xright; + Object b = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5).<Object>value(); + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + tryTrivialRequest(bxleft, qxright); + if (flag) theState.setRight(qxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("resetTimerState",76, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 177: // resetTimerState ::= resetTimerStateBegin SEMICOLON + { + Object RESULT =null; + Location bxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xleft; + Location bxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xright; + Object b = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1).<Object>value(); + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + tryTrivialRequest(bxleft, qxright); + if (flag) theState.setRight(qxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("resetTimerState",76, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 178: // resetTimerStateBegin ::= STATE IDENT COLON AVRESETTIMERSTATE_T + { + Object RESULT =null; + Location zxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xleft; + Location zxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xright; + Object z = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3).<Object>value(); + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<Ident>value(); + + getState(id.getAvatarName()); + if (! theState.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, zxleft, "State " + id.getAvatarName() + + " is already declared", theState.getLeft()) ); + requestIndex = 0; + flag = false; + } else { + theState.setType(AvatarFromSysMLSyntax.STXRESETTIMERSTATE); + theState.setLeft(zxright); + requestIndex = 0; + flag = true; + } + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("resetTimerStateBegin",117, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 179: // expireTimerState ::= expireTimerStateBegin EQUAL AVEXPIRETIMERSTATE_T LPAR requestParam RPAR SEMICOLON + { + Object RESULT =null; + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + if (flag) theState.setRight(qxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("expireTimerState",77, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-6), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 180: // expireTimerState ::= expireTimerStateBegin EQUAL AVEXPIRETIMERSTATE_T LPAR RPAR SEMICOLON + { + Object RESULT =null; + Location bxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5)).xleft; + Location bxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5)).xright; + Object b = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5).<Object>value(); + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + tryTrivialRequest(bxleft, qxright); + if (flag) theState.setRight(qxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("expireTimerState",77, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 181: // expireTimerState ::= expireTimerStateBegin SEMICOLON + { + Object RESULT =null; + Location bxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xleft; + Location bxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xright; + Object b = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1).<Object>value(); + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + tryTrivialRequest(bxleft, qxright); + if (flag) theState.setRight(qxright); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("expireTimerState",77, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 182: // expireTimerStateBegin ::= STATE IDENT COLON AVEXPIRETIMERSTATE_T + { + Object RESULT =null; + Location zxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xleft; + Location zxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xright; + Object z = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3).<Object>value(); + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<Ident>value(); + + getState(id.getAvatarName()); + if (! theState.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, zxleft, "State " + id.getAvatarName() + + " is already declared", theState.getLeft()) ); + requestIndex = 0; + flag = false; + } else { + theState.setType(AvatarFromSysMLSyntax.STXEXPIRETIMERSTATE); + theState.setLeft(zxright); + requestIndex = 0; + flag = true; + } + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("expireTimerStateBegin",118, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 183: // poolParam ::= POOL_F EQUAL LBRAC LPAR RPAR RBRAC + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("poolParam",78, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 184: // poolParam ::= POOL_F EQUAL LBRAC NULL RBRAC + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("poolParam",78, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 185: // poolParam ::= POOL_F EQUAL LBRAC LPAR requestList RPAR RBRAC + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("poolParam",78, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-6), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 186: // poolParam ::= POOL_F EQUAL request + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("poolParam",78, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 187: // requestParam ::= REQUEST_F EQUAL request + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("requestParam",79, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 188: // requestList ::= request + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("requestList",80, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 189: // requestList ::= request COMMA requestList + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("requestList",80, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 190: // request ::= dummy IF iexpr QUEST simpleRequest ELSE NOKREQUEST_U LPAR INT RPAR + { + Object RESULT =null; + Location ixleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-8)).xleft; + Location ixright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-8)).xright; + Object i = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-8).<Object>value(); + Location exleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-7)).xleft; + Location exright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-7)).xright; + String e = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-7).<String>value(); + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5)).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5)).xright; + Object q = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5).<Object>value(); + Location nxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xleft; + Location nxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xright; + Integer n = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1).<Integer>value(); + Location zxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location zxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object z = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + if (n != requestIndex + 1) { + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, nxleft, + " request index must be the request range in the request list (beginning at 1)", null) ); + } + if (okRequest) { + theTransition.setGuard(e); + theTransition.setRleft(ixleft); + theTransition.setRright(zxright); + } + requestIndex++; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("request",81, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-9), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 191: // request ::= dummy simpleRequest + { + Object RESULT =null; + Location ixleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location ixright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object i = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + if (okRequest) { + theTransition.setRleft(ixleft); + theTransition.setRright(ixright); + } + requestIndex++; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("request",81, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 192: // dummy ::= + { + Object RESULT =null; + + getTransition(requestIndex); + if (theTransition.isRequested()) { // duplicate + addError( new AvatarFromSysMLError( + AvatarFromSysMLError.LOWERROR, + lexer.getLocation(), + "Transition " + (requestIndex + 1) + " is already requested", + theTransition.getRleft()) ); + okRequest = false; // request is a duplikate (skip handling) + } else { + theTransition.setRequested(true); + okRequest = true; // request is not a duplicate + } + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("dummy",149, CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 193: // simpleRequest ::= trivialRequest + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("simpleRequest",82, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 194: // simpleRequest ::= sendRequest + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("simpleRequest",82, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 195: // simpleRequest ::= receiveRequest + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("simpleRequest",82, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 196: // simpleRequest ::= setTimerRequest + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("simpleRequest",82, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 197: // simpleRequest ::= resetTimerRequest + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("simpleRequest",82, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 198: // simpleRequest ::= expireTimerRequest + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("simpleRequest",82, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 199: // trivialRequest ::= IMMEDIATEREQUEST_U + { + Object RESULT =null; + Location ixleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location ixright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object i = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + if (!(requestIndex == 0)) { + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, ixleft, + " immediate request has index 1 and thus can only be used as first request", null) ); + } + if (okRequest) + theTransition.setType(AvatarFromSysMLSyntax.STXTRIVIALTRANSITION); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("trivialRequest",83, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 200: // trivialRequest ::= trivialRequestBegin requestArgs RPAR + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("trivialRequest",83, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 201: // trivialRequestBegin ::= TRIVIALREQUEST_T LPAR + { + Object RESULT =null; + + if (okRequest) + theTransition.setType(AvatarFromSysMLSyntax.STXTRIVIALTRANSITION); + clearRequestArgs(); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("trivialRequestBegin",101, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 202: // sendRequest ::= sendRequestBegin requestArgs RPAR + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("sendRequest",86, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 203: // sendRequestBegin ::= SENDREQUEST_T LPAR + { + Object RESULT =null; + + if (okRequest) + theTransition.setType(AvatarFromSysMLSyntax.STXSENDTRANSITION); + clearRequestArgs(); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("sendRequestBegin",102, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 204: // receiveRequest ::= receiveRequestBegin requestArgs RPAR + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("receiveRequest",87, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 205: // receiveRequestBegin ::= RECEIVEREQUEST_T LPAR + { + Object RESULT =null; + + if (okRequest) + theTransition.setType(AvatarFromSysMLSyntax.STXRECEIVETRANSITION); + clearRequestArgs(); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("receiveRequestBegin",103, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 206: // setTimerRequest ::= setTimerRequestBegin requestArgs RPAR + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("setTimerRequest",88, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 207: // setTimerRequestBegin ::= SETTIMERREQUEST_T LPAR + { + Object RESULT =null; + + if (okRequest) + theTransition.setType(AvatarFromSysMLSyntax.STXSETTIMERTRANSITION); + clearRequestArgs(); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("setTimerRequestBegin",104, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 208: // resetTimerRequest ::= resetTimerRequestBegin requestArgs RPAR + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("resetTimerRequest",89, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 209: // resetTimerRequestBegin ::= RESETTIMERREQUEST_T LPAR + { + Object RESULT =null; + + if (okRequest) + theTransition.setType(AvatarFromSysMLSyntax.STXRESETTIMERTRANSITION); + clearRequestArgs(); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("resetTimerRequestBegin",105, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 210: // expireTimerRequest ::= expireTimerRequestBegin requestArgs RPAR + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("expireTimerRequest",90, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 211: // expireTimerRequestBegin ::= EXPIRETIMERREQUEST_T LPAR + { + Object RESULT =null; + + if (okRequest) + theTransition.setType(AvatarFromSysMLSyntax.STXEXPIRETIMERTRANSITION); + clearRequestArgs(); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("expireTimerRequestBegin",106, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 212: // requestArgs ::= requestArg + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("requestArgs",84, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 213: // requestArgs ::= requestArg COMMA requestArgs + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("requestArgs",84, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 214: // requestArg ::= indexParam + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("requestArg",85, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 215: // requestArg ::= delayParam + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("requestArg",85, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 216: // requestArg ::= channelParam + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("requestArg",85, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 217: // requestArg ::= payloadParam + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("requestArg",85, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 218: // requestArg ::= settimerParam + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("requestArg",85, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 219: // requestArg ::= resettimerParam + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("requestArg",85, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 220: // requestArg ::= expiretimerParam + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("requestArg",85, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 221: // indexParam ::= INDEX_F EQUAL INT + { + Object RESULT =null; + Location fxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location fxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + Object f = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<Object>value(); + Location ixleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location ixright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Integer i = CUP$AvatarFromSysMLParser$stack.peek().<Integer>value(); + + if (indexArg != null) + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING,fxleft, "index parameter has already been set", indexArg)); + if (i != requestIndex + 1) + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING,fxleft, "the index of a request must be its range (beginning at 1)", + null)); + if (indexArg == null) indexArg = fxleft; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("indexParam",91, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 222: // delayParam ::= delayKeyword EQUAL delayExpr + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("delayParam",92, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 223: // delayKeyword ::= DELAY_F + { + Object RESULT =null; + Location dxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location dxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object d = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + if (delayArg != null) { + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, dxleft, "delay parameter has already been set", delayArg)); + argOK = false; + } + else { + delayArg = dxleft; + argOK = true; + } + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("delayKeyword",148, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 224: // delayExpr ::= iexpr + { + Object RESULT =null; + Location exleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location exright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + String e = CUP$AvatarFromSysMLParser$stack.peek().<String>value(); + if (argOK && okRequest) theTransition.setMinDelay(e); + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("delayExpr",93, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 225: // delayExpr ::= delayRandomExpr + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("delayExpr",93, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 226: // delayRandomExpr ::= BOUNDRANDOM_U LPAR iexpr COMMA iexpr RPAR + { + Object RESULT =null; + Location ixleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xleft; + Location ixright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xright; + String i = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3).<String>value(); + Location axleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xleft; + Location axright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xright; + String a = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1).<String>value(); + + if(argOK && okRequest) { + theTransition.setMinDelay(i); + theTransition.setMaxDelay(a); + } + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("delayRandomExpr",95, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 227: // payloadParam ::= payloadParamBegin IDENT LPAR termList RPAR + { + Object RESULT =null; + Location bxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xleft; + Location bxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xright; + Object b = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4).<Object>value(); + // termlist fills argList + if (argOK) { // not duplicate + if (theTransition.getType() != AvatarFromSysMLSyntax.STXSENDTRANSITION) + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, bxleft, + "such payload is only relevant for send transitions", null)); + if (okRequest) theTransition.setSendPayload(argList); + } + argList = null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("payloadParam",96, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 228: // payloadParam ::= payloadParamBegin IDENT LPAR RPAR + { + Object RESULT =null; + Location bxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xleft; + Location bxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xright; + Object b = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3).<Object>value(); + + if (argOK) { // not duplicate + if (theTransition.getType() != AvatarFromSysMLSyntax.STXSENDTRANSITION) + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, bxleft, + "such payload is only relevant for send transitions", null)); + if (okRequest) theTransition.setSendPayload(argList); + } + argList = null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("payloadParam",96, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 229: // payloadParam ::= payloadParamBegin IDENT + { + Object RESULT =null; + Location bxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xleft; + Location bxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xright; + Object b = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1).<Object>value(); + + if (argOK) { // not duplicate + if (theTransition.getType() != AvatarFromSysMLSyntax.STXSENDTRANSITION) + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, bxleft, + "such payload is only relevant for send transitions", null)); + if (okRequest) theTransition.setSendPayload(argList); + } + argList = null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("payloadParam",96, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 230: // payloadParam ::= payloadParamBegin TIMERSETMSG_T LPAR stxExpr RPAR + { + Object RESULT =null; + Location bxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xleft; + Location bxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xright; + Object b = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4).<Object>value(); + Location exleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xleft; + Location exright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xright; + StxExpr e = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1).<StxExpr>value(); + + if (argOK) { // not duplicate + if (theTransition.getType() != AvatarFromSysMLSyntax.STXSETTIMERTRANSITION) + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, bxleft, + "such payload is only relevant for set-timer transitions", null)); + argList.add(e); + if (okRequest) theTransition.setSendPayload(argList); + } + argList = null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("payloadParam",96, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 231: // payloadParam ::= payloadParamBegin TIMERRESETMSG_T LPAR RPAR + { + Object RESULT =null; + Location bxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xleft; + Location bxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xright; + Object b = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3).<Object>value(); + + if (argOK) { // not duplicate + if (theTransition.getType() != AvatarFromSysMLSyntax.STXRESETTIMERTRANSITION) + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, bxleft, + "such payload is only relevant for reset-timer transitions", null)); + if (okRequest) theTransition.setSendPayload(argList); + } + argList = null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("payloadParam",96, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 232: // payloadParamBegin ::= PAYLOAD_F EQUAL + { + Object RESULT =null; + Location pxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xleft; + Location pxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xright; + Object p = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1).<Object>value(); + + if (payloadArg != null) { + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, pxleft, "payload parameter has already been set", payloadArg)); + argOK = false; + } + else { + payloadArg = pxleft; + argOK = true; + argList= new ArrayList<StxTerm>(); + } + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("payloadParamBegin",120, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 233: // channelParam ::= CHANNEL_F EQUAL IDENT + { + Object RESULT =null; + Location cxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location cxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + Object c = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<Object>value(); + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.peek().<Ident>value(); + + if (channelArg != null) + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, cxleft, "channel parameter has already been set", channelArg)); + else { + if (theTransition.getType() != AvatarFromSysMLSyntax.STXSENDTRANSITION && + theTransition.getType() != AvatarFromSysMLSyntax.STXRECEIVETRANSITION) + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, cxleft, + "such channel is only relevant for send or receive transitions", null)); + if (okRequest) { + theTransition.setSignalName(theBlock.getName(), id.getAvatarName()); + commTransitions.add(theTransition); + } + channelArg = cxleft; + } + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("channelParam",97, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 234: // settimerParam ::= CHANNEL_F EQUAL IDENT POINT SET_TM + { + Object RESULT =null; + Location cxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xleft; + Location cxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xright; + Object c = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4).<Object>value(); + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<Ident>value(); + + if (settimerArg != null) + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, cxleft, "timer channel parameter has already been set", settimerArg)); + else { + if (theTransition.getType() != AvatarFromSysMLSyntax.STXSETTIMERTRANSITION) + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, cxleft, + "such channel is only relevant for set-timer transitions", null)); + if (okRequest) theTransition.setTimer(id.getAvatarName()); + settimerArg = cxleft; + } + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("settimerParam",98, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 235: // resettimerParam ::= CHANNEL_F EQUAL IDENT POINT RESET_TM + { + Object RESULT =null; + Location cxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xleft; + Location cxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xright; + Object c = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4).<Object>value(); + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<Ident>value(); + + if (resettimerArg != null) + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, cxleft, "timer channel parameter has already been set", settimerArg)); + else { + if (theTransition.getType() != AvatarFromSysMLSyntax.STXRESETTIMERTRANSITION) + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, cxleft, + "such channel is only relevant for reset-timer transitions", null)); + if (okRequest) theTransition.setTimer(id.getAvatarName()); + resettimerArg = cxleft; + } + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("resettimerParam",99, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 236: // expiretimerParam ::= CHANNEL_F EQUAL IDENT POINT EXPIRE_TM + { + Object RESULT =null; + Location cxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xleft; + Location cxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xright; + Object c = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4).<Object>value(); + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<Ident>value(); + + if (expiretimerArg != null) + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, cxleft, "timer channel parameter has already been set", settimerArg)); + else { + if (theTransition.getType() != AvatarFromSysMLSyntax.STXEXPIRETIMERTRANSITION) + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, cxleft, + "such channel is only relevant for expire-timer transitions", null)); + if (okRequest) theTransition.setTimer(id.getAvatarName()); + expiretimerArg = cxleft; + } + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("expiretimerParam",100, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 237: // termList ::= stxRvalue + { + Object RESULT =null; + Location exleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location exright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + StxTerm e = CUP$AvatarFromSysMLParser$stack.peek().<StxTerm>value(); + argList.add(e); + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("termList",130, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 238: // termList ::= termList COMMA stxRvalue + { + Object RESULT =null; + Location exleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location exright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + StxTerm e = CUP$AvatarFromSysMLParser$stack.peek().<StxTerm>value(); + argList.add(e); + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("termList",130, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 239: // targetParam ::= target EQUAL fullIdent + { + Object RESULT =null; + + theState.setVariable(stringAcc.toString()); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("targetParam",122, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 240: // target ::= TARGET_F + { + Object RESULT =null; + + stringAcc = new StringBuffer(); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("target",136, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 241: // fullIdent ::= IDENT + { + Object RESULT =null; + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.peek().<Ident>value(); + stringAcc.append(id.getAvatarName()); + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("fullIdent",137, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 242: // fullIdent ::= fullIdent POINT IDENT + { + Object RESULT =null; + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.peek().<Ident>value(); + stringAcc.append("." + id.getAvatarName()); + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("fullIdent",137, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 243: // randomAction ::= STATEACTION_F EQUAL ASSIGNMENT_T LPAR targetParam COMMA randomParam RPAR + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("randomAction",121, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-7), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 244: // randomAction ::= STATEACTION_F EQUAL ASSIGNMENT_T LPAR randomParam COMMA targetParam RPAR + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("randomAction",121, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-7), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 245: // randomParam ::= VALUE_F EQUAL actionRandomExpr + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("randomParam",123, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 246: // actionRandomExpr ::= BOUNDRANDOM_U LPAR iexpr COMMA iexpr RPAR + { + Object RESULT =null; + Location ixleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xleft; + Location ixright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xright; + String i = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3).<String>value(); + Location axleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xleft; + Location axright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xright; + String a = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1).<String>value(); + + theState.setMinValue(i); + theState.setMaxValue(a); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("actionRandomExpr",94, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 247: // countAction ::= STATEACTION_F EQUAL ASSIGNMENT_T LPAR targetParam COMMA countParam RPAR + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("countAction",124, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-7), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 248: // countAction ::= STATEACTION_F EQUAL ASSIGNMENT_T LPAR countParam COMMA targetParam RPAR + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("countAction",124, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-7), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 249: // countParam ::= VALUE_F EQUAL IDENT POINT AMOUNT_U LPAR RPAR + { + Object RESULT =null; + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4).<Ident>value(); + + getSignal(theBlock.getName(),id.getAvatarName()); + theState.setSignal(theSignal); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("countParam",125, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-6), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 250: // transition ::= transitionBegin THEN IDENT SEMICOLON + { + Object RESULT =null; + Location txleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xleft; + Location txright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xright; + Object t = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3).<Object>value(); + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1).<Ident>value(); + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + if (flag) { + getState(id.getAvatarName()); + theTransition.setTarget(theState); + theTransition.setLeft(txleft); + theTransition.setRight(qxright); + } + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("transition",126, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 251: // transition ::= transitionBegin doActions THEN IDENT SEMICOLON + { + Object RESULT =null; + Location txleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xleft; + Location txright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xright; + Object t = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4).<Object>value(); + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1).<Ident>value(); + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + if (flag) { + getState(id.getAvatarName()); + theTransition.setTarget(theState); + theTransition.setLeft(txleft); + theTransition.setRight(qxright); + } + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("transition",126, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 252: // transition ::= transitionBegin THEN IDENT LBRAC transitionLabels RBRAC + { + Object RESULT =null; + Location txleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5)).xleft; + Location txright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5)).xright; + Object t = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5).<Object>value(); + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3).<Ident>value(); + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + if (flag) { + getState(id.getAvatarName()); + theTransition.setTarget(theState); + theTransition.setDelayExtra(delayExtraMap); + theTransition.setLeft(txleft); + theTransition.setRight(qxright); + } + delayExtraMap = null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("transition",126, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 253: // transition ::= transitionBegin doActions THEN IDENT LBRAC transitionLabels RBRAC + { + Object RESULT =null; + Location txleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-6)).xleft; + Location txright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-6)).xright; + Object t = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-6).<Object>value(); + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3).<Ident>value(); + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + if (flag) { + getState(id.getAvatarName()); + theTransition.setTarget(theState); + theTransition.setDelayExtra(delayExtraMap); + theTransition.setLeft(txleft); + theTransition.setRight(qxright); + } + delayExtraMap = null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("transition",126, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-6), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 254: // transitionBegin ::= TRANSITION COLON AVTRANSITION_T FIRST IDENT + { + Object RESULT =null; + Location txleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xleft; + Location txright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xright; + Object t = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4).<Object>value(); + Location stxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location stxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Ident st = CUP$AvatarFromSysMLParser$stack.peek().<Ident>value(); + + getState(st.getAvatarName()); + getTransition(0); + if (!theTransition.declare()) { + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, txleft, + "transition with same index has already been declared", null)); + flag = false; + } + else flag = true; + clearTransitionLbls(); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("transitionBegin",131, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 255: // transitionBegin ::= TRANSITION COLON AVTRANSITION_T FIRST IDENT IF INDEX_F EQ INT + { + Object RESULT =null; + Location txleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-8)).xleft; + Location txright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-8)).xright; + Object t = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-8).<Object>value(); + Location stxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xleft; + Location stxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xright; + Ident st = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4).<Ident>value(); + Location ixleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location ixright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Integer i = CUP$AvatarFromSysMLParser$stack.peek().<Integer>value(); + + getState(st.getAvatarName()); + getTransition(i-1); + if (!theTransition.declare()) { + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, txleft, + "transition with same index has already been declared", null)); + flag = true; + } + else flag = true; + clearTransitionLbls(); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("transitionBegin",131, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-8), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 256: // doActions ::= transitionActionBegin LBRAC RBRAC + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("doActions",127, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 257: // doActions ::= transitionActionBegin LBRAC transitionAction RBRAC + { + Object RESULT =null; + + if (flag) theTransition.setActions(actionList); + actionList = null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("doActions",127, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 258: // doActions ::= receiveActionBegin LBRAC RBRAC + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("doActions",127, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 259: // doActions ::= receiveActionBegin LBRAC receiveAction RBRAC + { + Object RESULT =null; + + if (flag) theTransition.setReceivePayload(receiveMap); + receiveMap = null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("doActions",127, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 260: // transitionActionBegin ::= DO ACTION COLON TRANSITIONACTION_T + { + Object RESULT =null; + + actionList = new ArrayList<StxAction>(); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("transitionActionBegin",138, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 261: // receiveActionBegin ::= DO ACTION COLON RECEIVEACTION_T + { + Object RESULT =null; + + receiveMap = new HashMap<String,String>(); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("receiveActionBegin",139, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 262: // transitionAction ::= FIRST START_U SEMICOLON THEN DONE_U SEMICOLON + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("transitionAction",133, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 263: // transitionAction ::= FIRST START_U SEMICOLON actionSeq + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("transitionAction",133, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 264: // actionSeq ::= THEN act THEN DONE_U SEMICOLON + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("actionSeq",128, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 265: // actionSeq ::= THEN act actionSeq + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("actionSeq",128, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 266: // act ::= assign fulllIdent GETS stxRvalue SEMICOLON + { + Object RESULT =null; + Location axleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xleft; + Location axright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xright; + Object a = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4).<Object>value(); + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xright; + String id = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3).<String>value(); + Location vxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xleft; + Location vxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xright; + StxTerm v = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1).<StxTerm>value(); + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + actionList.add(new StxAction(axleft, qxright, id , v)); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("act",129, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 267: // act ::= ACTION EQUAL stxCall SEMICOLON + { + Object RESULT =null; + Location axleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xleft; + Location axright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xright; + Object a = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3).<Object>value(); + Location cxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xleft; + Location cxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xright; + StxCall c = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1).<StxCall>value(); + Location qxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location qxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); + + actionList.add(new StxAction(axleft, qxright, c)); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("act",129, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 268: // assign ::= ASSIGN + { + Object RESULT =null; + + stringAcc = new StringBuffer(); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("assign",135, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 269: // fulllIdent ::= fullIdent + { + String RESULT =null; + + RESULT = stringAcc.toString(); + stringAcc.setLength(0); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("fulllIdent",1, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 270: // receiveAction ::= messageLine receiveAssigns + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("receiveAction",134, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 271: // receiveAction ::= receiveAssigns messageLine + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("receiveAction",134, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 272: // messageLine ::= ITEM MSG_U COLON IDENT EQUAL PAYLOAD_F AS IDENT SEMICOLON + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("messageLine",140, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-8), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 273: // receiveAssigns ::= FIRST START_U SEMICOLON THEN DONE_U SEMICOLON + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("receiveAssigns",141, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 274: // receiveAssigns ::= FIRST START_U SEMICOLON receiveAssignSeq + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("receiveAssigns",141, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 275: // receiveAssignSeq ::= receiveAssign THEN DONE_U SEMICOLON + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("receiveAssignSeq",142, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 276: // receiveAssignSeq ::= receiveAssign receiveAssignSeq + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("receiveAssignSeq",142, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 277: // receiveAssign ::= THEN assign fullIdent GETS MSG_U POINT IDENT SEMICOLON + { + Object RESULT =null; + Location txleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-7)).xleft; + Location txright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-7)).xright; + Object t = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-7).<Object>value(); + Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xleft; + Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xright; + Ident id = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1).<Ident>value(); + + String test = receiveMap.get(id.getAvatarName()); + if (test == null) receiveMap.put(id.getAvatarName(),stringAcc.toString()); + else + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, txleft, + "component " + id.getAvatarName() + " has already been assigned", null)); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("receiveAssign",143, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-7), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 278: // transitionLabels ::= transitionLabel SEMICOLON + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("transitionLabels",132, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 279: // transitionLabels ::= transitionLabel SEMICOLON transitionLabels + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("transitionLabels",132, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 280: // transitionLabel ::= distributionLabel + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("transitionLabel",144, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 281: // transitionLabel ::= weightLabel + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("transitionLabel",144, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 282: // transitionLabel ::= extraLabel + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("transitionLabel",144, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 283: // distributionLabel ::= ATTRIBUTE DISTRIBUTION_A COLON STRING_T EQUAL STRING + { + Object RESULT =null; + Location axleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5)).xleft; + Location axright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5)).xright; + Object a = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5).<Object>value(); + Location sxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location sxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + String s = CUP$AvatarFromSysMLParser$stack.peek().<String>value(); + + if (distributionLbl != null) + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, axleft, + "distribution label has already been assigned", distributionLbl)); + else { + theTransition.setDelayDistributionLaw(s); + distributionLbl = axleft; + } + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("distributionLabel",145, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 284: // weightLabel ::= ATTRIBUTE WEIGHT_A COLON REAL_T EQUAL REAL + { + Object RESULT =null; + Location axleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5)).xleft; + Location axright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5)).xright; + Object a = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5).<Object>value(); + Location rxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location rxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Double r = CUP$AvatarFromSysMLParser$stack.peek().<Double>value(); + + if (weightLbl != null) + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, axleft, + "weight label has already been assigned", weightLbl)); + else { + theTransition.setProbability(r); + weightLbl = axleft; + } + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("weightLabel",146, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 285: // weightLabel ::= ATTRIBUTE WEIGHT_A COLON REAL_T EQUAL INT + { + Object RESULT =null; + Location axleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5)).xleft; + Location axright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5)).xright; + Object a = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5).<Object>value(); + Location rxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location rxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Integer r = CUP$AvatarFromSysMLParser$stack.peek().<Integer>value(); + + if (weightLbl != null) + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, axleft, + "weight label has already been assigned", weightLbl)); + else { + theTransition.setProbability((double)r); + weightLbl = axleft; + } + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("weightLabel",146, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 286: // extraLabel ::= ATTRIBUTE ANYNAME COLON STRING_T EQUAL STRING + { + Object RESULT =null; + Location nxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xleft; + Location nxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xright; + String n = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4).<String>value(); + Location sxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location sxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + String s = CUP$AvatarFromSysMLParser$stack.peek().<String>value(); + + if (delayExtraMap == null) + delayExtraMap = new HashMap<String,String>(); + delayExtraMap.put(n,s); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("extraLabel",147, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 287: // extraLabel ::= ATTRIBUTE IDENT COLON STRING_T EQUAL STRING + { + Object RESULT =null; + Location nxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xleft; + Location nxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xright; + Ident n = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4).<Ident>value(); + Location sxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location sxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + String s = CUP$AvatarFromSysMLParser$stack.peek().<String>value(); + + if (delayExtraMap == null) + delayExtraMap = new HashMap<String,String>(); + delayExtraMap.put(n.getAvatarName(),s); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("extraLabel",147, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 288: // stxRvalue ::= stxCall + { + StxTerm RESULT =null; + Location cxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location cxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + StxCall c = CUP$AvatarFromSysMLParser$stack.peek().<StxCall>value(); + RESULT = c; // FUNCTION CALL + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("stxRvalue",150, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 289: // stxRvalue ::= expr + { + StxTerm RESULT =null; + Location exleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location exright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + String e = CUP$AvatarFromSysMLParser$stack.peek().<String>value(); + RESULT = new StxExpr(e); // INT/BOOL EXPRESSION + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("stxRvalue",150, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 290: // stxRvalue ::= complexIdent + { + StxTerm RESULT =null; + Location ixleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location ixright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + String i = CUP$AvatarFromSysMLParser$stack.peek().<String>value(); + RESULT = new StxId(i); + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("stxRvalue",150, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 291: // stxExpr ::= iexpr + { + StxExpr RESULT =null; + Location exleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location exright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + String e = CUP$AvatarFromSysMLParser$stack.peek().<String>value(); + RESULT = new StxExpr(e); // INT/BOOL EXPRESSION + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("stxExpr",151, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 292: // iexpr ::= expr + { + String RESULT =null; + Location exleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location exright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + String e = CUP$AvatarFromSysMLParser$stack.peek().<String>value(); + RESULT = e; + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("iexpr",153, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 293: // iexpr ::= complexIdent + { + String RESULT =null; + Location ixleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location ixright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + String i = CUP$AvatarFromSysMLParser$stack.peek().<String>value(); + RESULT = i; + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("iexpr",153, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 294: // expr ::= iexpr PLUS iexpr + { + String RESULT =null; + Location lxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location lxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + String l = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<String>value(); + Location rxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location rxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + String r = CUP$AvatarFromSysMLParser$stack.peek().<String>value(); + RESULT = l + " + " + r; + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("expr",154, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 295: // expr ::= iexpr MINUS iexpr + { + String RESULT =null; + Location lxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location lxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + String l = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<String>value(); + Location rxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location rxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + String r = CUP$AvatarFromSysMLParser$stack.peek().<String>value(); + RESULT = l + " - " + r; + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("expr",154, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 296: // expr ::= iexpr MULT iexpr + { + String RESULT =null; + Location lxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location lxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + String l = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<String>value(); + Location rxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location rxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + String r = CUP$AvatarFromSysMLParser$stack.peek().<String>value(); + RESULT = l + " * " + r; + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("expr",154, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 297: // expr ::= iexpr DIV iexpr + { + String RESULT =null; + Location lxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location lxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + String l = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<String>value(); + Location rxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location rxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + String r = CUP$AvatarFromSysMLParser$stack.peek().<String>value(); + RESULT = l + " / " + r; + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("expr",154, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 298: // expr ::= iexpr MOD iexpr + { + String RESULT =null; + Location lxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location lxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + String l = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<String>value(); + Location rxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location rxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + String r = CUP$AvatarFromSysMLParser$stack.peek().<String>value(); + RESULT = l + " % " + r; + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("expr",154, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 299: // expr ::= MINUS iexpr + { + String RESULT =null; + Location exleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location exright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + String e = CUP$AvatarFromSysMLParser$stack.peek().<String>value(); + RESULT = "-" + e; + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("expr",154, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /* . . . . . .*/ + default: + throw new Exception( + "Invalid action number "+CUP$AvatarFromSysMLParser$act_num+"found in internal parse table"); + + } + } /* end of method */ + /** Method 1 with the actual generated action code for actions 300 to 600. */ + public final java_cup.runtime.Symbol CUP$AvatarFromSysMLParser$do_action_part00000001( + int CUP$AvatarFromSysMLParser$act_num, + java_cup.runtime.lr_parser CUP$AvatarFromSysMLParser$parser, + java.util.Stack<java_cup.runtime.Symbol> CUP$AvatarFromSysMLParser$stack, + int CUP$AvatarFromSysMLParser$top) + throws java.lang.Exception + { + /* Symbol object for return from actions */ + java_cup.runtime.Symbol CUP$AvatarFromSysMLParser$result; + + /* select the action based on the action number */ + switch (CUP$AvatarFromSysMLParser$act_num) + { + /*. . . . . . . . . . . . . . . . . . . .*/ + case 300: // expr ::= iexpr OR iexpr + { + String RESULT =null; + Location lxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location lxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + String l = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<String>value(); + Location rxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location rxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + String r = CUP$AvatarFromSysMLParser$stack.peek().<String>value(); + RESULT = l + " || " + r; + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("expr",154, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 301: // expr ::= iexpr AND iexpr + { + String RESULT =null; + Location lxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location lxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + String l = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<String>value(); + Location rxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location rxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + String r = CUP$AvatarFromSysMLParser$stack.peek().<String>value(); + RESULT = l + " && " + r; + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("expr",154, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 302: // expr ::= NOT iexpr + { + String RESULT =null; + Location exleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location exright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + String e = CUP$AvatarFromSysMLParser$stack.peek().<String>value(); + RESULT = "!" + e; + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("expr",154, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 303: // expr ::= iexpr LT iexpr + { + String RESULT =null; + Location lxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location lxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + String l = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<String>value(); + Location rxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location rxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + String r = CUP$AvatarFromSysMLParser$stack.peek().<String>value(); + RESULT = l + " < " + r; + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("expr",154, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 304: // expr ::= iexpr GT iexpr + { + String RESULT =null; + Location lxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location lxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + String l = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<String>value(); + Location rxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location rxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + String r = CUP$AvatarFromSysMLParser$stack.peek().<String>value(); + RESULT = l + " > " + r; + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("expr",154, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 305: // expr ::= iexpr LEQ iexpr + { + String RESULT =null; + Location lxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location lxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + String l = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<String>value(); + Location rxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location rxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + String r = CUP$AvatarFromSysMLParser$stack.peek().<String>value(); + RESULT = l + " <= " + r; + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("expr",154, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 306: // expr ::= iexpr GEQ iexpr + { + String RESULT =null; + Location lxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location lxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + String l = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<String>value(); + Location rxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location rxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + String r = CUP$AvatarFromSysMLParser$stack.peek().<String>value(); + RESULT = l + " >= " + r; + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("expr",154, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 307: // expr ::= iexpr EQ iexpr + { + String RESULT =null; + Location lxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location lxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + String l = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<String>value(); + Location rxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location rxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + String r = CUP$AvatarFromSysMLParser$stack.peek().<String>value(); + RESULT = l + " == " + r; + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("expr",154, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 308: // expr ::= iexpr DIF iexpr + { + String RESULT =null; + Location lxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location lxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + String l = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<String>value(); + Location rxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location rxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + String r = CUP$AvatarFromSysMLParser$stack.peek().<String>value(); + RESULT = l + " != " + r; + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("expr",154, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 309: // expr ::= LPAR iexpr RPAR + { + String RESULT =null; + Location exleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xleft; + Location exright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xright; + String e = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1).<String>value(); + RESULT = "(" + e + ")"; + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("expr",154, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 310: // expr ::= INT + { + String RESULT =null; + Location ixleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location ixright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Integer i = CUP$AvatarFromSysMLParser$stack.peek().<Integer>value(); + RESULT = "" + i; + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("expr",154, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 311: // expr ::= BOOL + { + String RESULT =null; + Location bxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location bxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Boolean b = CUP$AvatarFromSysMLParser$stack.peek().<Boolean>value(); + RESULT = ( b ? "true" : "false" ); + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("expr",154, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 312: // complexIdent ::= IDENT + { + String RESULT =null; + Location exleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location exright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + Ident e = CUP$AvatarFromSysMLParser$stack.peek().<Ident>value(); + RESULT = e.getAvatarName(); + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("complexIdent",155, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 313: // complexIdent ::= IDENT POINT complexIdent + { + String RESULT =null; + Location exleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xleft; + Location exright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2)).xright; + Ident e = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2).<Ident>value(); + Location ixleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location ixright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + String i = CUP$AvatarFromSysMLParser$stack.peek().<String>value(); + RESULT = e.getAvatarName() + "." + i; + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("complexIdent",155, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 314: // stxCall ::= stxCallBegin RPAR + { + StxCall RESULT =null; + + theCall.addSegment(stringAcc.toString() + ")"); + RESULT = theCall; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("stxCall",152, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 315: // stxCall ::= stxCallBegin stxCallParams RPAR + { + StxCall RESULT =null; + Location lxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xleft; + Location lxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xright; + Object l = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1).<Object>value(); + + theCall.addSegment(stringAcc.toString() + ")"); + RESULT = theCall; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("stxCall",152, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 316: // stxCallBegin ::= IDENT LPAR + { + Object RESULT =null; + Location ixleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xleft; + Location ixright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xright; + Ident i = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1).<Ident>value(); + + theCall = new StxCall(); + stringAcc = new StringBuffer(i.getAvatarName() + "("); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("stxCallBegin",156, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 317: // stxCallParams ::= stxCallParam + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("stxCallParams",161, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 318: // stxCallParams ::= stxCallParam comma stxCallParams + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("stxCallParams",161, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 319: // comma ::= COMMA + { + Object RESULT =null; + stringAcc.append(", "); + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("comma",158, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 320: // stxCallParam ::= expr + { + Object RESULT =null; + Location exleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location exright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + String e = CUP$AvatarFromSysMLParser$stack.peek().<String>value(); + stringAcc.append(e); + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("stxCallParam",157, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 321: // stxCallParam ::= complexIdent + { + Object RESULT =null; + Location ixleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xleft; + Location ixright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; + String i = CUP$AvatarFromSysMLParser$stack.peek().<String>value(); + + theCall.addSegment(stringAcc.toString()); + theCall.addIdent(i); + stringAcc.setLength(0); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("stxCallParam",157, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 322: // stxCallParam ::= call + { + Object RESULT =null; + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("stxCallParam",157, CUP$AvatarFromSysMLParser$stack.peek(), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 323: // call ::= callBegin RPAR + { + Object RESULT =null; + stringAcc.append(")"); + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("call",159, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 324: // call ::= stxCallBegin stxCallParams RPAR + { + Object RESULT =null; + Location lxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xleft; + Location lxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xright; + Object l = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1).<Object>value(); + stringAcc.append(")"); + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("call",159, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 325: // callBegin ::= IDENT LPAR + { + Object RESULT =null; + Location ixleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xleft; + Location ixright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xright; + Ident i = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1).<Ident>value(); + + stringAcc.append(i.getAvatarName() + "("); + + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("callBegin",160, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); + } + return CUP$AvatarFromSysMLParser$result; + + /* . . . . . .*/ + default: + throw new Exception( + "Invalid action number "+CUP$AvatarFromSysMLParser$act_num+"found in internal parse table"); + + } + } /* end of method */ + + /** Method splitting the generated action code into several parts. */ + public final java_cup.runtime.Symbol CUP$AvatarFromSysMLParser$do_action( + int CUP$AvatarFromSysMLParser$act_num, + java_cup.runtime.lr_parser CUP$AvatarFromSysMLParser$parser, + java.util.Stack<java_cup.runtime.Symbol> CUP$AvatarFromSysMLParser$stack, + int CUP$AvatarFromSysMLParser$top) + throws java.lang.Exception + { + /* select the action handler based on the action number */ + switch (CUP$AvatarFromSysMLParser$act_num/300) + { + /*. . . . . . . . 0 < #action < 300. . . . . . . . . . . .*/ + case 0: + return CUP$AvatarFromSysMLParser$do_action_part00000000( + CUP$AvatarFromSysMLParser$act_num, + CUP$AvatarFromSysMLParser$parser, + CUP$AvatarFromSysMLParser$stack, + CUP$AvatarFromSysMLParser$top); + /*. . . . . . . . 300 < #action < 600. . . . . . . . . . . .*/ + case 1: + return CUP$AvatarFromSysMLParser$do_action_part00000001( + CUP$AvatarFromSysMLParser$act_num, + CUP$AvatarFromSysMLParser$parser, + CUP$AvatarFromSysMLParser$stack, + CUP$AvatarFromSysMLParser$top); + /* . . . no valid action number: . . .*/ + default: + throw new Exception("Invalid action number found in internal parse table"); + + } /* end of switch */ + } +} + +} diff --git a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLSymbols.java b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLSymbols.java new file mode 100644 index 0000000000000000000000000000000000000000..736916502301596b12e994dc5e1a88da491331cd --- /dev/null +++ b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLSymbols.java @@ -0,0 +1,638 @@ + +//---------------------------------------------------- +// The following code was generated by CUP v0.11b 20210814 (GIT d69c832) +//---------------------------------------------------- + +package avatartranslator.tosysmlv2; + +/** CUP generated class containing symbol constants. */ +public class AvatarFromSysMLSymbols { + /* terminals */ + public static final int AVDATATYPE_T = 62; + public static final int BLOCK1_F = 23; + public static final int BLOCK = 117; + public static final int CONNECT = 123; + public static final int EXIT = 140; + public static final int TRIVIALREQUEST_T = 51; + public static final int INDIVIDUAL = 155; + public static final int GT = 226; + public static final int MULT = 221; + public static final int AVSTOPSTATE_T = 67; + public static final int LOSSY_F = 19; + public static final int STATEACTION_F = 27; + public static final int GEQ = 228; + public static final int UNTIL = 205; + public static final int INCLUDE = 154; + public static final int BOUNDRANDOM_U = 57; + public static final int ANALYSIS = 106; + public static final int BOOLEAN_T = 58; + public static final int TRANSITION = 204; + public static final int AVSTANDARDSTATE_T = 66; + public static final int PROTECTED = 180; + public static final int CALC = 119; + public static final int FORK = 146; + public static final int STATEMACHINE = 79; + public static final int IMPLIES = 151; + public static final int AVEXPIRETIMERSTATE_T = 82; + public static final int SNAPSHOT = 194; + public static final int PRIVATE_F = 21; + public static final int VIA = 211; + public static final int RENDER = 186; + public static final int REAL_T = 61; + public static final int ATTRIBUTE = 114; + public static final int AVSTATEMACHINE_T = 76; + public static final int PUBLIC = 181; + public static final int SYNC_T = 47; + public static final int ENUM = 137; + public static final int DONE_U = 36; + public static final int REAL = 6; + public static final int UMINUS = 229; + public static final int REQUIREMENT = 190; + public static final int VERIFICATION = 209; + public static final int COMMENT = 121; + public static final int EQ = 7; + public static final int TARGET_F = 33; + public static final int MSG_U = 55; + public static final int AVPRESENDSTATE_T = 73; + public static final int SUCCESSION = 200; + public static final int MOD = 223; + public static final int DEPENDENCY = 130; + public static final int EXPOSE = 141; + public static final int GETS = 17; + public static final int DIV = 222; + public static final int AVPRERECEIVESTATE_T = 74; + public static final int SETTIMERREQUEST_T = 83; + public static final int PORT = 178; + public static final int REDEFINES = 183; + public static final int LPAR = 8; + public static final int ITEM = 159; + public static final int ASSIGN = 110; + public static final int SUBSETS = 199; + public static final int AFTER = 101; + public static final int NULL = 218; + public static final int STAKEHOLDER = 196; + public static final int DIF = 224; + public static final int PRIVATE = 179; + public static final int DO = 132; + public static final int EOF = 0; + public static final int MINUS = 220; + public static final int AVVOIDMETHOD_T = 64; + public static final int AVBLOCK_T = 63; + public static final int INT = 2; + public static final int TIMERSETMSG_T = 86; + public static final int BFIFOREL_T = 39; + public static final int NBFIFOREL_T = 40; + public static final int IMPORT = 152; + public static final int PACKAGE = 174; + public static final int RECEIVEACTION_T = 77; + public static final int ACTION = 99; + public static final int ELSE = 134; + public static final int EQUAL = 16; + public static final int SEND = 193; + public static final int WEIGHT_A = 94; + public static final int DERIVED = 131; + public static final int END = 135; + public static final int AVSETTIMERSTATE_T = 80; + public static final int INSIGNALBINDING_T = 48; + public static final int PART = 176; + public static final int DISTRIBUTION_A = 93; + public static final int VERIFY = 210; + public static final int OR = 171; + public static final int FIRST = 143; + public static final int BINDING = 116; + public static final int IMMEDIATEREQUEST_U = 52; + public static final int ASSERT = 109; + public static final int WHEN = 214; + public static final int FILTER = 142; + public static final int AND = 107; + public static final int TIMEREXPIREMSG_T = 88; + public static final int OF = 170; + public static final int BY = 118; + public static final int INTEGER_T = 59; + public static final int EXPIRE_TM = 92; + public static final int CONCERN = 122; + public static final int PARALLEL = 175; + public static final int ASSIGNMENT_T = 56; + public static final int STRING_T = 60; + public static final int REP = 188; + public static final int AMOUNT_U = 34; + public static final int REQUEST_F = 26; + public static final int CONNECTION = 124; + public static final int REF = 184; + public static final int IDENT = 95; + public static final int NBFIFO_T = 46; + public static final int BOOL = 3; + public static final int ALIAS = 102; + public static final int INTERFACE = 157; + public static final int PAYLOAD_F = 30; + public static final int BLOCK2_F = 24; + public static final int LEQ = 227; + public static final int QUEST = 18; + public static final int TRANSITIONACTION_T = 78; + public static final int EVENT = 138; + public static final int AT = 113; + public static final int OCCURRENCE = 169; + public static final int AS = 108; + public static final int FRAME = 147; + public static final int CASE = 120; + public static final int AVCOUNTSTATE_T = 72; + public static final int CHANNEL_T = 43; + public static final int REFINES = 217; + public static final int START_U = 35; + public static final int PLUS = 219; + public static final int INDEX_F = 28; + public static final int FIFO_T = 44; + public static final int RELATION_T = 37; + public static final int ALL = 103; + public static final int AVTRANSITION_T = 75; + public static final int MERGE = 163; + public static final int RPAR = 9; + public static final int CHANNEL_F = 31; + public static final int SYNCREL_T = 38; + public static final int WHILE = 215; + public static final int REQUIRE = 189; + public static final int METADATA = 165; + public static final int ALLOCATE = 104; + public static final int XOR = 216; + public static final int AVTIMER_T = 89; + public static final int RELATION_F = 22; + public static final int AVRECEIVESTATE_T = 70; + public static final int ACCEPT = 98; + public static final int AVSTARTSTATE_T = 68; + public static final int DEF = 127; + public static final int ISTYPE = 158; + public static final int COMMA = 12; + public static final int LT = 225; + public static final int VARIATION = 208; + public static final int MESSAGE = 164; + public static final int LOOP = 162; + public static final int BIND = 115; + public static final int ORDERED = 172; + public static final int ABOUT = 96; + public static final int EXPIRETIMERREQUEST_T = 85; + public static final int VIEW = 212; + public static final int AVCALCMETHOD_T = 65; + public static final int AVRESETTIMERSTATE_T = 81; + public static final int OUTMESSAGE_T = 42; + public static final int AVSENDSTATE_T = 69; + public static final int TIMESLICE = 202; + public static final int ALLOCATION = 105; + public static final int NOT = 167; + public static final int OUT = 173; + public static final int LBRAC = 10; + public static final int SUBJECT = 198; + public static final int TIMERRESETMSG_T = 87; + public static final int DELAY_F = 29; + public static final int ASSUME = 112; + public static final int JOIN = 160; + public static final int VIEWPOINT = 213; + public static final int STATE = 197; + public static final int OBJECTIVE = 168; + public static final int RETURN = 191; + public static final int SET_TM = 90; + public static final int FOR = 145; + public static final int THEN = 201; + public static final int READONLY = 182; + public static final int INMESSAGE_T = 41; + public static final int ABSTRACT = 97; + public static final int STRING = 4; + public static final int DECIDE = 126; + public static final int VALUE_F = 32; + public static final int DOC = 133; + public static final int ENTRY = 136; + public static final int ACTOR = 100; + public static final int USE = 206; + public static final int FROM = 148; + public static final int REFERENCES = 185; + public static final int RESETTIMERREQUEST_T = 84; + public static final int DEFINED = 129; + public static final int ASSOC = 111; + public static final int SATISFY = 192; + public static final int FLOW = 144; + public static final int OUTSIGNALBINDING_T = 49; + public static final int SEMICOLON = 13; + public static final int POINT = 15; + public static final int RESET_TM = 91; + public static final int SENDREQUEST_T = 53; + public static final int RENDERING = 187; + public static final int CONSTRAINT = 125; + public static final int POOL_F = 25; + public static final int AVRANDOMSTATE_T = 71; + public static final int SPECIALIZES = 195; + public static final int NONUNIQUE = 166; + public static final int IN = 153; + public static final int VARIANT = 207; + public static final int LANGUAGE = 161; + public static final int error = 1; + public static final int IF = 150; + public static final int NOKREQUEST_U = 50; + public static final int DEFAULT = 128; + public static final int COLON = 14; + public static final int EXHIBIT = 139; + public static final int PERFORM = 177; + public static final int MAXSIZE_F = 20; + public static final int ANYNAME = 5; + public static final int HASTYPE = 149; + public static final int RECEIVEREQUEST_T = 54; + public static final int TO = 203; + public static final int RBRAC = 11; + public static final int INOUT = 156; + public static final int BFIFO_T = 45; + public static final String[] terminalNames = new String[] { + "EOF", + "error", + "INT", + "BOOL", + "STRING", + "ANYNAME", + "REAL", + "EQ", + "LPAR", + "RPAR", + "LBRAC", + "RBRAC", + "COMMA", + "SEMICOLON", + "COLON", + "POINT", + "EQUAL", + "GETS", + "QUEST", + "LOSSY_F", + "MAXSIZE_F", + "PRIVATE_F", + "RELATION_F", + "BLOCK1_F", + "BLOCK2_F", + "POOL_F", + "REQUEST_F", + "STATEACTION_F", + "INDEX_F", + "DELAY_F", + "PAYLOAD_F", + "CHANNEL_F", + "VALUE_F", + "TARGET_F", + "AMOUNT_U", + "START_U", + "DONE_U", + "RELATION_T", + "SYNCREL_T", + "BFIFOREL_T", + "NBFIFOREL_T", + "INMESSAGE_T", + "OUTMESSAGE_T", + "CHANNEL_T", + "FIFO_T", + "BFIFO_T", + "NBFIFO_T", + "SYNC_T", + "INSIGNALBINDING_T", + "OUTSIGNALBINDING_T", + "NOKREQUEST_U", + "TRIVIALREQUEST_T", + "IMMEDIATEREQUEST_U", + "SENDREQUEST_T", + "RECEIVEREQUEST_T", + "MSG_U", + "ASSIGNMENT_T", + "BOUNDRANDOM_U", + "BOOLEAN_T", + "INTEGER_T", + "STRING_T", + "REAL_T", + "AVDATATYPE_T", + "AVBLOCK_T", + "AVVOIDMETHOD_T", + "AVCALCMETHOD_T", + "AVSTANDARDSTATE_T", + "AVSTOPSTATE_T", + "AVSTARTSTATE_T", + "AVSENDSTATE_T", + "AVRECEIVESTATE_T", + "AVRANDOMSTATE_T", + "AVCOUNTSTATE_T", + "AVPRESENDSTATE_T", + "AVPRERECEIVESTATE_T", + "AVTRANSITION_T", + "AVSTATEMACHINE_T", + "RECEIVEACTION_T", + "TRANSITIONACTION_T", + "STATEMACHINE", + "AVSETTIMERSTATE_T", + "AVRESETTIMERSTATE_T", + "AVEXPIRETIMERSTATE_T", + "SETTIMERREQUEST_T", + "RESETTIMERREQUEST_T", + "EXPIRETIMERREQUEST_T", + "TIMERSETMSG_T", + "TIMERRESETMSG_T", + "TIMEREXPIREMSG_T", + "AVTIMER_T", + "SET_TM", + "RESET_TM", + "EXPIRE_TM", + "DISTRIBUTION_A", + "WEIGHT_A", + "IDENT", + "ABOUT", + "ABSTRACT", + "ACCEPT", + "ACTION", + "ACTOR", + "AFTER", + "ALIAS", + "ALL", + "ALLOCATE", + "ALLOCATION", + "ANALYSIS", + "AND", + "AS", + "ASSERT", + "ASSIGN", + "ASSOC", + "ASSUME", + "AT", + "ATTRIBUTE", + "BIND", + "BINDING", + "BLOCK", + "BY", + "CALC", + "CASE", + "COMMENT", + "CONCERN", + "CONNECT", + "CONNECTION", + "CONSTRAINT", + "DECIDE", + "DEF", + "DEFAULT", + "DEFINED", + "DEPENDENCY", + "DERIVED", + "DO", + "DOC", + "ELSE", + "END", + "ENTRY", + "ENUM", + "EVENT", + "EXHIBIT", + "EXIT", + "EXPOSE", + "FILTER", + "FIRST", + "FLOW", + "FOR", + "FORK", + "FRAME", + "FROM", + "HASTYPE", + "IF", + "IMPLIES", + "IMPORT", + "IN", + "INCLUDE", + "INDIVIDUAL", + "INOUT", + "INTERFACE", + "ISTYPE", + "ITEM", + "JOIN", + "LANGUAGE", + "LOOP", + "MERGE", + "MESSAGE", + "METADATA", + "NONUNIQUE", + "NOT", + "OBJECTIVE", + "OCCURRENCE", + "OF", + "OR", + "ORDERED", + "OUT", + "PACKAGE", + "PARALLEL", + "PART", + "PERFORM", + "PORT", + "PRIVATE", + "PROTECTED", + "PUBLIC", + "READONLY", + "REDEFINES", + "REF", + "REFERENCES", + "RENDER", + "RENDERING", + "REP", + "REQUIRE", + "REQUIREMENT", + "RETURN", + "SATISFY", + "SEND", + "SNAPSHOT", + "SPECIALIZES", + "STAKEHOLDER", + "STATE", + "SUBJECT", + "SUBSETS", + "SUCCESSION", + "THEN", + "TIMESLICE", + "TO", + "TRANSITION", + "UNTIL", + "USE", + "VARIANT", + "VARIATION", + "VERIFICATION", + "VERIFY", + "VIA", + "VIEW", + "VIEWPOINT", + "WHEN", + "WHILE", + "XOR", + "REFINES", + "NULL", + "PLUS", + "MINUS", + "MULT", + "DIV", + "MOD", + "DIF", + "LT", + "GT", + "LEQ", + "GEQ", + "UMINUS" + }; + + /* non terminals */ + static final int receiveRequestBegin = 103; + static final int privateParam = 21; + static final int startStateBegin = 107; + static final int call = 159; + static final int receiveAssign = 143; + static final int specializes = 5; + static final int calcMethodDeclBegin = 61; + static final int receiveStateBegin = 111; + static final int messageChannel = 38; + static final int transitionActionBegin = 138; + static final int block2Param = 20; + static final int standardState = 67; + static final int stxCallParams = 161; + static final int featureList = 3; + static final int presendState = 73; + static final int inSignalBinding = 32; + static final int blockAlias = 7; + static final int blockChain = 8; + static final int receiveAction = 134; + static final int typeIdent = 0; + static final int actionRandomExpr = 94; + static final int prereceiveStateBegin = 115; + static final int relParam = 18; + static final int calcMethodDecl = 52; + static final int bfChDecl = 30; + static final int stopStateBegin = 109; + static final int signalBinding = 31; + static final int receiveAssignSeq = 142; + static final int stxCallParam = 157; + static final int fieldDecl = 12; + static final int setTimerState = 75; + static final int stateMachineItem = 59; + static final int trivialRequestBegin = 101; + static final int delayKeyword = 148; + static final int weightLabel = 146; + static final int messageLine = 140; + static final int randomParam = 123; + static final int indexParam = 91; + static final int fullIdent = 137; + static final int blockDecl = 43; + static final int outSignalBinding = 33; + static final int nbfRelDecl = 15; + static final int syncRelDecl = 14; + static final int presendStateBegin = 114; + static final int countState = 72; + static final int outMessageDecl = 36; + static final int act = 129; + static final int sendStateBegin = 110; + static final int attributeDecl = 47; + static final int fieldDecls = 11; + static final int maxsizeParam = 22; + static final int doActions = 127; + static final int voidMethodDeclBegin = 60; + static final int randomStateBegin = 112; + static final int lossyParam = 23; + static final int target = 136; + static final int sendRequestBegin = 102; + static final int fieldDeclBegin = 63; + static final int bfRelDecl = 16; + static final int requestParam = 79; + static final int payloadParam = 96; + static final int startState = 66; + static final int assign = 135; + static final int simpleRequest = 82; + static final int messageDecl = 34; + static final int datatypeDeclHEADER = 10; + static final int expr = 154; + static final int stopState = 68; + static final int randomAction = 121; + static final int calcMethodItem = 54; + static final int voidMethodDecl = 51; + static final int receiveState = 70; + static final int feature = 4; + static final int bfRelDeclBegin = 26; + static final int poolParam = 78; + static final int inMessageDeclBegin = 41; + static final int sendRequest = 86; + static final int nbfRelDeclBegin = 25; + static final int expireTimerRequestBegin = 106; + static final int calcMethodItems = 53; + static final int setTimerRequest = 88; + static final int redefineField = 40; + static final int blockDeclBegin = 44; + static final int dummy = 149; + static final int constantDeclHEADER = 62; + static final int blockDeclBODY = 45; + static final int trivialRequest = 83; + static final int stxCall = 152; + static final int countAction = 124; + static final int expireTimerStateBegin = 118; + static final int relationDecl = 13; + static final int inMessageDecl = 35; + static final int blockItem = 46; + static final int outMessageDeclBegin = 42; + static final int transitionLabels = 132; + static final int comma = 158; + static final int delayParam = 92; + static final int relParams = 17; + static final int targetParam = 122; + static final int actionSeq = 128; + static final int resetTimerRequest = 89; + static final int fulllIdent = 1; + static final int syncRelDeclBegin = 24; + static final int expireTimerRequest = 90; + static final int fieldVal = 64; + static final int termList = 130; + static final int receiveActionBegin = 139; + static final int randomState = 71; + static final int expiretimerParam = 100; + static final int constantDecl = 48; + static final int extraLabel = 147; + static final int distributionLabel = 145; + static final int state = 65; + static final int stateMachine = 57; + static final int resetTimerStateBegin = 117; + static final int requestArg = 85; + static final int syncChDecl = 28; + static final int signalDecl = 55; + static final int inMessageDeclBODY = 37; + static final int subsets = 6; + static final int standardStateBegin = 108; + static final int delayRandomExpr = 95; + static final int methodDecl = 50; + static final int resettimerParam = 99; + static final int outMessageDeclBODY = 39; + static final int payloadParamBegin = 120; + static final int receiveRequest = 87; + static final int channelDecl = 27; + static final int transition = 126; + static final int resetTimerRequestBegin = 105; + static final int channelParam = 97; + static final int transitionBegin = 131; + static final int timerDecl = 56; + static final int transitionAction = 133; + static final int stxRvalue = 150; + static final int sendState = 69; + static final int block1Param = 19; + static final int complexIdent = 155; + static final int iexpr = 153; + static final int datatypeDecl = 9; + static final int callBegin = 160; + static final int countParam = 125; + static final int expireTimerState = 77; + static final int prereceiveState = 74; + static final int requestList = 80; + static final int settimerParam = 98; + static final int setTimerRequestBegin = 104; + static final int requestArgs = 84; + static final int stateMachineItems = 58; + static final int request = 81; + static final int stxExpr = 151; + static final int setTimerStateBegin = 116; + static final int delayExpr = 93; + static final int attributeDeclHEADER = 49; + static final int resetTimerState = 76; + static final int model = 2; + static final int nbfChDecl = 29; + static final int receiveAssigns = 141; + static final int stateMachineBegin = 119; + static final int stxCallBegin = 156; + static final int transitionLabel = 144; + static final int countStateBegin = 113; +} + diff --git a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLSyntax.java b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLSyntax.java new file mode 100644 index 0000000000000000000000000000000000000000..825e323817c74a049833e720a58bf7c1cdde6d21 --- /dev/null +++ b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLSyntax.java @@ -0,0 +1,1340 @@ +/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille + * + * ludovic.apvrille AT enst.fr + * + * This software is a computer program whose purpose is to allow the + * edition of TURTLE analysis, design and deployment diagrams, to + * allow the generation of RT-LOTOS or Java code from this diagram, + * and at last to allow the analysis of formal validation traces + * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP + * from INRIA Rhone-Alpes. + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + */ + +package avatartranslator.tosysmlv2; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.function.BiConsumer; + +import avatartranslator.AvatarTransition; +import java_cup.runtime.ComplexSymbolFactory.Location; + +/** Class AvatarFromSysMLSyntax + * Creation: 20/06/2024 + * + * @author Sophie Coudert + * @version 0.1 20/06/2024 + * + * Abstract Syntax "trees" (in fact models) and their components. + * Associated locations (left, right) locate the component with + * line and column in the source file + */ +public class AvatarFromSysMLSyntax { + + /** type of idents generated for datatype names */ + public static final byte DATATYPENAME = 0; + /** type of idents generated for block names */ + public static final byte BLOCKNAME = 1; + /** type of idents generated for attribute or method names */ + public static final byte ATTRIBUTENAME = 2; + /** type of idents generated for relation names */ + public static final byte RELATIONNAME = 3; + /** type of idents generated for some part of channel names */ + public static final byte CHANNELPRENAME = 4; + /** type of idents generated for signal names */ + public static final byte SIGNALNAME = 5; + /** type of idents generated for channel names */ + public static final byte CHANNELNAME = 6; + /** type of idents generated for signal profile names */ + public static final byte MESSAGENAME = 7; + /** type of idents generated for Avatar state names */ + public static final byte STANDARDSTATENAME = 8; + /** type of idents generated for start state names */ + public static final byte STARTSTATENAME = 9; + /** type of idents generated for stop state names */ + public static final byte STOPSTATENAME = 10; + /** type of idents generated for random operation names */ + public static final byte RANDOMSTATENAME = 11; + /** type of idents generated for signal count operation names */ + public static final byte COUNTSTATENAME = 12; + /** type of idents generated for signal sending action names */ + public static final byte SENDSTATENAME = 13; + /** type of idents generated for signal receiving operation names */ + public static final byte RECEIVESTATENAME = 14; + /** type of idents generated for technically added state before sending action names */ + public static final byte PRESENDSTATENAME = 15; + /** type of idents generated for technically added state before receiving action names */ + public static final byte PRERECEIVESTATENAME = 16; + /** type of idents generated for setting timer action names */ + public static final byte SETTIMERSTATENAME = 17; + /** type of idents generated for resetting timer action names */ + public static final byte RESETTIMERSTATENAME = 18; + /** type of idents generated for expire timer action names */ + public static final byte EXPIRETIMERSTATENAME = 19; + /** type of idents generated for technically added state before setting timer action names */ + public static final byte PRESETTIMERSTATENAME = 20; + /** type of idents generated for technically added state before resetting timer action names */ + public static final byte PRERESETTIMERSTATENAME = 21; + /** type of idents generated for technically added state before expire timer action names */ + public static final byte PREEXPIRETIMERSTATENAME = 22; + /** type of idents generated for timer names */ + public static final byte TIMERBLOCKNAME = 23; + /** type of idents generated for any name between quotes that is not of another type */ + public static final byte QUOTEDNAME = 24; + /** type of idents generated for Avatar-well-formed ident names */ + public static final byte AVATARNAME = 25; + /** type of start states */ + public static final byte STXSTARTSTATE = 0; + /** type of stop states */ + public static final byte STXSTOPSTATE = 1; + /** type of Avatar states */ + public static final byte STXSTANDARDSTATE = 2; + /** type of Random actions */ + public static final byte STXRANDOMSTATE = 3; + /** type of count signal actions */ + public static final byte STXCOUNTSTATE = 4; + /** type of send actions */ + public static final byte STXSENDSTATE = 5; + /** type of receive actions */ + public static final byte STXRECEIVESTATE = 6; + /** type of state added before send actions */ + public static final byte STXPRESENDSTATE = 7; + /** type of state added before receive actions */ + public static final byte STXPRERECEIVESTATE = 8; + /** type of set timer actions */ + public static final byte STXSETTIMERSTATE = 9; + /** type of reset timer actions */ + public static final byte STXRESETTIMERSTATE = 10; + /** type of expire timer actions */ + public static final byte STXEXPIRETIMERSTATE = 11; + /** type of transitions without communication */ + public static final byte STXTRIVIALTRANSITION = 0; + /** type of transitions requiring a send action to complete */ + public static final byte STXSENDTRANSITION = 1; + /** type of transitions requiring a receive action to complete */ + public static final byte STXRECEIVETRANSITION = 2; + /** type of transitions requiring a set timer action to complete */ + public static final byte STXSETTIMERTRANSITION = 3; + /** type of transitions requiring a reset timer action to complete */ + public static final byte STXRESETTIMERTRANSITION = 4; + /** type of transitions requiring an expire timer action to complete */ + public static final byte STXEXPIRETIMERTRANSITION = 5; + /** type of assignment transitions action */ + public static final byte STXASSIGNACTION = 0; + /** type of method-call transitions action */ + public static final byte STXMETHODACTION = 1; + + /** (technical) Arrays allowing to set a value at any index. + * + * Missing values are set to null. + */ + public static class MyArray<E> extends ArrayList<E> { + @Override + public E set(int index, E element){ + int max = size(); + for(int i = max; i <= index; i++) + add(null); + return super.set(index, element); + } + @Override + + public E get(int index){ + if (index < 0 || index >= size()) return null; + else return super.get(index); + } + } + + /** idents collected while parsing an Avatar SysML Model. + * + * when generated, sysML names differ from original Avatar names. + * All these names are without quotes (removed when found while parsing) + */ + public static class Ident extends StxElement { + /** type of the ident */ + private byte type; + /** sysML ident as found in the source file */ + private String sysMLName; // yet unused. perhaps to remove... + /** Avatar name + * + * different from sysMLName for generated idents: original Avatar names are + * restored + */ + private String avatarName; + /** builds an ident from a SysML string + * @param _type the ident type + * @param _smlName the SysML string + */ + + public Ident(byte _type, String _smlName) { + super(_smlName.trim()); + setTypeName(_type, _smlName.trim()); + } + + /** builds an ident from a SysML string + * @param _left + * @param _right + * @param _type the ident type + * @param _smlName the SysML string + */ + public Ident(Location _left, Location _right, byte _type, String _smlName) { + super(_smlName.trim(), _left, _right); + setTypeName(_type, _smlName.trim()); + }; + + /** generally the Avatar name + * @return the associated string + */ + @Override + public String toString() { return getAvatarName(); } + + /** Sets the names. + * + * Extract the Avatar original names from the generated names if relevant. + * If generated, _smlName must be consistent with _type + * + * @param _type known type + * @param _smlName SysML String. + */ + private void setTypeName(byte _type, String _smlName) { + type = _type; + if (type == AVATARNAME) { + sysMLName = _smlName; + avatarName = _smlName; + } else { + sysMLName = _smlName.substring(1, _smlName.length() - 1); + if (type == DATATYPENAME) { + avatarName = _smlName.substring(5, _smlName.length() - 1); + } else if (type == ATTRIBUTENAME) { + avatarName = _smlName.substring(2, _smlName.length() - 1); + } else if (type == SIGNALNAME) { + avatarName = _smlName.substring(6, _smlName.length() - 1); + } else if (type == STANDARDSTATENAME) { + avatarName = _smlName.substring(14, _smlName.length() - 1); + } else if (type == BLOCKNAME) { + avatarName = _smlName.substring(6, _smlName.length() - 1); + } else if (type == TIMERBLOCKNAME) { + avatarName = _smlName.substring(6, _smlName.length() - 1); + } else { + avatarName = sysMLName; + if (type == QUOTEDNAME) type = AVATARNAME; + } + + } + } + + /** @return type of the ident */ + public byte getType() { return type; } + + /** @return the SysML name */ + public String getSysMLName() { return sysMLName; } //unused + /** @return the Avatar name */ + public String getAvatarName() { return avatarName; } + /** Check ident type */ + public boolean is_DATATYPENAME() { return type == DATATYPENAME || type == AVATARNAME; } + /** Check ident type */ + public boolean is_BLOCKNAME() { return type == BLOCKNAME || type == AVATARNAME; } + /** Check ident type */ + public boolean is_ATTRIBUTENAME() { return type == ATTRIBUTENAME || type == AVATARNAME; } + /** Check ident type */ + public boolean is_RELATIONNAME() { return type == RELATIONNAME || type == AVATARNAME; } + /** Check ident type */ + public boolean is_CHANNELPRENAME() { return type == CHANNELPRENAME || type == AVATARNAME; } + /** Check ident type */ + public boolean is_SIGNALNAME() { return type == SIGNALNAME || type == AVATARNAME; } + /** Check ident type */ + public boolean is_CHANNELNAME() { return type == CHANNELNAME || type == AVATARNAME; } + /** Check ident type */ + public boolean is_MESSAGENAME() { return type == MESSAGENAME || type == AVATARNAME; } + /** Check ident type */ + public boolean is_STANDARDSTATENAME() { return type == STANDARDSTATENAME || type == AVATARNAME; } + /** Check ident type */ + public boolean is_STARTSTATENAME() { return type == STARTSTATENAME || type == AVATARNAME; } + /** Check ident type */ + public boolean is_STOPSTATENAME() { return type == STOPSTATENAME || type == AVATARNAME; } + /** Check ident type */ + public boolean is_RANDOMSTATENAME() { return type == RANDOMSTATENAME || type == AVATARNAME; } + /** Check ident type */ + public boolean is_COUNTSTATENAME() { return type == COUNTSTATENAME || type == AVATARNAME; } + /** Check ident type */ + public boolean is_SENDSTATENAME() { return type == SENDSTATENAME || type == AVATARNAME; } + /** Check ident type */ + public boolean is_RECEIVESTATENAME() { return type == RECEIVESTATENAME || type == AVATARNAME; } + /** Check ident type */ + public boolean is_PRESENDSTATENAME() { return type == PRESENDSTATENAME || type == AVATARNAME; } + /** Check ident type */ + public boolean is_PRERECEIVESTATENAME() { return type == PRERECEIVESTATENAME || type == AVATARNAME; } + /** Check ident type */ + public boolean is_SETTIMERSTATENAME() { return type == SETTIMERSTATENAME || type == AVATARNAME; } + /** Check ident type */ + public boolean is_RESETTIMERSTATENAME() { return type == RESETTIMERSTATENAME || type == AVATARNAME; } + /** Check ident type */ + public boolean is_EXPIRETIMERSTATENAME() { return type == EXPIRETIMERSTATENAME || type == AVATARNAME; } + /** Check ident type */ + public boolean is_PRESETTIMERSTATENAME() { return type == PRESETTIMERSTATENAME || type == AVATARNAME; } + /** Check ident type */ + public boolean is_PRERESETTIMERSTATENAME() { return type == PRERESETTIMERSTATENAME || type == AVATARNAME; } + /** Check ident type */ + public boolean is_PREEXPIRETIMERSTATENAME() { return type == PREEXPIRETIMERSTATENAME || type == AVATARNAME; } + /** Check ident type */ + public boolean is_TIMERBLOCKNAME() { return type == TIMERBLOCKNAME || type == AVATARNAME; } + } + + /** Class of classified expression terms */ + public abstract static class StxTerm extends StxElement { + StxTerm(String _name, Location _left, Location _right) { super(_name, _left, _right); } + StxTerm(String _name) { super(_name); } + public String toString() { return getName(); } + } + + /** Terms that are int/bool expressions. + * + * They may be identifiers but not identified as such.*/ + public static class StxExpr extends StxTerm { + public StxExpr(String v) { super(v); } + } + + /** Terms that are Identifiers */ + public static class StxId extends StxTerm { + private String value ; + public StxId(String v) { super(v); } + } + + /** Terms that are method call. + * + * (technical) a call string is split into a sequence + * "segment ident segment ... ident segment" + * allowing to easily replace the idents */ + public static class StxCall extends StxTerm { + private ArrayList<String> segments; + private ArrayList<String> idents; + public StxCall() { + super(null); + segments = new ArrayList<String>(); + idents = new ArrayList<String>(); + } + public String getName() { super.setName(toString()); return(super.getName()); } + + public void addSegment(String s) { segments.add(s); } + + public void addIdent(String s) { idents.add(s); } + + public int getNbIdents() { return idents.size(); } + + public String getSegment(int i) { return segments.get(i); } + + public String getIdent(int i) { return idents.get(i); } + + /** rebuilds the original string by concatenating segments and idents */ + public String toString() { + StringBuffer result = new StringBuffer(); + int size = getNbIdents(); + int i; + for (i =0 ; i < size; i++) { + result.append(getSegment(i)); + result.append(getIdent(i)); + } + result.append(getSegment(i)); + return result.toString(); + } + } + + /** Syntactic elements with a name and locations in the source code. + * + * When possible, usually the left is the beginning location and the right is the ending one. + */ + public abstract static class StxElement { + private String name; + protected Location defaultLocation = new Location(-1,-1); + private Location left; + private Location right; + private boolean declared; + + public StxElement(String _name, Location _left, Location _right){ name = _name; left = _left; right = _right; declared = false; } + + public StxElement(String _name){ name = _name; left = defaultLocation; right = defaultLocation; declared = false; } + + public void setLeft(Location _left) { left = _left; } + + public void setRight(Location _right) { right = _right; } + + public String getName() { return name; } + + public void setName(String _name) { name = _name; } + + public Location getLeft() { return left; } + + public Location getRight() { return right; } + + /** sets the element as declared + * + * @return true iff the element was not already declared + */ + public boolean declare() { boolean res = !declared; declared = true; return res; } + + public boolean isDeclared() { return declared; } + } + + /** Typed fields for syntactic elements associated to structures. */ + public static class StxField extends StxElement { + private String type; + private String initialValue; + /** defaultValue = true means that the value is not explicitly set in Avatar */ + private boolean defaultValue; + + public StxField(String _name, String _type) { + super(_name.trim()); + type = _type.trim(); + initialValue = ""; + defaultValue = false; + } + + public StxField(Location _left, Location _right, String _name, String _type) { + super(_name.trim(), _left, _right); + type = _type.trim(); + initialValue = ""; + defaultValue = false; + } + + /** Primitive types are "Integer" and "Boolean". + * Other string are interpreted as datatype names. + */ + public String getType() { return type; } + + public void setType(String _type) { type = _type; } + + public void setInitialValue(String _initialValue) { initialValue = _initialValue; } + + public String getInitialValue() { return initialValue; } + + /** defaultValue = true means that the value is not explicitly set in Avatar. + * + * Relevant only if initial value is equal to Avatar'initial value for the field's type + */ + public void setDefaultValue(boolean b) { defaultValue = b; } + + /** defaultValue = true means that the value is not explicitly set in Avatar. + * + * Relevant only if initial value is equal to Avatar'initial value for the field's type + */ + public boolean getDefaultValue() { return defaultValue; } + } + + /** Syntactiv Elements associated Structures + * + * Structures have an ordered list of fields + */ + public static class StxStructure extends StxElement { + + protected MyArray<StxField> fields; + + public StxStructure(String _name, Location _left, Location _right) { + super(_name.trim(), _left, _right); + fields = new MyArray<StxField>(); + } + + public StxStructure(String _name) { + super(_name.trim()); + fields = new MyArray<StxField>(); + } + + /** add a field at the end of the list of fields. + * + * @param _field the field to add + * @return null if success. Otherwise, the field found with same name. + */ + public StxField addField(StxField _field){ + StxField result = null; + for (StxField fld : fields) { + if (fld.getName().equals(_field.getName())) { + result = fld; + break; + } + } + if (result == null) fields.add(_field); + return result; + } + + /** amount of fields */ + public int getSize() { return fields.size(); } + + public StxField getField(int i) { return fields.get(i);} + + public String getFieldName(int i) { return fields.get(i).getName();} + + public String getFieldType(int i) { return fields.get(i).getType();} + } + + /** Syntactic elements associated to Avatar datatype types. */ + public static class StxDataType extends StxStructure { + + public StxDataType(Location _left, Location _right, String _name) { super(_name, _left, _right); } + + public StxDataType(String _name) { super(_name); } + } + + /** Syntactic elements associated to Avatar Relations. + * + * They are typed communication connections between blocks + * that contain channels linking input and output signals */ + public static class StxRelation extends StxElement { + ArrayList<StxChannel> channels; + StxBlock block1; + StxBlock block2; + boolean blocking; + boolean lossy; + boolean isprivate; + int sizeOfFIFO; + boolean asynchronous; + + public StxRelation(String _name, Location _left, Location _right) { + super(_name.trim(), _left, _right); + channels = new ArrayList<StxChannel>(); + isprivate = false; + lossy = false; + String block1 = null; + String block2 = null; + } + + public StxRelation(String _name) { + super(_name.trim()); + channels = new ArrayList<StxChannel>(); + isprivate = false; + lossy = false; + String block1 = null; + String block2 = null; + } + + public void setBlock1(StxBlock _block) { block1 = _block; } + + public void setBlock2(StxBlock _block) { block2 = _block; } + + public void setBlocking(Boolean _b) { blocking = _b; } + + public void setPrivate(Boolean _b) { isprivate = _b; } + + public void setLossy(Boolean _b) { lossy = _b; } + + public void setFifoSize(int _size) { sizeOfFIFO = _size; } + + public void setAsynchronous(boolean _b) { asynchronous = _b; } + + public void addChannel(StxChannel ch) { channels.add(ch); } + + public StxBlock getBlock1() { return block1; } + + public StxBlock getBlock2() { return block2; } + + public Boolean getBlocking() { return blocking; } + + public Boolean getPrivate() { return isprivate; } + + public Boolean getLossy() { return lossy; } + + public int getFifoSize() { return sizeOfFIFO; } + + public boolean getAsynchronous() { return asynchronous; } + + public int getSize() { return channels.size(); } + + public StxChannel getChannel(int i) { return channels.get(i); } + } + + /** Syntactic elements associated to Avatar methods. + * + * Fields of structure correspond to the method's input profile. */ + public static class StxMethod extends StxStructure { + + private String returnType; + + public StxMethod(Location _left, Location _right, String _name) { super(_name, _left, _right); returnType = null; } + + public StxMethod(String _name) { super(_name); returnType = null; } + + public String getReturnType() { return returnType; } + + public void setReturnType(String _s) { returnType = _s; } + } + + /** Syntactic elements associated to Avatar attributes of blocks. + * + * defaultValue = true means that the initial value is not explicitly set. + * It is ignored if the initial value is not the Avatar default one. + */ + public static class StxAttribute extends StxElement { + private String type; + private String init; + private boolean defaultValue; + + public StxAttribute(String _name, Location _left, Location _right, String _type){ + super(_name.trim(), _left, _right); + type = _type; + init = ""; + defaultValue = false; + } + + public StxAttribute(String _name, String _type){ + super(_name.trim()); + type = _type; + init = ""; + defaultValue = false; + } + + public String getType() { return type; } + + public void setInit(String _s) { init = _s; } + + /** defaultValue = true means that the initial value is not explicitly set. + * It is ignored if the initial value is not the Avatar default one. + */ + public void setDefaultValue(boolean b) { defaultValue = b; } + + public String getInit() { return init; } + + /** defaultValue = true means that the initial value is not explicitly set. + * It is ignored if the initial value is not the Avatar default one. + */ + public boolean getDefaultValue() { return defaultValue; } + } + + /** Syntactic elements associated to Avatar Timers, among attributes */ + public static class StxTimer extends StxAttribute { + + public StxTimer( String _name, Location _left, Location _right){ super(_name, _left, _right, ""); } + + public StxTimer(String _name){ super(_name, ""); } + } + + /** Syntactic elements associated to Avatar Blocks. + * + * (technical) Transitions are contained in their source state. + * Names of constants, attributes, methods, signals and timers + * must be different. */ + public static class StxBlock extends StxElement { + StxBlock father = null; + ArrayList<StxAttribute> attributes; + ArrayList<StxAttribute> constants; + ArrayList<StxMethod> methods; + ArrayList<StxSignal> signals; + ArrayList<StxTimer> timers; + StxState[] states; + + public StxBlock(String _name, Location _left, Location _right) { + super(_name, _left, _right); + father = null; + attributes = new ArrayList<StxAttribute>(); + constants = new ArrayList<StxAttribute>(); + methods = new ArrayList<StxMethod>(); + signals = new ArrayList<StxSignal>(); + timers = new ArrayList<StxTimer>(); + } + + public StxBlock(String _name) { + super(_name); + father = null; + attributes = new ArrayList<StxAttribute>(); + constants = new ArrayList<StxAttribute>(); + methods = new ArrayList<StxMethod>(); + signals = new ArrayList<StxSignal>(); + timers = new ArrayList<StxTimer>(); + } + + public void setFather(StxBlock _father) { father = _father; } + + public StxState[] getStates() { return states; } + + public void setStates(StxState[] l) { states = l; } + + /** Add an attribute (at the end: order respected) + * @param a the attribute to add + * @return null in case of success. Otherwise, the found element with same name. + */ + public StxElement addAttribute(StxAttribute a){ + for (StxSignal sig : signals) if (sig.getName().equals(a.getName())) return sig; + for (StxAttribute att : constants) if (att.getName().equals(a.getName())) return att; + for (StxAttribute att : attributes) if (att.getName().equals(a.getName())) return att; + for (StxAttribute att : timers) if (att.getName().equals(a.getName())) return att; + for (StxMethod mth : methods) if (mth.getName().equals(a.getName())) return mth; + attributes.add(a); + return null; + } + + /** Add a constant (at the end: order respected) + * @param a the constant to add + * @return null in case of success. Otherwise, the found element with same name. + */ + public StxElement addConstant(StxAttribute a){ + for (StxSignal sig : signals) if (sig.getName().equals(a.getName())) return sig; + for (StxAttribute att : constants) if (att.getName().equals(a.getName())) return att; + for (StxAttribute att : attributes) if (att.getName().equals(a.getName())) return att; + for (StxAttribute att : timers) if (att.getName().equals(a.getName())) return att; + for (StxMethod mth : methods) if (mth.getName().equals(a.getName())) return mth; + constants.add(a); + return null; + } + + /** Add a method (at the end) + * @param m the method to add + * @return null in case of success. Otherwise, the found element with same name. + */ + public StxElement addMethod(StxMethod m){ + for (StxSignal sig : signals) if (sig.getName().equals(m.getName())) return sig; + for (StxAttribute att : constants) if (att.getName().equals(m.getName())) return att; + for (StxAttribute att : attributes) if (att.getName().equals(m.getName())) return att; + for (StxAttribute att : timers) if (att.getName().equals(m.getName())) return att; + for (StxMethod mth : methods) if (mth.getName().equals(m.getName())) return mth; + methods.add(m); + return null; + } + + /** Add a signal (at the end) + * @param s the signal to add + * @return null in case of success. Otherwise, the found element with same name. + */ + public StxElement addSignal(StxSignal s){ + for (StxSignal sig : signals) if (sig.getName().equals(s.getName())) return sig; + for (StxAttribute att : constants) if (att.getName().equals(s.getName())) return att; + for (StxAttribute att : attributes) if (att.getName().equals(s.getName())) return att; + for (StxAttribute att : timers) if (att.getName().equals(s.getName())) return att; + for (StxMethod mth : methods) if (mth.getName().equals(s.getName())) return mth; + signals.add(s); + return null; + } + + /** Add a timer (at the end) + * @param t the timer to add + * @return null in case of success. Otherwise, the found element with same name. + */ + public StxElement addTimer(StxTimer t){ + for (StxSignal sig : signals) if (sig.getName().equals(t.getName())) return sig; + for (StxAttribute att : constants) if (att.getName().equals(t.getName())) return att; + for (StxAttribute att : attributes) if (att.getName().equals(t.getName())) return att; + for (StxAttribute att : timers) if (att.getName().equals(t.getName())) return att; + for (StxMethod mth : methods) if (mth.getName().equals(t.getName())) return mth; + timers.add(t); + return null; + } + + /** @return the containing block (null if none) + */ + public StxBlock getFather() { return father; } + + public int getNbAttributes() { return attributes.size(); } + + public int getNbConstants() { return constants.size(); } + + public int getNbMethods() { return methods.size(); } + + public int getNbSignals() { return signals.size(); } + + public int getNbTimers() { return timers.size(); } + + public StxAttribute getAttribute(int i) { return attributes.get(i); } + + public StxAttribute getConstant(int i) { return constants.get(i); } + + public StxMethod getMethod(int i) { return methods.get(i); } + + public StxSignal getSignal(int i) { return signals.get(i); } + public StxTimer getTimer(int i) { return timers.get(i); } + } + + /** Syntactic elements associated to Avatar signal connections (in Relations) **/ + public static class StxChannel extends StxElement { + + private StxInMessage inProfile; // typing the connected input signal + private StxOutMessage outProfile; // typing the connected output signal + private String blockA; // block of signalA + private StxSignal signalA; // one of the connected signals + private String blockB; // block of signalB + private StxSignal signalB; // the other connected signals + + public StxChannel(String _name, Location _left, Location _right){ + super(_name, _left, _right); + inProfile = null; + outProfile = null; + blockA = null; + blockB = null; + signalA = null; + signalB = null; + } + + public StxChannel(String _name){ + super(_name); + inProfile = null; + outProfile = null; + blockA = null; + blockB = null; + signalA = null; + signalB = null; + } + + public void setInProfile(StxInMessage m) { inProfile = m; } + + public void setOutProfile(StxOutMessage m) { outProfile = m; } + + /** Set one of the connected signals. + * + * To be used twice: does nothing if both signals are set. + * @param _block the bloc of the signal to set + * @param s the signal to set + */ + public void setSignal(String _block, StxSignal s) { + if (signalA == null) { blockA = _block; signalA = s; } + else if (signalB == null) { blockB = _block; signalB = s; } + } + + /** commute signals so that signalA is the signal of the parameter block + * + * If possible... Usefull to respect block order in relations. + * @param _block1 the block to which signalA is expected to belong + */ + public void commuteSignals(String _block1) { + boolean permut = + (blockB != null && blockB.equals(_block1)) || (blockA != null && ! blockA.equals(_block1)); + if (permut) { + String auxStr = blockA; + StxSignal auxSig = signalA; + blockA = blockB; + signalA = signalB; + blockB = auxStr; + signalB = auxSig; + } + } + + public StxInMessage getInProfile() { return inProfile; } + + public StxOutMessage getOutProfile() { return outProfile; } + + public StxSignal getSignalA() { return signalA; } + + public StxSignal getSignalB() { return signalB; } + + public String getBlockA() { return blockA; } + + public String getBlockB() { return blockB; } + } + + /** Syntactic elements associated to Avatar Signals */ + public static class StxSignal extends StxElement { + + private boolean input; + private StxChannel channel; + + public StxSignal(String _name, Location _left, Location _right){ + super(_name, _left, _right); + } + + public StxSignal(String _name){ + super(_name); + } + + /** Set signal direction + * @param _b true for an input signal + */ + public void setInput(boolean _b) { input = _b; } + + /** set the channel that connects the signal + * + * @param _c the channel (connection belonging to a relation) + */ + public void setChannel(StxChannel _c) { channel = _c; } + + /** get the channel of the signal **/ + public StxChannel getChannel() { return channel; } + + /** signal direction + * + * @return true for receiving signals, false for sending + */ + public boolean isInput() { return input; } + } + + /** Syntactic elements associated to receiving signal profiles. + * + * A profile is associated to one single signal (through an associated channel) */ + public static class StxInMessage extends StxStructure { + + protected StxChannel channel; + + public StxInMessage(String _name, Location _left, Location _right) { super(_name, _left, _right); } + + + public StxInMessage(String _name) { super(_name); } + + /** Set the channel connecting the associated signal */ + public void setChannel(StxChannel c) {channel = c; } + + /** get the index of a field/parameter + * + * @return the index, or -1 if not found */ + public int indexOf(String s) { + int i = 0; + for (StxField f : fields) { + if (f.getName().equals(s)) break; + i++; + } + if (i == fields.size()) return -1; + return i; + } + } + + /** Syntactic elements associated to sending signal profiles */ + public static class StxOutMessage extends StxInMessage { + + private StxInMessage inMessage; // associated input profile + private HashMap<StxField,String> fieldMap; // maps parameters/fields to associated names in input profile + + public StxOutMessage(String _name, Location _left, Location _right, StxInMessage _inMessage) { + super(_name, _left, _right); + inMessage = _inMessage; + fieldMap = new HashMap<StxField,String>(); + } + + public StxOutMessage(String _name, StxInMessage _inMessage) { + super(_name); + inMessage = _inMessage; + fieldMap = new HashMap<StxField,String>(); + } + + /** Associate an input field name to an output field */ + public boolean addFieldLink(StxField outField, String inField){ + String test = fieldMap.get(outField); + if (test == null) { + fieldMap.put(outField, inField); + return true; + } + return false; + } + + + /** to complete the output profile using infos from the associated input profile + * + * Applied to fieldMap which links both profiles. Used to set the type and the order + * (thus the relevant order is the one in the declaration of the input profile) + */ + + private class Complete implements BiConsumer<StxField, String> { + List<AvatarFromSysMLError> errors; // to put encountered errors + private boolean[] inProfile; // to verify that all input fields have been handled at the end + + public boolean[] getInProfile() { return inProfile; } + + public Complete(List<AvatarFromSysMLError> l){ + errors = l; + inProfile = new boolean[inMessage.getSize()]; + for (int i = 0; i < inMessage.getSize(); i++) { inProfile[i] = false; } + }; + + public void accept(StxField o, String i) { + int index = inMessage.indexOf(i); + if ( index == -1) { + errors.add(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, o.getLeft(),"Field " + + o.getName() + " of out-message is " + + "associated to a field (" + i + ") in in-message that does not exist", inMessage.getLeft())); + } + else { + inProfile[index] = true; // input field handled + o.setType(inMessage.fields.get(index).getType()); // set type + fields.set(index, o); // respects input order + } + } + } + + /** to complete the output profile (and some other data) using infos from the associated input profile. + * + * Builds field list. Get types and fields order from associated input profile. + * (thus the relevant order is the one in the declaration of the input profile) + * + * Also updates some other data in associated components (channel,...) + * To be run after Parsing for a consistent abstract syntax tree/model + */ + public void complete(List<AvatarFromSysMLError> errors) { + if (inMessage == null) + if (errors != null) { + errors.add(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, getLeft(), + "in-message associated to out-message has not been set",null)); + return; + } + // error case or default: missing fields -> copy input fields. + if (fieldMap.isEmpty()) for (StxField f: inMessage.fields) fields.add(f); + else { + Complete cmp = new Complete(errors); + fieldMap.forEach(cmp); // handle fields + boolean[] inProfile = cmp.getInProfile(); + for(int i =0; i < inProfile.length; i++) { // verify that no input field is missing + if (!inProfile[i]) { + errors.add(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, getLeft(), + "out-message has no field associated to in-message field " + inMessage.getFieldName(i) + " --> field added", + inMessage.getLeft())); + // for consistency, to avoid some redoundant error messages later. + fields.set(i, new StxField(inMessage.getFieldName(i), inMessage.getFieldType(i))); + } + } + } + + channel = inMessage.channel; // set Channel + if (channel == null) + if (errors != null) { + errors.add(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, getLeft(), + "Channel of in-message associated to out-message has not been set", + inMessage.getLeft())); + return; + } + channel.setOutProfile(this); //update channel + if (channel.getSignalA() == null) + if (errors != null) { + errors.add(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, getLeft(), + "Channel of in-message associated to out-message has not associated signal", + channel.getLeft())); + return; + } + channel.getSignalA().setChannel(channel); // complete one signal + if (channel.getSignalB() == null) + if (errors != null) { + errors.add(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, getLeft(), + "Channel of in-message associated to out-message has only one associated signal", + channel.getLeft())); + return; + } + channel.getSignalB().setChannel(channel); // complete the other signal + } + } + + /** Syntactic elements associated to "boxes" of state-machines (states,communications,...) */ + public static class StxState extends StxElement { + private byte type; // box kind + private StxSignal signal; // for count (Avatar QueryOnSignal= + private String variable; // for count and random + private String minValue; // for random + private String maxValue; // for random + private MyArray<StxTransition> transitions; // outgoing transitions + + public StxState(String _name) { + super(_name); + type = -1; + signal = null; + variable = null; + minValue = null; + maxValue = null; + transitions = new MyArray<StxTransition>(); + } + + public byte getType() { return type; }; + + public void setType(byte _b) { type = _b; }; + + public StxSignal getSignal() { return signal; }; + + public void setSignal(StxSignal _s) { signal = _s; }; + + public String getVariable() { return variable; }; + + public void setVariable(String _s) { variable = _s; }; + + public String getMinValue() { return minValue; }; + + public void setMinValue(String _s) { minValue = _s; }; + + public String getMaxValue() { return maxValue; }; + + public void setMaxValue(String _s) { maxValue = _s; }; + + public List<StxTransition> getTransitions() { return transitions; } + + public StxTransition getTransition(int i) { + if (i<0) return null; + StxTransition result = transitions.get(i); + if (result == null) { + result = new StxTransition(i); + transitions.set(i,result); + } + return result; + } + } + + /** Syntactic elements associated to transitions of state-machines. + * + * some information associated to these transition is finally associated + * to their target state-machine "boxes" in Avatar model, in particular + * signal and timer information. + */ + public static class StxTransition extends StxElement { + + private byte type; // kind : ordinary, sending, ... + private final int index; // from sysML Model, yet useless for Avatar ...? + private String guard; // for all transitions + private String signalName; // for sending and receiveving transitions + private String blockName; // block of the containing state-machine (technical) + private StxSignal signal; // for sending and receiveving transitions, set from signalName, once parsing is completed. + private String timer; // for timer operation transitions + private ArrayList<StxTerm> sendPayload; // for sending transitions + private HashMap<String,String> receivePayload; // for receiving transitions + private String minDelay; // for all transitions + private String maxDelay; // for all transitions + private double probability; // for all transitions + private String delayDistributionLaw; // for all transitions + private HashMap<String,String> delayExtra; // for all transitions + private StxState target; // for all transitions + private ArrayList<StxAction> actions; // for standard transitions (no communication & no timer) + private Location rleft; // location of associated request in source state + private Location rright; // location of associated request in source state + private boolean requested; // set when associated request is parsed; + + public StxTransition(int _index){ + super("transition_" + _index); + type = -1; + index = _index; + guard = null; + signal = null; + sendPayload = null; + receivePayload = null; + minDelay = ""; + maxDelay = ""; + delayDistributionLaw = null; + delayExtra = null; + target = null; + actions = new ArrayList<StxAction>(); + rleft = defaultLocation; + rright = defaultLocation; + requested = false; + probability = AvatarTransition.DEFAULT_PROBABILITY; + } + + public void setType(byte _t) { type = _t; }; + + public void setGuard(String _s) { guard = _s; } + + public void setSignal(StxSignal _s) { signal = _s; } + + public void setSignalName(String _blockname, String _signalName) { + signalName = _signalName; blockName = _blockname; + } + + public void setSendPayload(ArrayList<StxTerm> _p) { sendPayload = _p; } + + public void setReceivePayload(HashMap<String,String> _p) { receivePayload = _p; } + + public void setTimer(String _s) { timer = _s; } + + public void setMinDelay(String _s) { minDelay = _s; } + + public void setMaxDelay(String _s) { maxDelay = _s; } + + public void setProbability(double _p) { probability = _p; } + + public void setDelayDistributionLaw(String _s) { delayDistributionLaw = _s; } + + public void setDelayExtra(HashMap<String,String> _m) { delayExtra = _m; } + + public void setTarget(StxState _s) { target = _s; } + + public void setActions(ArrayList<StxAction> _a) { actions = _a; } + + /** location of associated request in source state */ + public void setRleft(Location _l) { rleft = _l; } + + /** location of associated request in source state */ + public void setRright(Location _l) { rright = _l; } + + /** to set when associated request is parsed */ + public void setRequested(boolean _b) { requested = _b; } + + public byte getType() { return type; } + + public int getIndex() { return index; } + + public String getGuard() { return guard; } + + public String getTimer() { return timer; } + + public StxSignal getSignal() { return signal; } + + public String getSignalName() { return signalName; } + + public String getBlockName() { return blockName; } + + public ArrayList<StxTerm> getSendPayload() { return sendPayload; } + + public HashMap<String, String> getReceivePayload() { return receivePayload; } + + public String getMinDelay() { return minDelay; } + + public String getMaxDelay() { return maxDelay; } + + public double getProbability() { return probability; } + + public String getDelayDistributionLaw() { return delayDistributionLaw; } + + + public HashMap<String,String> getDelayExtra() { return delayExtra; } + + public StxState getTarget() { return target; } + + public ArrayList<StxAction> getActions() { return actions; } + + /** location of associated request in source state */ + public Location getRleft() { return rleft; } + + /** location of associated request in source state */ + + public Location getRright() { return rright; } + + /** test if associated request is parsed */ + public boolean isRequested() { return requested; } + } + + /** Syntactic elements associated to transitions of state-machines. + * + * some information associated to these transition is finally associated + * to their target state-machine "boxes" in Avatar model, in particular + * signal and timer information. + */ + public static class StxAction extends StxElement { + + private byte type; // assignment or method call + private StxTerm value; // method call or assigned value + private String target; // assignad variable + + public StxAction (StxTerm _value) { + super("methodCall_" + _value.toString()); + type = STXMETHODACTION; + value = _value; + } + + public StxAction (Location _left, Location _right, StxTerm _value) { + super("methodCall_" + _value.toString(), _left, _right); + type = STXMETHODACTION; + value = _value; + } + + public StxAction (String _target, StxTerm _value) { + super("assignment_" + _target + "<-" + _value.toString() ); + type = STXASSIGNACTION; + value = _value; + target = _target; + } + + public StxAction (Location _left, Location _right, String _target, StxTerm _value) { + super("assignment_" + _target + "<-" + _value.toString(), _left, _right); + type = STXASSIGNACTION; + value = _value; + target = _target; + } + + public byte getType() { return type; } + + public StxTerm getValue() { return value; } + + public String getTarget() { return target; } + } + + /** syntactic element corresponding to a complete model -- complex Abstract Syntax Tree */ + public static class StxModel{ + + private ArrayList<AvatarFromSysMLError> errors; // error encountered while parsing and finalizing the syntactic model + private HashMap<String,StxDataType> dataTypeMap; + private HashMap<String,StxRelation> relationMap; + private HashMap<String,StxChannel> channelMap; + private HashMap<String,StxBlock> blockMap; + private HashMap<String,StxSignal> signalMap; + + /** parameters are the ones filled by the associated parser. + * + * all parameters are kept as internal attribute except the two last ones that are used for finalization (called by constructor) + * @param outMessageMap out messages that require finalization + * @param commTransitions transitions that require finalization + */ + public StxModel( + ArrayList<AvatarFromSysMLError> _errors, + HashMap<String,StxDataType> _dataTypeMap, + HashMap<String,StxRelation> _relationMap, + HashMap<String,StxChannel> _channelMap, + HashMap<String,StxBlock> _blockMap, + HashMap<String,StxSignal> _signalMap, + HashMap<String, StxOutMessage> outMessageMap, + List<StxTransition> commTransitions + ) { + errors = _errors; + dataTypeMap = _dataTypeMap; + relationMap = _relationMap; + channelMap = _channelMap; + blockMap = _blockMap; + signalMap = _signalMap; + this.finalize(outMessageMap, commTransitions); + } + + public ArrayList<AvatarFromSysMLError> getErrors() { return errors; } + + public HashMap<String,StxDataType> getDataTypeMap() { return dataTypeMap; } + + public HashMap<String,StxRelation> getRelationMap() { return relationMap; } + + public HashMap<String,StxChannel> getChannelMap() { return channelMap; } + + public HashMap<String,StxBlock> getBlockMap() { return blockMap; } + + public HashMap<String,StxSignal> getSignalMap() { return signalMap; } + + /** complete Signal information + * + * Find signals associated to signal names in transitions */ + private void updateSignal(StxTransition st) { + String name = st.getSignalName(); + StxBlock blk = blockMap.get(st.getBlockName()); + while (blk != null) { + int size = blk.getNbSignals(); + int i; + for (i = 0; i < size; i++) { + StxSignal s = blk.getSignal(i); + if (s.getName().equals(name)) { + st.setSignal(s); + break; + } + } + if (i < size) blk = null; + else blk = blk.getFather(); + } + } + + private class CompleteOutMessage implements BiConsumer<String, StxOutMessage> { + public CompleteOutMessage(){} + public void accept(String s, StxOutMessage o) { o.complete(errors); } + } + + /** complete OutMessage related information. + * + * Run completion algorithm provided by OutMessage class: set missing links between channels, signals and profiles. + */ + public void finalize(HashMap<String, StxOutMessage> outMessageMap, List<StxTransition> commTransitions) { + outMessageMap.forEach(new CompleteOutMessage()); + for(StxTransition st: commTransitions) updateSignal(st); + } + } +} diff --git a/src/main/java/avatartranslator/tosysmlv2/javacup/Avatar2SysMLLexer.jflex b/src/main/java/avatartranslator/tosysmlv2/javacup/Avatar2SysMLLexer.jflex new file mode 100644 index 0000000000000000000000000000000000000000..613045c084b9adbcac39de5e3a381ae23872dcc3 --- /dev/null +++ b/src/main/java/avatartranslator/tosysmlv2/javacup/Avatar2SysMLLexer.jflex @@ -0,0 +1,92 @@ +/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille + * + * ludovic.apvrille AT enst.fr + * + * This software is a computer program whose purpose is to allow the + * edition of TURTLE analysis, design and deployment diagrams, to + * allow the generation of RT-LOTOS or Java code from this diagram, + * and at last to allow the analysis of formal validation traces + * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP + * from INRIA Rhone-Alpes. + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + */ + +package avatartranslator.tosysmlv2; +import java_cup.runtime.*; + +%% +%class LexerClassName +%public +%unicode +%cup +%eofval{ + return new java_cup.runtime.Symbol(#Symb.EOF); +%eofval} + +%yylexthrow Exception + +%{ + +%} + +Space = [\ \n\r\t\f] +Natural = 0 | [1-9][0-9]* +Identifier = [a-zA-Z_][a-zA-Z0-9_\.]* + +%% + +<YYINITIAL> { + {Space} { break; } + "true" { return new Symbol(#Symb.CONSTANT, "true"); } + "false" { return new Symbol(#Symb.CONSTANT, "false"); } + {Natural} { try { return new Symbol(#Symb.CONSTANT, "" + Integer.parseInt(yytext()));} + catch (NumberFormatException nfe) { throw new Exception ("Lexer : Integer Format : " + yytext()); } + } + "+" { return new Symbol(#Symb.PLUS); } + "-" { return new Symbol(#Symb.MINUS); } + "*" { return new Symbol(#Symb.MULT); } + "/" { return new Symbol(#Symb.DIV); } + "%" { return new Symbol(#Symb.MOD); } + "&&" { return new Symbol(#Symb.AND); } + "and" { return new Symbol(#Symb.AND); } + "||" { return new Symbol(#Symb.OR); } + "or" { return new Symbol(#Symb.OR); } + "!" { return new Symbol(#Symb.NOT); } + "not" { return new Symbol(#Symb.NOT); } + "==" { return new Symbol(#Symb.EQ); } + "!=" { return new Symbol(#Symb.DIF); } + "<" { return new Symbol(#Symb.LT); } + ">" { return new Symbol(#Symb.GT); } + "<=" { return new Symbol(#Symb.LEQ); } + ">=" { return new Symbol(#Symb.GEQ); } + "(" { return new Symbol(#Symb.LPAR); } + ")" { return new Symbol(#Symb.RPAR); } + "," { return new Symbol(#Symb.COMMA); } + {Identifier} { return new Symbol(#Symb.IDENT, yytext()); } + . { throw new Exception ("Unknown character in expression"); } +} diff --git a/src/main/java/avatartranslator/tosysmlv2/javacup/Avatar2SysMLParser.jcup b/src/main/java/avatartranslator/tosysmlv2/javacup/Avatar2SysMLParser.jcup new file mode 100644 index 0000000000000000000000000000000000000000..a556fbfd0627413071a7e9923fac8c766e7c3ce9 --- /dev/null +++ b/src/main/java/avatartranslator/tosysmlv2/javacup/Avatar2SysMLParser.jcup @@ -0,0 +1,93 @@ +/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille + * + * ludovic.apvrille AT enst.fr + * + * This software is a computer program whose purpose is to allow the + * edition of TURTLE analysis, design and deployment diagrams, to + * allow the generation of RT-LOTOS or Java code from this diagram, + * and at last to allow the analysis of formal validation traces + * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP + * from INRIA Rhone-Alpes. + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + */ + +package avatartranslator.tosysmlv2; +import java_cup.runtime.*; +import static avatartranslator.tosysmlv2.Avatar2SysMLNames.*; + +parser code {: +:} + + +/* Terminals (tokens returned by the scanner). */ +terminal PLUS, MINUS, MULT, DIV, MOD, AND, OR, EQ, DIF, LT, GT, LEQ, GEQ; +terminal NOT, LPAR, RPAR, UMINUS, COMMA; +terminal String IDENT, CONSTANT; + + +/* Non terminals */ +non terminal String expr, exprlist; + +/* Precedences (probably useless for the current grammar) */ +precedence left OR; +precedence left AND; +precedence left NOT; +precedence left EQ, DIF; +precedence nonassoc GT, LT, LEQ, GEQ; +precedence left PLUS, MINUS; +precedence left MULT, DIV, MOD; +precedence left UMINUS; + + +/* The grammar */ +expr ::= + expr:l PLUS expr:r {: RESULT = l + " + " + r; :} + | expr:l MINUS expr:r {: RESULT = l + " - " + r; :} + | expr:l MULT expr:r {: RESULT = l + " * " + r; :} + | expr:l DIV expr:r {: RESULT = l + " / " + r; :} + | expr:l MOD expr:r {: RESULT = l + " % " + r; :} + | MINUS expr:e {: RESULT = "-" + e; :} %prec UMINUS + | expr:l OR expr:r {: RESULT = l + " or " + r; :} + | expr:l AND expr:r {: RESULT = l + " and " + r; :} + | NOT expr:e {: RESULT = "not " + e; :} + | expr:l LT expr:r {: RESULT = l + " < " + r; :} + | expr:l GT expr:r {: RESULT = l + " > " + r; :} + | expr:l LEQ expr:r {: RESULT = l + " <= " + r; :} + | expr:l GEQ expr:r {: RESULT = l + " >= " + r; :} + | expr:l EQ expr:r {: RESULT = l + " == " + r; :} + | expr:l DIF expr:r {: RESULT = l + " != " + r; :} + | LPAR expr:e RPAR {: RESULT = "(" + e + ")"; :} + | IDENT:i LPAR RPAR {: RESULT = methodSysMLname(i) + "()"; :} + | IDENT:i LPAR exprlist:l RPAR {: RESULT = methodSysMLname(i) + "(" + l + ")"; :} + | CONSTANT:e {: RESULT = e; :} + | IDENT:e {: RESULT = attributeSysMLname(e); :} +; +exprlist ::= + expr:e {: RESULT = e; :} + | expr:e COMMA exprlist:l {: RESULT = e + ", " + l; :} +; diff --git a/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jcup b/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jcup new file mode 100644 index 0000000000000000000000000000000000000000..541c6ea720265d0edf4e35210477779f4d2b2656 --- /dev/null +++ b/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jcup @@ -0,0 +1,2123 @@ + /* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille + * + * ludovic.apvrille AT enst.fr + * + * This software is a computer program whose purpose is to allow the + * edition of TURTLE analysis, design and deployment diagrams, to + * allow the generation of RT-LOTOS or Java code from this diagram, + * and at last to allow the analysis of formal validation traces + * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP + * from INRIA Rhone-Alpes. + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + */ +package avatartranslator.tosysmlv2; +import java_cup.runtime.*; +import java.util.ArrayList; +import java.util.HashMap; +import avatartranslator.tosysmlv2.AvatarFromSysMLSyntax.*; +import java.util.function.BiConsumer; +import static java.lang.System.out; + +parser code {: + // %%%%%%%%%%%%%%%%%%% BEGINNING OF USER CODE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + /** Parse the current buffer and returns the abstract syntax tree (AST) of the described specification. + * + * <p> At the end of parsing, the true AST components are in variables dataTypeMap, relationMap, channelMap, + * blockMap and signalMap. The invoked AST constructor (StxModel) also receives some other parameters: the + * list of errors encountered while parsing and some information it uses in a post-processing that finalizes + * the AST structure (complete some fields). + */ + + // %%%%%%%%%%%%%%%%%%%%%%%%%%% MAIN FUNCTION %%%%%%%%%%%%%%%%%%%%%%%%%%%% + + public StxModel parseModel() { + try { + parse(); + return new StxModel(errors,dataTypeMap,relationMap,channelMap,blockMap,signalMap,outMessageMap,commTransitions); + } + catch (java.lang.Exception e) { + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, lexer.getErrorLocation(), e.getMessage())); + return new StxModel(errors,dataTypeMap,relationMap,channelMap,blockMap,signalMap,outMessageMap,commTransitions); + } + } + + // %%%%%%%%%%%%%%%%%%%%%%%%%%% IMPLEMENTATION %%%%%%%%%%%%%%%%%%%%%%%%%%%% + + // %%%%%%%%%%%%% LEXER + + /** to make lexer access easier */ + private LexerClassName lexer = (LexerClassName) getScanner(); + + // %%%%%%%%%%%%%% ERROR HANDLING + + /** to handle errors encountered while parsing */ + private ArrayList<AvatarFromSysMLError> errors; + /** register an error */ + private void addError(AvatarFromSysMLError _err) { errors.add(_err); } + /** get encountered errors */ + public ArrayList<AvatarFromSysMLError> getErrors() { return errors; } + + // %%%%%%%%%%%%%%%%%% INITIALIZE + + @Override + public void user_init() { + errors = new ArrayList<AvatarFromSysMLError>(); + dataTypeMap = new HashMap<String,StxDataType>(); + relationMap = new HashMap<String,StxRelation>(); + channelMap = new HashMap<String,StxChannel>(); + blockMap = new HashMap<String,StxBlock>(); + signalMap = new HashMap<String,StxSignal>(); + inMessageMap = new HashMap<String,StxInMessage>(); + outMessageMap = new HashMap<String,StxOutMessage>(); + blockHierarchy = new ArrayList<StxBlock>(); + attributeHierarchy = new ArrayList<HashMap<String,StxAttribute>>(); + methodHierarchy = new ArrayList<HashMap<String,StxMethod>>(); + commTransitions = new ArrayList<StxTransition>(); + theBlock = null; + } + + // %%%%%%%%%%%%%%%%% GLOBAL STRUCTURES FILLED BY PARSING + + /** datatypes collected from SysML source while parsing, to put in final AST */ + private HashMap<String,StxDataType> dataTypeMap; + /** relations collected from SysML source while parsing, to put in final AST */ + private HashMap<String,StxRelation> relationMap; + /** channels collected from SysML source while parsing, to put in final AST */ + private HashMap<String,StxChannel> channelMap; + /** blocks collected from SysML source while parsing, to put in final AST */ + private HashMap<String,StxBlock> blockMap; + /** signals collected from SysML source while parsing, to put in final AST */ + private HashMap<String,StxSignal> signalMap; + + /** signal input profiles collected from SysML source while parsing, internal, technical */ + private HashMap<String,StxInMessage> inMessageMap; // theStructure + /** signal outout profiles collected from SysML source while parsing, to finalize final AST */ + private HashMap<String,StxOutMessage> outMessageMap; + + /** communication transitions, to finalize final AST. They are collected while parsing as they + * require a post-processing after it, when their containing block hierarchy is fully known, + * to find their associated signal from its name. + */ + ArrayList<StxTransition> commTransitions; + + /** attributes, one map per block. Technical variable: memorize to avoid duplicates */ + private HashMap<String,StxAttribute> attributeMap; + + /** methods, one map per block. Technical variable: memorize to avoid duplicates */ + private HashMap<String,StxMethod> methodMap; + + private StringBuffer stringAcc = new StringBuffer(); + + // %%%%%%%%%%%%%%%%%%%% "PATH" STATE VARIABLES + // context information for parsing + // they locate the current position being parsed in the specification structure + + /** path state variable: current field */ + private StxField theField; + /** path state variable: current input profile or method */ + private StxStructure theStructure; + /** path state variable: current relation */ + private StxRelation theRelation; + /** path state variable: current Channel */ + private StxChannel theChannel; + /** path state variable: current block */ + private StxBlock theBlock; + /** path state variable: current signal */ + private StxSignal theSignal; + /** path state variable: current output profile */ + private StxOutMessage theOutMessage; + /** path state variable: current attribute */ + private StxAttribute theAttribute; + /** path state variable: current state */ + private StxState theState; + /** path state variable: current transition */ + private StxTransition theTransition; + /** path state variable: transition request index + * Idea: thState->transition(requestIndex) correspond to theTransition + */ + private int requestIndex; + + /** current path in block hierarchy, ancestors in order: last element is father of current block. */ + private ArrayList<StxBlock> blockHierarchy; + /** attributes associated to ancestor blocks, respects blockHierarchy order */ + private ArrayList<HashMap<String,StxAttribute>> attributeHierarchy; + /** methods associated to ancestor blocks, respects blockHierarchy order */ + private ArrayList<HashMap<String,StxMethod>> methodHierarchy; + /** to detect multiple state machines in a single block */ + private Location stateMachine = null; + /** state machine flags associated to ancestor blocks, respects blockHierarchy order */ + private ArrayList<Location> machineHierarchy = new ArrayList<Location>(); + + // %%%%%%%%%%%%%%%%%%%% UPDATE PATH STATE VARIABLES + + // ++++++++++++++++ RELATIONS + + /** set current relation. Create-and-Register it if necessary. */ + private void getRelation(String _name) { + theRelation = relationMap.get(_name); + if (theRelation == null) { + theRelation = new StxRelation(_name); + relationMap.put(_name, theRelation); + } + } + + /** (to avoid duplicates) not null if a block1 parameter has been encountered for current relation */ + private Location block1ParamFlag; + /** (to avoid duplicates) not null if a block2 parameter has been encountered for current relation */ + private Location block2ParamFlag; + /** (to avoid duplicates) not null if a private parameter has been encountered for current relation */ + private Location privateParamFlag; + /** (to avoid duplicates) not null if a maxsize parameter has been encountered for current relation */ + private Location maxsizeParamFlag; + /** (to avoid duplicates) not null if a lossy parameter has been encountered for current relation */ + private Location lossyParamFlag; + + /** to clear the relevant anti-duplicate flags (locations) at the beginning of a relation parsing */ + private void clearRelationParams() { + block1ParamFlag = null; + block2ParamFlag = null; + privateParamFlag = null; + maxsizeParamFlag = null; + lossyParamFlag = null; + } + + // ++++++++++++++++ CHANNELS + + /** set current channel. Create-and-Register it if necessary. */ + private void getChannel(String _name) { + theChannel = channelMap.get(_name); + if (theChannel == null) { + theChannel = new StxChannel(_name); + channelMap.put(_name, theChannel); + } + } + + // ++++++++++++++++ BLOCKS + + /** set current block. Create-and-Register it if necessary. */ + private void getBlock(String _name) { + theBlock = blockMap.get(_name); + if (theBlock == null) { + theBlock = new StxBlock(_name); + blockMap.put(_name, theBlock); + } + } + + // ++++++++++++++++ SIGNALS + + /** set current signal. Create-and-Register it if necessary. */ + private void getSignal(String _blockname, String _signalname) { + String key = _blockname + "." + _signalname; + theSignal = signalMap.get(key); + if (theSignal == null) { + theSignal = new StxSignal(_signalname); + signalMap.put(key, theSignal); + } + } + + // ++++++++++++++++ INPUT PROFILE + + /** (to avoid duplicates) not null if a message channel parameter has been encountered for current relation */ + private Location messageChannelParam; + + /** set current in message in theStructure. Create-and-Register it if necessary. */ + private void getInMessage(String _name) { + theStructure = inMessageMap.get(_name); + if (theStructure == null) { + theStructure = new StxInMessage(_name); + inMessageMap.put(_name, (StxInMessage)theStructure); + } + } + + // ++++++++++++++++ OUTPUT PROFILE + + /** set current out message. Create-and-Register it if necessary. */ + private void getOutMessage(String _name, StxInMessage _msg) { + theOutMessage = outMessageMap.get(_name); + if (theOutMessage == null) { + theOutMessage = new StxOutMessage(_name, _msg); + outMessageMap.put(_name, theOutMessage); + } + } + + // ++++++++++++++++ ENTER / EXIT BLOCK + + /** enter block: extend path to current block (push blockHierarchy, attributeHierarchy, methodHierarchy) */ + private void pushBlock() { + blockHierarchy.add(theBlock); + theBlock = null; + attributeHierarchy.add(attributeMap); + attributeMap = new HashMap<String,StxAttribute>(); + methodHierarchy.add(methodMap); + methodMap = new HashMap<String,StxMethod>(); + machineHierarchy.add(stateMachine); + stateMachine = null; + } + + /** exit block: shorten path to current block (pop blockHierarchy, attributeHierarchy, methodHierarchy) */ + private void popBlock() { + theBlock = blockHierarchy.get(blockHierarchy.size() -1); + blockHierarchy.remove(blockHierarchy.size() -1); + attributeMap = attributeHierarchy.get(attributeHierarchy.size() -1); + attributeHierarchy.remove(attributeHierarchy.size() -1); + methodMap = methodHierarchy.get(methodHierarchy.size() -1); + methodHierarchy.remove(methodHierarchy.size() -1); + stateMachine = machineHierarchy.remove(machineHierarchy.size() -1); + } + + + + /** set current attribute. Create-and-Register it if necessary. */ + private void getAttribute(String _name, String _type) { + theAttribute = attributeMap.get(_name); + if (theAttribute == null) { + theAttribute = new StxAttribute(_name, _type); + attributeMap.put(_name, theAttribute); + } + } + + /** set current method. Create-and-Register it if necessary. */ + private void getMethod(String _name) { + theStructure = new StxMethod(_name); + if (theStructure == null) { + theStructure = new StxMethod(_name); + methodMap.put(_name, (StxMethod)theStructure); + } + } + + /** set current state. Create-and-Register it if necessary. */ + private HashMap<String,StxState> stateMap; + private void getState(String _name) { + theState = stateMap.get(_name); + if (theState == null) { + theState = new StxState(_name); + stateMap.put(_name, theState); + } + } + + /** set current transition. Create and register it with current state if necessary */ + private void getTransition(int _index) { + theTransition = theState.getTransition(_index); + } + + /** (to avoid duplicates) not null if an index parameter has been encountered for current request */ + private Location indexArg; + /** (to avoid duplicates) not null if a delay parameter has been encountered for current request */ + private Location delayArg; + /** (to avoid duplicates) not null if a channel parameter has been encountered for current request */ + private Location channelArg; + /** (to avoid duplicates) not null if a payload parameter has been encountered for current request */ + private Location payloadArg; + /** (to avoid duplicates) not null if a timer parameter has been encountered for current request */ + private Location settimerArg; + /** (to avoid duplicates) not null if a timer parameter has been encountered for current request */ + private Location resettimerArg; + /** (to avoid duplicates) not null if a timer parameter has been encountered for current request */ + private Location expiretimerArg; + + private boolean argOK; + private void clearRequestArgs() { + indexArg = null; + delayArg = null; + channelArg = null; + payloadArg = null; + settimerArg = null; + resettimerArg = null; + expiretimerArg = null; + } + + private ArrayList<StxTerm> argList; + private ArrayList<StxAction> actionList; + private HashMap<String,String> receiveMap; + HashMap<String,String> delayExtraMap = null; + private StxCall theCall; + + /** (to avoid duplicates) not null if a distribution law attribute has been encountered for current transition labels section */ + private Location distributionLbl; + /** (to avoid duplicates) not null if a weight attribute has been encountered for current transition labels section */ + private Location weightLbl; + /** to clear the relevant anti-duplicate flags (locations) at the beginning of a transition labels section */ + private void clearTransitionLbls() { + distributionLbl = null; + weightLbl = null; + } + private boolean okRequest; + + /** customized error handling, throw exception with message, and location in lexer's errorLocation */ + public void report_fatal_error(String message, Object info) throws Exception { + this.done_parsing(); + ComplexSymbolFactory.ComplexSymbol cs = (ComplexSymbolFactory.ComplexSymbol)info; + lexer.setErrorLocation(cs.getLeft()); + throw new Exception("parser: syntax error for input symbol \"" + cs.getName() + "\""); + } + /** customized error handling */ + public void report_error(String message, Object info) {} + /** customized error handling */ + public void syntax_error(Symbol cur_token) {} + + /** set current transition w.r.t. requestIndex and request it and type it as trivial request (if not already requested) */ + private void tryTrivialRequest(Location left, Location right) { + getTransition(requestIndex); + if (theTransition.isRequested()) { + addError( new AvatarFromSysMLError( + AvatarFromSysMLError.LOWERROR, + left, + "Transition " + requestIndex + " is already requested", + theTransition.getRleft()) ); + } else { + theTransition.setRleft(left); + theTransition.setRright(right); + theTransition.setRequested(true); + theTransition.setType(AvatarFromSysMLSyntax.STXTRIVIALTRANSITION); + } + } + + /** a multiusage Flag */ + private boolean flag; + /** a block specific flag */ + private ArrayList<Boolean> blockFlags = new ArrayList<Boolean>(); + private void pushBlockFlag(Boolean f) { blockFlags.add(f); } + private boolean popBlockFlag() { + boolean res = blockFlags.get(blockFlags.size() -1); + blockFlags.remove(blockFlags.size() -1); + return res; + } + +:} + +/* Terminals (tokens returned by the scanner). */ + +terminal Integer INT; +terminal Boolean BOOL; +terminal String STRING, ANYNAME; +terminal Double REAL; + +terminal EQ, LPAR, RPAR, LBRAC, RBRAC, COMMA, SEMICOLON, COLON, POINT, EQUAL, GETS, QUEST; + +// Field names +terminal LOSSY_F, MAXSIZE_F, PRIVATE_F, RELATION_F, BLOCK1_F, BLOCK2_F, POOL_F, REQUEST_F, STATEACTION_F, INDEX_F, + DELAY_F, PAYLOAD_F, CHANNEL_F, VALUE_F, TARGET_F, AMOUNT_U, START_U, DONE_U; + +// Communications +terminal RELATION_T, SYNCREL_T, BFIFOREL_T, NBFIFOREL_T, INMESSAGE_T, OUTMESSAGE_T, CHANNEL_T, FIFO_T, BFIFO_T, + NBFIFO_T, SYNC_T, INSIGNALBINDING_T, OUTSIGNALBINDING_T; + +// Transition server +terminal NOKREQUEST_U, TRIVIALREQUEST_T, IMMEDIATEREQUEST_U, SENDREQUEST_T, RECEIVEREQUEST_T, MSG_U; + +// general +terminal ASSIGNMENT_T, BOUNDRANDOM_U, BOOLEAN_T, INTEGER_T, STRING_T, REAL_T; + +// Blocks +terminal AVDATATYPE_T, AVBLOCK_T, AVVOIDMETHOD_T, AVCALCMETHOD_T, AVSTANDARDSTATE_T, AVSTOPSTATE_T, AVSTARTSTATE_T, + AVSENDSTATE_T, AVRECEIVESTATE_T, AVRANDOMSTATE_T, AVCOUNTSTATE_T, AVPRESENDSTATE_T, AVPRERECEIVESTATE_T, + AVTRANSITION_T, AVSTATEMACHINE_T, RECEIVEACTION_T, TRANSITIONACTION_T, STATEMACHINE; + +// Timers +terminal AVSETTIMERSTATE_T, AVRESETTIMERSTATE_T, AVEXPIRETIMERSTATE_T, SETTIMERREQUEST_T, RESETTIMERREQUEST_T, + EXPIRETIMERREQUEST_T, TIMERSETMSG_T, TIMERRESETMSG_T, TIMEREXPIREMSG_T, AVTIMER_T, SET_TM, + RESET_TM, EXPIRE_TM, DISTRIBUTION_A, WEIGHT_A; + +// Typed and untyped identifiers +terminal Ident IDENT; + +// Sysml reserved keywords +terminal ABOUT, ABSTRACT, ACCEPT, ACTION, ACTOR, AFTER, ALIAS, ALL, ALLOCATE, ALLOCATION, ANALYSIS, AND, AS, ASSERT, + ASSIGN, ASSOC, ASSUME, AT, ATTRIBUTE, BIND, BINDING, BLOCK, BY, CALC, CASE, COMMENT, CONCERN, CONNECT, CONNECTION, + CONSTRAINT, DECIDE, DEF, DEFAULT, DEFINED, DEPENDENCY, DERIVED, DO, DOC, ELSE, END, ENTRY, ENUM, EVENT, EXHIBIT, + EXIT, EXPOSE, FILTER, FIRST, FLOW, FOR, FORK, FRAME, FROM, HASTYPE, IF, IMPLIES, IMPORT, IN, INCLUDE, INDIVIDUAL, + INOUT, INTERFACE, ISTYPE, ITEM, JOIN, LANGUAGE, LOOP, MERGE, MESSAGE, METADATA, NONUNIQUE, NOT, OBJECTIVE, OCCURRENCE, + OF, OR, ORDERED, OUT, PACKAGE, PARALLEL, PART, PERFORM, PORT, PRIVATE, PROTECTED, PUBLIC, READONLY, REDEFINES, REF, + REFERENCES, RENDER, RENDERING, REP, REQUIRE, REQUIREMENT, RETURN, SATISFY, SEND, SNAPSHOT, SPECIALIZES, STAKEHOLDER, + STATE, SUBJECT, SUBSETS, SUCCESSION, THEN, TIMESLICE, TO, TRANSITION, UNTIL, USE, VARIANT, VARIATION, VERIFICATION, + VERIFY, VIA, VIEW, VIEWPOINT, WHEN, WHILE, XOR, REFINES, NULL; + +terminal PLUS, MINUS, MULT, DIV, MOD, DIF, LT, GT, LEQ, GEQ, UMINUS; + +/* Non terminals */ +non terminal String typeIdent, fulllIdent; +non terminal model; +non terminal featureList, feature, specializes, subsets, blockAlias, blockChain, datatypeDecl, datatypeDeclHEADER, + fieldDecls, fieldDecl, relationDecl, syncRelDecl, nbfRelDecl, bfRelDecl, relParams, relParam, + block1Param, block2Param, privateParam, maxsizeParam, lossyParam, + syncRelDeclBegin, nbfRelDeclBegin, bfRelDeclBegin; + + +non terminal channelDecl, syncChDecl , nbfChDecl, bfChDecl, signalBinding, inSignalBinding, outSignalBinding, + messageDecl, inMessageDecl, outMessageDecl, inMessageDeclBODY, messageChannel, outMessageDeclBODY, + redefineField, inMessageDeclBegin, outMessageDeclBegin; + +non terminal blockDecl, blockDeclBegin, blockDeclBODY, blockItem, attributeDecl, constantDecl, attributeDeclHEADER, methodDecl, voidMethodDecl, + calcMethodDecl, calcMethodItems, calcMethodItem, signalDecl, timerDecl, stateMachine, stateMachineItems, stateMachineItem, + voidMethodDeclBegin, calcMethodDeclBegin, constantDeclHEADER, fieldDeclBegin, fieldVal; + +non terminal state, startState, standardState, stopState, sendState, receiveState, randomState, countState, presendState, + prereceiveState, setTimerState, resetTimerState, expireTimerState, poolParam, requestParam, requestList, request, + simpleRequest, trivialRequest, requestArgs, requestArg, sendRequest, receiveRequest, setTimerRequest, resetTimerRequest, + expireTimerRequest, indexParam, delayParam, delayExpr, actionRandomExpr, delayRandomExpr, payloadParam, channelParam, settimerParam, + resettimerParam, expiretimerParam, trivialRequestBegin, sendRequestBegin, receiveRequestBegin, setTimerRequestBegin, + resetTimerRequestBegin, expireTimerRequestBegin, startStateBegin, standardStateBegin, stopStateBegin, sendStateBegin, + receiveStateBegin, randomStateBegin, countStateBegin, presendStateBegin, prereceiveStateBegin, setTimerStateBegin, + resetTimerStateBegin, expireTimerStateBegin, stateMachineBegin, payloadParamBegin; + +non terminal randomAction, targetParam, randomParam, countAction, countParam, transition, doActions, + actionSeq, act, termList, transitionBegin, transitionLabels, transitionAction, receiveAction, assign, + target, fullIdent, transitionActionBegin, receiveActionBegin, messageLine, receiveAssigns, receiveAssignSeq, + receiveAssign, transitionLabel, distributionLabel, weightLabel, extraLabel, delayKeyword, dummy; + +non terminal StxTerm stxRvalue; +non terminal StxExpr stxExpr; +non terminal StxCall stxCall; +non terminal String iexpr, expr, complexIdent; +non terminal stxCallBegin, stxCallParam, comma, call, callBegin, stxCallParams; + + +/* Precedences (probably useless for the current grammar) */ +precedence left OR; +precedence left AND; +precedence left NOT; +precedence left EQ, DIF; +precedence nonassoc GT, LT, LEQ, GEQ; +precedence left PLUS, MINUS; +precedence left MULT, DIV, MOD; +precedence left UMINUS; + +model ::= + PACKAGE IDENT LBRAC featureList RBRAC + | PACKAGE IDENT LBRAC RBRAC +; + +featureList ::= feature | feature featureList; + +feature ::= + PRIVATE IMPORT + | PUBLIC IMPORT + | datatypeDecl + | relationDecl + | channelDecl + | signalBinding + | messageDecl + | blockDecl + | blockAlias +; + +// multi-usage rules %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +typeIdent ::= + INTEGER_T {: RESULT = "Integer"; :} + | BOOLEAN_T {: RESULT = "Boolean"; :} + | IDENT:id {: RESULT = id.getAvatarName(); :} +; + +specializes ::= SPECIALIZES | REFINES; +subsets ::= SUBSETS | REFINES; + +// BLOCK ALIASES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +blockAlias ::= + PART IDENT COLON AVBLOCK_T subsets blockChain EQUAL blockChain SEMICOLON +; +blockChain::= + IDENT + | IDENT POINT blockChain +; + +// DATATYPE DECLARATION $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ + +datatypeDecl ::= + datatypeDeclHEADER LBRAC fieldDecls RBRAC:b {: + if (flag) theStructure.setRight(bxright); + :} + | datatypeDeclHEADER LBRAC RBRAC:b {: + if (flag) theStructure.setRight(bxright); + :} +; +datatypeDeclHEADER ::= ATTRIBUTE:a DEF IDENT:id specializes AVDATATYPE_T {: + theStructure = dataTypeMap.get(id.getAvatarName()); + if (theStructure == null) { + theStructure = new StxDataType(id.getAvatarName()); + dataTypeMap.put(id.getAvatarName(), (StxDataType) theStructure); + } + if (! theStructure.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, axleft, "Datatype " + id.getAvatarName() + + " is already declared", theStructure.getLeft()) ); + flag = false; + } else { + theStructure.setLeft(axleft); + flag = true; + } +:}; + +// FIELD LIST $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ +// used for DataTypes, Methods and inMessages (in-signal profiles) + +fieldDecls ::= fieldDecl | fieldDecl fieldDecls +; +fieldDecl ::= fieldDeclBegin fieldVal SEMICOLON:q {: + theField.setRight(qxright); +:}; +fieldDeclBegin ::= ATTRIBUTE:a IDENT:id COLON typeIdent:tp {: + theField = new StxField(axleft, axright, id.getAvatarName(), tp); + StxField clash = theStructure.addField(theField); + if (clash != null) // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHWARNING, axleft, "Field " + id.getAvatarName() + + " is already declared", clash.getLeft()) ); + theField.setLeft(axleft); +:}; +fieldVal ::= // may not exist + | GETS iexpr:e {: theField.setInitialValue(e); :} + | DEFAULT GETS iexpr:e {: theField.setInitialValue(e); theField.setDefaultValue(true); :} +; + +// RELATION DECLARATION $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ + +relationDecl ::= syncRelDecl | nbfRelDecl | bfRelDecl; + +// Synchroneous relations IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII + +syncRelDecl ::= syncRelDeclBegin relParams RPAR SEMICOLON:x {: + if (flag) theRelation.setRight(xxright); +:}; +syncRelDeclBegin ::= + PART:p IDENT:id COLON SYNCREL_T EQUAL SYNCREL_T LPAR {: + Location l = idxleft; + getRelation(id.getAvatarName()); + if (! theRelation.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Relation " + id.getAvatarName() + + " is already declared", theRelation.getLeft()) ); + flag = false; + } else { + theRelation.setAsynchronous(false); + theRelation.setLeft(pxleft); + flag = true; + } + clearRelationParams(); // at beginning, no parameter has been parsed +:}; + +// Non Blocking FIFO relations IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII + +nbfRelDecl ::= nbfRelDeclBegin relParams RPAR SEMICOLON:x {: + if (flag) theRelation.setRight(xxright); +:}; +nbfRelDeclBegin ::= + PART:p IDENT:id COLON NBFIFOREL_T EQUAL NBFIFOREL_T LPAR {: + getRelation(id.getAvatarName()); + if (! theRelation.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Relation " + id.getAvatarName() + + " is already declared", theRelation.getLeft()) ); + flag = false; + } else { + theRelation.setAsynchronous(true); + theRelation.setBlocking(false); + theRelation.setLeft(pxleft); + flag = true; + } + clearRelationParams(); // at beginning, no parameter has been parsed +:}; + +// Non Blocking FIFO relations IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII + +bfRelDecl ::= bfRelDeclBegin relParams RPAR SEMICOLON:x {: + if (flag) theRelation.setRight(xxright); +:}; +bfRelDeclBegin ::= + PART:p IDENT:id COLON BFIFOREL_T EQUAL BFIFOREL_T LPAR {: + getRelation(id.getAvatarName()); + if (! theRelation.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Relation " + id.getAvatarName() + + " is already declared", theRelation.getLeft()) ); + flag = false; + } else { + theRelation.setAsynchronous(true); + theRelation.setBlocking(true); + theRelation.setLeft(pxleft); + flag = true; + } + clearRelationParams(); // at beginning, no parameter has been parsed +:}; + +// Relation Parameters IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII + +relParams ::= relParam | relParam COMMA relParams; +relParam ::= + block1Param + | block2Param + | privateParam + | maxsizeParam + | lossyParam +; +block1Param ::= BLOCK1_F:b EQUAL IDENT:id {: + if (block1ParamFlag == null) { // param has not yet been parsed + StxBlock tmp = theBlock; + getBlock(id.getAvatarName()); + theRelation.setBlock1(theBlock); + theBlock = tmp; + block1ParamFlag = bxleft; // now, param has been parsed + } else + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHWARNING,bxleft,"bloc1 is already set\n", block1ParamFlag)); +:}; +block2Param ::= BLOCK2_F:b EQUAL IDENT:id {: + if (block2ParamFlag == null) { // param has not yet been parsed + StxBlock tmp = theBlock; // save current block + getBlock(id.getAvatarName()); + theRelation.setBlock2(theBlock); // set param + theBlock = tmp; // restore current block + block2ParamFlag = bxleft; // now, param has been parsed + } else + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHWARNING, bxleft,"bloc2 is already set\n", block2ParamFlag)); +:}; +privateParam ::= PRIVATE_F:p EQUAL BOOL:b {: + if (privateParamFlag == null) { // param has not yet been parsed + theRelation.setPrivate(b); // set param + privateParamFlag = pxleft; // now, param has been parsed + } else + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHWARNING, bxleft,"private parameter is already set\n", privateParamFlag)); +:}; +maxsizeParam ::= MAXSIZE_F:z EQUAL INT:i {: + if (maxsizeParamFlag == null) { // param has not yet been parsed + if (! theRelation.getAsynchronous()) // irrelevant parameter + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, zxleft, "synchroneous relations don't have maxsize parameter\n")); + else { + theRelation.setFifoSize(i); // set param + maxsizeParamFlag = zxleft; // now, param has been parsed + } + } else + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHWARNING, zxleft, "maxsize is already set\n", maxsizeParamFlag)); +:}; +lossyParam ::= LOSSY_F:z EQUAL BOOL:b {: + if (lossyParamFlag == null) { // param has not yet been parsed + if (! theRelation.getAsynchronous()) // irrelevant parameter + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, zxleft, "synchroneous relations don't have lossy parameter\n")); + else { + theRelation.setLossy(b); // set param + lossyParamFlag = zxleft; // now, param has been parsed + } + } else + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHWARNING, zxleft, "lossy is already set\n", lossyParamFlag)); +:}; + +// CHANNEL DECLARATION $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ + +channelDecl ::= syncChDecl | nbfChDecl |bfChDecl; + +// Synchroneous Channel IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII + +syncChDecl ::= PART:p IDENT:id COLON SYNC_T EQUAL SYNC_T LPAR RELATION_F EQUAL IDENT:rl RPAR SEMICOLON:s {: + getRelation(rl.getAvatarName()); + getChannel(id.getAvatarName()); + if (! theChannel.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Channel " + id.getAvatarName() + + " is already declared", theChannel.getLeft()) ); + } else { + if (theRelation.getAsynchronous()) // incompatible relation and channel types + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHWARNING, + pxleft, "synchroneous channels require a synchroneous relation\n")); + theRelation.addChannel(theChannel); + theChannel.setLeft(pxleft); + theChannel.setRight(sxright); + } +:}; + +// Non Blocking FIFO Channel IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII + +nbfChDecl ::= PART:p IDENT:id COLON NBFIFO_T EQUAL NBFIFO_T LPAR RELATION_F EQUAL IDENT:rl RPAR SEMICOLON:s {: + getRelation(rl.getAvatarName()); + getChannel(id.getAvatarName()); + if (! theChannel.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Channel " + id.getAvatarName() + + " is already declared", theChannel.getLeft()) ); + } else { + if (! theRelation.getAsynchronous()) // incompatible relation and channel types + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHWARNING, + pxleft, "FIFO channels require an asynchroneous relation\n")); + theRelation.addChannel(theChannel); + theChannel.setLeft(pxleft); + theChannel.setRight(sxright); + } +:}; + +// Non Blocking FIFO Channel IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII + +bfChDecl ::= PART:p IDENT:id COLON BFIFO_T EQUAL BFIFO_T LPAR RELATION_F EQUAL IDENT:rl RPAR SEMICOLON:s {: + getRelation(rl.getAvatarName()); + getChannel(id.getAvatarName()); + if (! theChannel.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Channel " + id.getAvatarName() + + " is already declared", theChannel.getLeft()) ); + } else { + if (! theRelation.getAsynchronous()) // incompatible relation and channel types + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHWARNING, + pxleft, "FIFO channels require an asynchroneous relation\n")); + theRelation.addChannel(theChannel); + theChannel.setLeft(pxleft); + theChannel.setRight(sxright); + } +:}; + +// SIGNAL BINDING $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ + +signalBinding ::= inSignalBinding | outSignalBinding; +inSignalBinding ::= + BINDING COLON INSIGNALBINDING_T BIND IDENT:b POINT IDENT:s EQUAL IDENT:c SEMICOLON {: + getChannel(c.getAvatarName()); // set relevant channel as current + StxBlock tmp = theBlock; // save current block + getBlock(b.getAvatarName()); // get block of signal (in current block) + getSignal(b.getAvatarName(),s.getAvatarName()); // set relevant signal as current + theSignal.setInput(true); // update structure + theBlock.addSignal(theSignal); // update structure + theSignal.setChannel(theChannel); // update structure + theChannel.setSignal(b.getAvatarName(), theSignal); // update structure + theBlock = tmp; // restore current block + :} + | BINDING COLON INSIGNALBINDING_T BIND IDENT:c EQUAL IDENT:b POINT IDENT:s SEMICOLON {: + getChannel(c.getAvatarName()); // set relevant channel as current + StxBlock tmp = theBlock; // save current block + getBlock(b.getAvatarName()); // get block of signal (in current block) + getSignal(b.getAvatarName(),s.getAvatarName()); // set relevant signal as current + theSignal.setInput(true); // update structure + theBlock.addSignal(theSignal); // update structure + theSignal.setChannel(theChannel); // update structure + theChannel.setSignal(b.getAvatarName(), theSignal); // update structure + theBlock = tmp; // restore current block + :} +; +outSignalBinding ::= + BINDING COLON OUTSIGNALBINDING_T BIND IDENT:b POINT IDENT:s EQUAL IDENT:c SEMICOLON {: + getChannel(c.getAvatarName()); // set relevant channel as current + StxBlock tmp = theBlock; // save current block + getBlock(b.getAvatarName()); // get block of signal (in current block) + getSignal(b.getAvatarName(),s.getAvatarName()); // set relevant signal as current + theSignal.setInput(false); // update structure + theBlock.addSignal(theSignal); // update structure + theSignal.setChannel(theChannel); // update structure + theChannel.setSignal(b.getAvatarName(), theSignal); // update structure + theBlock = tmp; // restore current block + :} + | BINDING COLON OUTSIGNALBINDING_T BIND IDENT:c EQUAL IDENT:b POINT IDENT:s SEMICOLON {: + getChannel(c.getAvatarName()); // set relevant channel as current + StxBlock tmp = theBlock; // save current block + getBlock(b.getAvatarName()); // get block of signal (in current block) + getSignal(b.getAvatarName(),s.getAvatarName()); // set relevant signal as current + theSignal.setInput(false); // update structure + theBlock.addSignal(theSignal); // update structure + theSignal.setChannel(theChannel); // update structure + theChannel.setSignal(b.getAvatarName(), theSignal); // update structure + theBlock = tmp; // restore current block + :} +; + +// MESSAGE DECLARATION $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ + +messageDecl ::= inMessageDecl | outMessageDecl +; + +// IN MESSAGE ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +inMessageDecl ::= inMessageDeclBegin:m inMessageDeclBODY:b {: + if (messageChannelParam == null) // missing channel parameter + addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, mxleft, "In-message channel has not been set", null) ); + if (flag) theStructure.setRight(bxright); +:}; +inMessageDeclBegin ::= PART:p DEF IDENT:id specializes INMESSAGE_T LBRAC {: + getInMessage(id.getAvatarName()); + if (! theStructure.declare() ) { //duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "In-message profile " + id.getAvatarName() + + " is already declared", theStructure.getLeft()) ); + flag = false; + } else { + theStructure.setLeft(pxleft); + messageChannelParam = null; + flag = true; + } +:}; +inMessageDeclBODY ::= + messageChannel RBRAC + | messageChannel fieldDecls RBRAC + | fieldDecls messageChannel RBRAC +; +messageChannel ::= + PRIVATE:p PART CHANNEL_F COLON CHANNEL_T EQUAL IDENT:ch SEMICOLON {: + if (messageChannelParam != null) // duplicate + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, + "in-message channel has already been set", messageChannelParam)); + else { // message param is not set + getChannel(ch.getAvatarName()); + theChannel.setInProfile((StxInMessage)theStructure); + ((StxInMessage)theStructure).setChannel(theChannel); + messageChannelParam = pxleft; // now it is + } + :} + | PRIVATE:p PART CHANNEL_F EQUAL IDENT:ch SEMICOLON {: + if (messageChannelParam != null) // duplicate + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, + "in-message channel has already been set", messageChannelParam)); + else { // message param is not set + getChannel(ch.getAvatarName()); + theChannel.setInProfile((StxInMessage)theStructure); + ((StxInMessage)theStructure).setChannel(theChannel); + messageChannelParam = pxleft; // now it is + } + :} +; + +// OUT MESSAGE ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +outMessageDecl ::= + outMessageDeclBegin SEMICOLON:b {: + if (flag) theOutMessage.setRight(bxright); + :} + | outMessageDeclBegin LBRAC RBRAC:b {: + if (flag) theOutMessage.setRight(bxright); + :} + | outMessageDeclBegin LBRAC outMessageDeclBODY +; +outMessageDeclBegin ::= + PART:p DEF IDENT:id specializes OUTMESSAGE_T COMMA IDENT:m {: + getInMessage(m.getAvatarName()); + getOutMessage(id.getAvatarName(), (StxInMessage)theStructure); + if (! theOutMessage.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Out-message profile " + id.getAvatarName() + + " is already declared", theStructure.getLeft()) ); + flag = false; + } else { + theOutMessage.setLeft(pxleft); + flag = true; + } + :} + | PART:p DEF IDENT:id specializes IDENT:m COMMA OUTMESSAGE_T {: + getInMessage(m.getAvatarName()); + if (! theOutMessage.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Out-message profile " + id.getAvatarName() + + " is already declared", theStructure.getLeft()) ); + flag = false; + } else { + theOutMessage.setLeft(pxleft); + flag = true; + } + :} +; +outMessageDeclBODY ::= + redefineField RBRAC:b {: + if (flag) theOutMessage.setRight(bxright); + :} + | redefineField outMessageDeclBODY +; +redefineField ::= + ATTRIBUTE:a IDENT:o REDEFINES IDENT:i SEMICOLON {: + StxField ofield = new StxField(axleft, axright, o.getAvatarName(), ""); + // maps output field to its dual input field + if (! theOutMessage.addFieldLink(ofield, i.getAvatarName())) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, axleft, "Field " + o.getAvatarName() + + " is already declared") ); +:}; + +// BLOCK DECLARATION $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ +blockDecl ::= + blockDeclBegin RBRAC:e {: if (popBlockFlag()) theBlock.setRight(exright); popBlock(); :} + | blockDeclBegin blockDeclBODY:e {: if (popBlockFlag()) theBlock.setRight(exright); popBlock(); :} +; +blockDeclBegin ::= + PART:p IDENT:id COLON AVBLOCK_T LBRAC {: + StxBlock tmp = theBlock; // locally memorize father + pushBlock(); // globally memorize father state + getBlock(id.getAvatarName()); // set current block + if (! theBlock.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Block " + id.getAvatarName() + + " is already declared", theBlock.getLeft()) ); + pushBlockFlag(false); + } else { + theBlock.setFather(tmp); + theBlock.setLeft(pxleft); + pushBlockFlag(true); + } +:}; +blockDeclBODY ::= + blockItem RBRAC + | blockItem blockDeclBODY +; +blockItem ::= + attributeDecl + | constantDecl + | methodDecl + | signalDecl + | timerDecl + | stateMachine + | blockDecl +; + +// ATTRIBUTE DECLARATION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +attributeDecl ::= + attributeDeclHEADER SEMICOLON:q {: + if (flag) theAttribute.setRight(qxright); + :} + | attributeDeclHEADER GETS iexpr:e SEMICOLON:q {: + theAttribute.setInit(e); + if (flag) theAttribute.setRight(qxright); + :} + | attributeDeclHEADER DEFAULT GETS iexpr:e SEMICOLON:q {: + theAttribute.setInit(e); + if (flag) theAttribute.setRight(qxright); + theAttribute.setDefaultValue(true); + :} +; +attributeDeclHEADER ::= + ATTRIBUTE:a IDENT:id COLON typeIdent:tp {: + getAttribute(id.getAvatarName(), tp); + if (! theAttribute.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, axleft, "Attribute " + id.getAvatarName() + + " is already declared (or there is an attribute with same name)", theAttribute.getLeft()) ); + flag = false; + } else { + StxElement e = theBlock.addAttribute(theAttribute); + if (e != null) + if (e instanceof StxTimer) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, axleft, "Attribute " + id.getAvatarName() + + " cannot be added: name already used for method", e.getLeft())); + else if (e instanceof StxMethod) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, axleft, "Attribute " + id.getAvatarName() + + " cannot be added: name already used for method", e.getLeft())); + else if (e instanceof StxSignal) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, axleft, "Attribute " + id.getAvatarName() + + " cannot be added: name already used for signal", e.getLeft())); + else ; + flag = true; + theAttribute.setLeft(axleft); + } +:}; + +// CONSTANT DECLARATION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +constantDecl ::= + constantDeclHEADER SEMICOLON:q {: + if (flag) theAttribute.setRight(qxright); + :} + | constantDeclHEADER GETS iexpr:e SEMICOLON:q {: + theAttribute.setInit(e); + if (flag) theAttribute.setRight(qxright); + :} +; +constantDeclHEADER ::= + READONLY:r ATTRIBUTE IDENT:id COLON typeIdent:tp {: + getAttribute(id.getAvatarName(), tp); + if (! theAttribute.declare() ) { + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, rxleft, "Constant " + id.getAvatarName() + + " is already declared (or there is an attribute with same name)", theAttribute.getLeft()) ); + flag = false; + } else { + StxElement e = theBlock.addConstant(theAttribute); + if (e != null) + if (e instanceof StxTimer) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, rxleft, "Constant " + id.getAvatarName() + + " cannot be added: name already used for method", e.getLeft())); + else if (e instanceof StxMethod) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, rxleft, "Constant " + id.getAvatarName() + + " cannot be added: name already used for method", e.getLeft())); + else if (e instanceof StxSignal) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, rxleft, "Constant " + id.getAvatarName() + + " cannot be added: name already used for signal", e.getLeft())); + else ; + flag = true; + theAttribute.setLeft(rxleft); + } +:}; + +// METHOD DECLARATION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +methodDecl ::= voidMethodDecl | calcMethodDecl; + +voidMethodDecl ::= + voidMethodDeclBegin LBRAC RBRAC:b {: + if (flag) theStructure.setRight(bxright); + :} + | voidMethodDeclBegin SEMICOLON:b {: + if (flag) theStructure.setRight(bxright); + :} + | voidMethodDeclBegin LBRAC fieldDecls RBRAC:b {: + if (flag) theStructure.setRight(bxright); + :} +; +voidMethodDeclBegin ::= ACTION:a IDENT:id COLON AVVOIDMETHOD_T {: + getMethod(id.getAvatarName()); + if (! theStructure.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, axleft, "Method " + id.getAvatarName() + + " is already declared", theStructure.getLeft()) ); + flag = false; + } else { + StxElement e = theBlock.addMethod((StxMethod)theStructure); + if (e != null) + if (e instanceof StxTimer) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, axleft, "Method " + id.getAvatarName() + + " cannot be added: name already used for timer", e.getLeft())); + else if (e instanceof StxAttribute) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, axleft, "Method " + id.getAvatarName() + + " cannot be added: name already used for constant or attribute", e.getLeft())); + else if (e instanceof StxSignal) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, axleft, "Method " + id.getAvatarName() + + " cannot be added: name already used for signal", e.getLeft())); + else ; + flag = true; + theStructure.setLeft(axleft); + } +:}; + +calcMethodDecl ::= + calcMethodDeclBegin LBRAC RBRAC:b {: + if (flag) theStructure.setRight(bxright); + :} + | calcMethodDeclBegin LBRAC calcMethodItems RBRAC:b {: + if (flag) theStructure.setRight(bxright); + :} +; +calcMethodDeclBegin ::= CALC:c IDENT:id COLON AVCALCMETHOD_T {: + getMethod(id.getAvatarName()); + if (! theStructure.declare() ) { + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, cxleft, "Method " + id.getAvatarName() + + " is already declared", theStructure.getLeft()) ); + flag = false; + } else { + StxElement e = theBlock.addMethod((StxMethod)theStructure); + if (e != null) + if (e instanceof StxTimer) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, cxleft, "Method " + id.getAvatarName() + + " cannot be added: name already used for timer", e.getLeft())); + else if (e instanceof StxAttribute) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, cxleft, "Method " + id.getAvatarName() + + " cannot be added: name already used for constant or attribute", e.getLeft())); + else if (e instanceof StxSignal) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, cxleft, "Method " + id.getAvatarName() + + " cannot be added: name already used for signal", e.getLeft())); + else ; + flag = true; + theStructure.setLeft(cxleft); + } +:}; +calcMethodItems ::= + calcMethodItem + | calcMethodItem calcMethodItems +; +calcMethodItem ::= + fieldDecl + | RETURN COLON typeIdent:tp SEMICOLON {: + ((StxMethod)theStructure).setReturnType(tp); + :} +; + +// SIGNAL DECLARATION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +signalDecl ::= + PART:p IDENT:id COLON FIFO_T SEMICOLON:q {: + getSignal(theBlock.getName(),id.getAvatarName()); + if (! theSignal.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Signal " + id.getAvatarName() + + " is already declared", theSignal.getLeft()) ); + } else { + StxElement e = theBlock.addSignal(theSignal); + if (e != null) + if (e instanceof StxTimer) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Signal " + id.getAvatarName() + + " cannot be added: name already used for timer", e.getLeft())); + else if (e instanceof StxAttribute) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Signal " + id.getAvatarName() + + " cannot be added: name already used for constant or attribute", e.getLeft())); + else if (e instanceof StxMethod) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Signal " + id.getAvatarName() + + " cannot be added: name already used for method", e.getLeft())); + else; + theSignal.setLeft(pxleft); + theSignal.setRight(qxright); + } + :} + | PART:p IDENT:id COLON CHANNEL_T SEMICOLON:q {: + getSignal(theBlock.getName(),id.getAvatarName()); + if (! theSignal.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Signal " + id.getAvatarName() + + " is already declared", theSignal.getLeft()) ); + } else { + StxElement e = theBlock.addSignal(theSignal); + if (e != null) + if (e instanceof StxTimer) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Signal " + id.getAvatarName() + + " cannot be added: name already used for timer", e.getLeft())); + else if (e instanceof StxAttribute) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Signal " + id.getAvatarName() + + " cannot be added: name already used for constant or attribute", e.getLeft())); + else if (e instanceof StxMethod) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Signal " + id.getAvatarName() + + " cannot be added: name already used for method", e.getLeft())); + else; + theSignal.setLeft(pxleft); + theSignal.setRight(qxright); + } + :} +; + +// TIMER DECLARATION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +timerDecl ::= + PART:p IDENT:id COLON AVTIMER_T EQUAL AVTIMER_T LPAR RPAR SEMICOLON:q {: + StxTimer t = new StxTimer(id.getAvatarName(), pxleft, qxright); + StxElement e = theBlock.addTimer(t); + if (e != null) // conflict with existing item e + if (e instanceof StxTimer && !e.declare()) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Timer " + id.getAvatarName() + + " is already declared", e.getLeft())); + else if (e instanceof StxAttribute) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Timer " + id.getAvatarName() + + " cannot be added: name already used for constant or attribute", e.getLeft())); + else if (e instanceof StxMethod) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Timer " + id.getAvatarName() + + " cannot be added: name already used for method", e.getLeft())); + else if (e instanceof StxSignal) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Timer " + id.getAvatarName() + + " cannot be added: name already used for signal", e.getLeft())); + else ; + else t.declare(); + :} + | PART:p IDENT:id COLON AVTIMER_T SEMICOLON:q {: + StxTimer t = new StxTimer(id.getAvatarName(), pxleft, qxright); + StxElement e = theBlock.addTimer(t); + if (e != null) // conflict with existing item e + if (e instanceof StxTimer && !e.declare()) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Timer " + id.getAvatarName() + + " is already declared", e.getLeft())); + else if (e instanceof StxAttribute) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Timer " + id.getAvatarName() + + " cannot be added: name already used for constant or attribute", e.getLeft())); + else if (e instanceof StxMethod) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Timer " + id.getAvatarName() + + " cannot be added: name already used for method", e.getLeft())); + else if (e instanceof StxSignal) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Timer " + id.getAvatarName() + + " cannot be added: name already used for signal", e.getLeft())); + else ; + else t.declare(); + :} +; + +// STATE MACHINE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +stateMachine ::= + stateMachineBegin LBRAC stateMachineItems RBRAC {: + theBlock.setStates(stateMap.values().toArray(new StxState[0])); // all collected information is put in block states + stateMap = null; + :} + | stateMachineBegin LBRAC RBRAC {: + theBlock.setStates(stateMap.values().toArray(new StxState[0])); // all collected information is put in block states + stateMap = null; + :} + | stateMachineBegin SEMICOLON {: + theBlock.setStates(stateMap.values().toArray(new StxState[0])); // all collected information is put in block states + stateMap = null; + :} +; +stateMachineBegin ::= EXHIBIT:e STATE STATEMACHINE COLON AVSTATEMACHINE_T {: + if (stateMachine != null) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, exleft, + "State Machine is already declared", stateMachine) ); + else + stateMachine = exleft; + + stateMap = new HashMap<String, StxState>(); +:}; +stateMachineItems ::= + stateMachineItem + | stateMachineItem stateMachineItems +; +stateMachineItem ::= state | transition; + +// STATES @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + +state ::= standardState | stopState | startState | sendState | receiveState + | randomState | countState | presendState | prereceiveState + | setTimerState | resetTimerState | expireTimerState +; +startState ::= + startStateBegin:b SEMICOLON:q {: + tryTrivialRequest(bxleft, qxright); + if (flag) theState.setRight(qxright); + :} + | startStateBegin:b EQUAL AVSTARTSTATE_T LPAR RPAR SEMICOLON:q {: + tryTrivialRequest(bxleft, qxright); + if (flag) theState.setRight(qxright); + :} + | startStateBegin EQUAL AVSTARTSTATE_T LPAR requestParam RPAR SEMICOLON:q {: + if (flag) theState.setRight(qxright); + :} +; +startStateBegin ::= ENTRY:z ACTION IDENT:id COLON AVSTARTSTATE_T {: + getState(id.getAvatarName()); + if (! theState.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, zxleft, "State " + id.getAvatarName() + + " is already declared", theState.getLeft()) ); + requestIndex = 0; + flag = false; + } else { + theState.setType(AvatarFromSysMLSyntax.STXSTARTSTATE); + theState.setLeft(zxright); + requestIndex = 0; + flag = true; + } +:}; +standardState ::= + standardStateBegin:b SEMICOLON:q {: + tryTrivialRequest(bxleft, qxright); + if (flag) theState.setRight(qxright); + :} + | standardStateBegin:b EQUAL AVSTANDARDSTATE_T LPAR RPAR SEMICOLON:q {: + tryTrivialRequest(bxleft, qxright); + if (flag) theState.setRight(qxright); + :} + | standardStateBegin EQUAL AVSTANDARDSTATE_T LPAR poolParam RPAR SEMICOLON:q {: + if (flag) theState.setRight(qxright); + :} +; +standardStateBegin ::= STATE:z IDENT:id COLON AVSTANDARDSTATE_T {: + getState(id.getAvatarName()); + if (! theState.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, zxleft, "State " + id.getAvatarName() + + " is already declared", theState.getLeft()) ); + requestIndex = 0; + flag = false; + } else { + theState.setType(AvatarFromSysMLSyntax.STXSTANDARDSTATE); + theState.setName(id.getAvatarName()); + theState.setLeft(zxright); + requestIndex = 0; + flag = true; + } +:}; +stopState ::= + stopStateBegin SEMICOLON:q {: + if (flag) theState.setRight(qxright); + :} + | stopStateBegin EQUAL AVSTOPSTATE_T LPAR RPAR SEMICOLON:q {: + if (flag) theState.setRight(qxright); + :} +; +stopStateBegin ::= EXIT:z ACTION IDENT:id COLON AVSTOPSTATE_T {: + getState(id.getAvatarName()); + if (! theState.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, zxleft, "State " + id.getAvatarName() + + " is already declared", theState.getLeft()) ); + requestIndex = 0; + flag = false; + } else { + theState.setType(AvatarFromSysMLSyntax.STXSTOPSTATE); + theState.setLeft(zxright); + flag = true; + } +:}; +sendState ::= + sendStateBegin:b SEMICOLON:q {: + tryTrivialRequest(bxleft, qxright); + if (flag) theState.setRight(qxright); + :} + | sendStateBegin EQUAL AVSENDSTATE_T LPAR RPAR SEMICOLON:q {: + if (flag) theState.setRight(qxright); + :} + | sendStateBegin EQUAL AVSENDSTATE_T LPAR requestParam RPAR SEMICOLON:q {: + if (flag) theState.setRight(qxright); + :} +; +sendStateBegin ::= STATE:z IDENT:id COLON AVSENDSTATE_T {: + getState(id.getAvatarName()); + if (! theState.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, zxleft, "State " + id.getAvatarName() + + " is already declared", theState.getLeft()) ); + requestIndex = 0; + flag = false; + } else { + theState.setType(AvatarFromSysMLSyntax.STXSENDSTATE); + theState.setLeft(zxright); + requestIndex = 0; + flag = true; + } +:}; +receiveState ::= + receiveStateBegin:b SEMICOLON:q {: + tryTrivialRequest(bxleft, qxright); + if (flag) theState.setRight(qxright); + :} + | receiveStateBegin:b EQUAL AVRECEIVESTATE_T LPAR RPAR SEMICOLON:q {: + tryTrivialRequest(bxleft, qxright); + if (flag) theState.setRight(qxright); + :} + | receiveStateBegin EQUAL AVRECEIVESTATE_T LPAR requestParam RPAR SEMICOLON:q {: + if (flag) theState.setRight(qxright); + :} +; +receiveStateBegin ::= STATE:z IDENT:id COLON AVRECEIVESTATE_T {: + getState(id.getAvatarName()); + if (! theState.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, zxleft, "State " + id.getAvatarName() + + " is already declared", theState.getLeft()) ); + requestIndex = 0; + flag = false; + } else { + theState.setType(AvatarFromSysMLSyntax.STXRECEIVESTATE); + theState.setLeft(zxright); + requestIndex = 0; + flag = true; + } +:}; +randomState ::= + randomStateBegin EQUAL AVRANDOMSTATE_T LPAR randomAction COMMA requestParam RPAR SEMICOLON:q {: + if (flag) theState.setRight(qxright); + :} + | randomStateBegin EQUAL AVRANDOMSTATE_T LPAR requestParam COMMA randomAction RPAR SEMICOLON:q {: + if (flag) theState.setRight(qxright); + :} + | randomStateBegin:b EQUAL AVRANDOMSTATE_T LPAR randomAction RPAR SEMICOLON:q {: + tryTrivialRequest(bxleft, qxright); + if (flag) theState.setRight(qxright); + :} +; +randomStateBegin ::= STATE:z IDENT:id COLON AVRANDOMSTATE_T {: + getState(id.getAvatarName()); + if (! theState.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, zxleft, "State " + id.getAvatarName() + + " is already declared", theState.getLeft()) ); + requestIndex = 0; + flag = false; + } else { + theState.setType(AvatarFromSysMLSyntax.STXRANDOMSTATE); + theState.setLeft(zxright); + requestIndex = 0; + flag = true; + } +:}; +countState ::= + countStateBegin:b EQUAL AVCOUNTSTATE_T LPAR countAction RPAR SEMICOLON:q {: + tryTrivialRequest(bxleft, qxright); + if (flag) theState.setRight(qxright); + :} + | countStateBegin EQUAL AVCOUNTSTATE_T LPAR requestParam COMMA countAction RPAR SEMICOLON:q {: + if (flag) theState.setRight(qxright); + :} + | countStateBegin EQUAL AVCOUNTSTATE_T LPAR countAction COMMA requestParam RPAR SEMICOLON:q {: + if (flag) theState.setRight(qxright); + :} +; +countStateBegin ::= STATE:z IDENT:id COLON AVCOUNTSTATE_T {: + getState(id.getAvatarName()); + if (! theState.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, zxleft, "State " + id.getAvatarName() + + " is already declared", theState.getLeft()) ); + requestIndex = 0; + flag = false; + } else { + theState.setType(AvatarFromSysMLSyntax.STXCOUNTSTATE); + theState.setLeft(zxright); + requestIndex = 0; + flag = true; + } +:}; +presendState ::= + presendStateBegin EQUAL AVPRESENDSTATE_T LPAR requestParam RPAR SEMICOLON:q {: + if (flag) theState.setRight(qxright); + :} +; +presendStateBegin ::= STATE:z IDENT:id COLON AVPRESENDSTATE_T {: + getState(id.getAvatarName()); + if (! theState.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, zxleft, "State " + id.getAvatarName() + + " is already declared", theState.getLeft()) ); + requestIndex = 0; + flag = false; + } else { + theState.setType(AvatarFromSysMLSyntax.STXPRESENDSTATE); + theState.setLeft(zxright); + requestIndex = 0; + flag = true; + } +:}; +prereceiveState ::= + prereceiveStateBegin EQUAL AVPRERECEIVESTATE_T LPAR requestParam RPAR SEMICOLON:q {: + if (flag) theState.setRight(qxright); + :} +; +prereceiveStateBegin ::= STATE:z IDENT:id COLON AVPRERECEIVESTATE_T {: + getState(id.getAvatarName()); + if (! theState.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, zxleft, "State " + id.getAvatarName() + + " is already declared", theState.getLeft()) ); + requestIndex = 0; + flag = false; + } else { + theState.setType(AvatarFromSysMLSyntax.STXPRERECEIVESTATE); + theState.setLeft(zxright); + requestIndex = 0; + flag = true; + } +:}; +setTimerState ::= + setTimerStateBegin EQUAL AVSETTIMERSTATE_T LPAR requestParam RPAR SEMICOLON:q {: + if (flag) theState.setRight(qxright); + :} + | setTimerStateBegin:b EQUAL AVSETTIMERSTATE_T LPAR RPAR SEMICOLON:q {: + tryTrivialRequest(bxleft, qxright); + if (flag) theState.setRight(qxright); + :} + | setTimerStateBegin:b SEMICOLON:q {: + tryTrivialRequest(bxleft, qxright); + if (flag) theState.setRight(qxright); + :} +; +setTimerStateBegin ::= STATE:z IDENT:id COLON AVSETTIMERSTATE_T {: + getState(id.getAvatarName()); + if (! theState.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, zxleft, "State " + id.getAvatarName() + + " is already declared", theState.getLeft()) ); + requestIndex = 0; + flag = false; + } else { + theState.setType(AvatarFromSysMLSyntax.STXSETTIMERSTATE); + theState.setLeft(zxright); + requestIndex = 0; + flag = true; + } +:}; +resetTimerState ::= + resetTimerStateBegin EQUAL AVRESETTIMERSTATE_T LPAR requestParam RPAR SEMICOLON:q {: + if (flag) theState.setRight(qxright); + :} + | resetTimerStateBegin:b EQUAL AVRESETTIMERSTATE_T LPAR RPAR SEMICOLON:q {: + tryTrivialRequest(bxleft, qxright); + if (flag) theState.setRight(qxright); + :} + | resetTimerStateBegin:b SEMICOLON:q {: + tryTrivialRequest(bxleft, qxright); + if (flag) theState.setRight(qxright); + :} +; +resetTimerStateBegin ::= STATE:z IDENT:id COLON AVRESETTIMERSTATE_T {: + getState(id.getAvatarName()); + if (! theState.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, zxleft, "State " + id.getAvatarName() + + " is already declared", theState.getLeft()) ); + requestIndex = 0; + flag = false; + } else { + theState.setType(AvatarFromSysMLSyntax.STXRESETTIMERSTATE); + theState.setLeft(zxright); + requestIndex = 0; + flag = true; + } +:}; +expireTimerState ::= + expireTimerStateBegin EQUAL AVEXPIRETIMERSTATE_T LPAR requestParam RPAR SEMICOLON:q {: + if (flag) theState.setRight(qxright); + :} + | expireTimerStateBegin:b EQUAL AVEXPIRETIMERSTATE_T LPAR RPAR SEMICOLON:q {: + tryTrivialRequest(bxleft, qxright); + if (flag) theState.setRight(qxright); + :} + | expireTimerStateBegin:b SEMICOLON:q {: + tryTrivialRequest(bxleft, qxright); + if (flag) theState.setRight(qxright); + :} +; +expireTimerStateBegin ::= STATE:z IDENT:id COLON AVEXPIRETIMERSTATE_T {: + getState(id.getAvatarName()); + if (! theState.declare() ) { // duplicate + addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, zxleft, "State " + id.getAvatarName() + + " is already declared", theState.getLeft()) ); + requestIndex = 0; + flag = false; + } else { + theState.setType(AvatarFromSysMLSyntax.STXEXPIRETIMERSTATE); + theState.setLeft(zxright); + requestIndex = 0; + flag = true; + } +:}; + +// STATES PARAMETERS @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + +// REQUESTS ++++++++++++++++++++++++++++++++++++ + +// REQUESTS POOLS ------------------------------ + +poolParam ::= + POOL_F EQUAL LBRAC LPAR RPAR RBRAC + | POOL_F EQUAL LBRAC NULL RBRAC + | POOL_F EQUAL LBRAC LPAR requestList RPAR RBRAC + | POOL_F EQUAL request +; +requestParam ::= REQUEST_F EQUAL LBRAC request RBRAC; +requestList ::= request | request COMMA requestList; + +request ::= + dummy IF:i iexpr:e QUEST simpleRequest:q ELSE NOKREQUEST_U LPAR INT:n RPAR:z {: + if (n != requestIndex + 1) { + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, nxleft, + " request index must be the request range in the request list (beginning at 1)", null) ); + } + if (okRequest) { + theTransition.setGuard(e); + theTransition.setRleft(ixleft); + theTransition.setRright(zxright); + } + requestIndex++; + :} + | dummy simpleRequest:i {: + if (okRequest) { + theTransition.setRleft(ixleft); + theTransition.setRright(ixright); + } + requestIndex++; + :} +; +dummy ::= {: + getTransition(requestIndex); + if (theTransition.isRequested()) { // duplicate + addError( new AvatarFromSysMLError( + AvatarFromSysMLError.LOWERROR, + lexer.getLocation(), + "Transition " + (requestIndex + 1) + " is already requested", + theTransition.getRleft()) ); + okRequest = false; // request is a duplikate (skip handling) + } else { + theTransition.setRequested(true); + okRequest = true; // request is not a duplicate + } +:}; + + +// SIMPLE REQUESTS ------------------------------------------- + +simpleRequest ::= trivialRequest | sendRequest | receiveRequest + | setTimerRequest | resetTimerRequest | expireTimerRequest; + +trivialRequest ::= + IMMEDIATEREQUEST_U:i {: + if (!(requestIndex == 0)) { + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, ixleft, + " immediate request has index 1 and thus can only be used as first request", null) ); + } + if (okRequest) + theTransition.setType(AvatarFromSysMLSyntax.STXTRIVIALTRANSITION); + :} + | trivialRequestBegin requestArgs RPAR +; +trivialRequestBegin ::= TRIVIALREQUEST_T LPAR {: + if (okRequest) + theTransition.setType(AvatarFromSysMLSyntax.STXTRIVIALTRANSITION); + clearRequestArgs(); +:}; +sendRequest ::= sendRequestBegin requestArgs RPAR; +sendRequestBegin ::= SENDREQUEST_T LPAR {: + if (okRequest) + theTransition.setType(AvatarFromSysMLSyntax.STXSENDTRANSITION); + clearRequestArgs(); +:}; +receiveRequest ::= receiveRequestBegin requestArgs RPAR; +receiveRequestBegin ::= RECEIVEREQUEST_T LPAR {: + if (okRequest) + theTransition.setType(AvatarFromSysMLSyntax.STXRECEIVETRANSITION); + clearRequestArgs(); +:}; +setTimerRequest ::= setTimerRequestBegin requestArgs RPAR; +setTimerRequestBegin ::= SETTIMERREQUEST_T LPAR {: + if (okRequest) + theTransition.setType(AvatarFromSysMLSyntax.STXSETTIMERTRANSITION); + clearRequestArgs(); +:}; +resetTimerRequest ::= resetTimerRequestBegin requestArgs RPAR; +resetTimerRequestBegin ::= RESETTIMERREQUEST_T LPAR {: + if (okRequest) + theTransition.setType(AvatarFromSysMLSyntax.STXRESETTIMERTRANSITION); + clearRequestArgs(); +:}; +expireTimerRequest ::= expireTimerRequestBegin requestArgs RPAR; +expireTimerRequestBegin ::= EXPIRETIMERREQUEST_T LPAR {: + if (okRequest) + theTransition.setType(AvatarFromSysMLSyntax.STXEXPIRETIMERTRANSITION); + clearRequestArgs(); +:}; + +// SIMPLE REQUESTS PARAMETERS ------------------------------- + +requestArgs ::= requestArg | requestArg COMMA requestArgs; +requestArg ::= indexParam | delayParam | channelParam | payloadParam | settimerParam | resettimerParam | expiretimerParam; + +// INDEX ......... +indexParam ::= INDEX_F:f EQUAL INT:i {: + if (indexArg != null) + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING,fxleft, "index parameter has already been set", indexArg)); + if (i != requestIndex + 1) + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING,fxleft, "the index of a request must be its range (beginning at 1)", + null)); + if (indexArg == null) indexArg = fxleft; +:}; + +// DELAY ......... +delayParam ::= delayKeyword EQUAL delayExpr; +delayKeyword ::= DELAY_F:d {: + if (delayArg != null) { + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, dxleft, "delay parameter has already been set", delayArg)); + argOK = false; + } + else { + delayArg = dxleft; + argOK = true; + } +:}; +delayExpr ::= + iexpr:e {: if (argOK && okRequest) theTransition.setMinDelay(e); :} + | delayRandomExpr +; +delayRandomExpr ::= + BOUNDRANDOM_U LPAR iexpr:i COMMA iexpr:a RPAR {: + if(argOK && okRequest) { + theTransition.setMinDelay(i); + theTransition.setMaxDelay(a); + } + :} +; +// PAYLOAD ......... +payloadParam ::= + payloadParamBegin:b IDENT LPAR termList RPAR {: // termlist fills argList + if (argOK) { // not duplicate + if (theTransition.getType() != AvatarFromSysMLSyntax.STXSENDTRANSITION) + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, bxleft, + "such payload is only relevant for send transitions", null)); + if (okRequest) theTransition.setSendPayload(argList); + } + argList = null; + :} + | payloadParamBegin:b IDENT LPAR RPAR {: + if (argOK) { // not duplicate + if (theTransition.getType() != AvatarFromSysMLSyntax.STXSENDTRANSITION) + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, bxleft, + "such payload is only relevant for send transitions", null)); + if (okRequest) theTransition.setSendPayload(argList); + } + argList = null; + :} + | payloadParamBegin:b IDENT {: + if (argOK) { // not duplicate + if (theTransition.getType() != AvatarFromSysMLSyntax.STXSENDTRANSITION) + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, bxleft, + "such payload is only relevant for send transitions", null)); + if (okRequest) theTransition.setSendPayload(argList); + } + argList = null; + :} + | payloadParamBegin:b TIMERSETMSG_T LPAR stxExpr:e RPAR {: + if (argOK) { // not duplicate + if (theTransition.getType() != AvatarFromSysMLSyntax.STXSETTIMERTRANSITION) + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, bxleft, + "such payload is only relevant for set-timer transitions", null)); + argList.add(e); + if (okRequest) theTransition.setSendPayload(argList); + } + argList = null; + :} + | payloadParamBegin:b TIMERRESETMSG_T LPAR RPAR {: + if (argOK) { // not duplicate + if (theTransition.getType() != AvatarFromSysMLSyntax.STXRESETTIMERTRANSITION) + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, bxleft, + "such payload is only relevant for reset-timer transitions", null)); + if (okRequest) theTransition.setSendPayload(argList); + } + argList = null; + :} +; +payloadParamBegin ::= PAYLOAD_F:p EQUAL {: + if (payloadArg != null) { + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, pxleft, "payload parameter has already been set", payloadArg)); + argOK = false; + } + else { + payloadArg = pxleft; + argOK = true; + argList= new ArrayList<StxTerm>(); + } +:}; +// CHANNEL ......... +channelParam ::= CHANNEL_F:c EQUAL IDENT:id {: + if (channelArg != null) + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, cxleft, "channel parameter has already been set", channelArg)); + else { + if (theTransition.getType() != AvatarFromSysMLSyntax.STXSENDTRANSITION && + theTransition.getType() != AvatarFromSysMLSyntax.STXRECEIVETRANSITION) + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, cxleft, + "such channel is only relevant for send or receive transitions", null)); + if (okRequest) { + theTransition.setSignalName(theBlock.getName(), id.getAvatarName()); + commTransitions.add(theTransition); + } + channelArg = cxleft; + } +:}; +// SET TIMER TIMER PARAM ......... +settimerParam ::= CHANNEL_F:c EQUAL IDENT:id POINT SET_TM {: + if (settimerArg != null) + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, cxleft, "timer channel parameter has already been set", settimerArg)); + else { + if (theTransition.getType() != AvatarFromSysMLSyntax.STXSETTIMERTRANSITION) + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, cxleft, + "such channel is only relevant for set-timer transitions", null)); + if (okRequest) theTransition.setTimer(id.getAvatarName()); + settimerArg = cxleft; + } +:}; +// RESET TIMER TIMER PARAM ......... +resettimerParam ::= CHANNEL_F:c EQUAL IDENT:id POINT RESET_TM {: + if (resettimerArg != null) + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, cxleft, "timer channel parameter has already been set", settimerArg)); + else { + if (theTransition.getType() != AvatarFromSysMLSyntax.STXRESETTIMERTRANSITION) + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, cxleft, + "such channel is only relevant for reset-timer transitions", null)); + if (okRequest) theTransition.setTimer(id.getAvatarName()); + resettimerArg = cxleft; + } +:}; +// EXPIRE TIMER TIMER PARAM ......... +expiretimerParam ::= CHANNEL_F:c EQUAL IDENT:id POINT EXPIRE_TM {: + if (expiretimerArg != null) + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, cxleft, "timer channel parameter has already been set", settimerArg)); + else { + if (theTransition.getType() != AvatarFromSysMLSyntax.STXEXPIRETIMERTRANSITION) + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, cxleft, + "such channel is only relevant for expire-timer transitions", null)); + if (okRequest) theTransition.setTimer(id.getAvatarName()); + expiretimerArg = cxleft; + } +:}; + +termList ::= + stxRvalue:e {: argList.add(e); :} + | termList COMMA stxRvalue:e {: argList.add(e); :} +; + +// STATE ACTIONS ++++++++++++++++++++++++++++++++++++ + +// common: TARGET VARIABLE PARAMETER...... +targetParam ::= target EQUAL fullIdent {: + theState.setVariable(stringAcc.toString()); +:}; +target ::= TARGET_F {: + stringAcc = new StringBuffer(); +:}; +fullIdent ::= + IDENT:id {: stringAcc.append(id.getAvatarName()); :} + | fullIdent POINT IDENT:id {: stringAcc.append("." + id.getAvatarName()); :} +; + +// RANDOM ACTION.......... +randomAction ::= + STATEACTION_F EQUAL ASSIGNMENT_T LPAR targetParam COMMA randomParam RPAR + | STATEACTION_F EQUAL ASSIGNMENT_T LPAR randomParam COMMA targetParam RPAR +; +randomParam ::= VALUE_F EQUAL actionRandomExpr; +actionRandomExpr ::= + BOUNDRANDOM_U LPAR iexpr:i COMMA iexpr:a RPAR {: + theState.setMinValue(i); + theState.setMaxValue(a); + :} +; + +// COUNT ACTION............ +countAction ::= + STATEACTION_F EQUAL ASSIGNMENT_T LPAR targetParam COMMA countParam RPAR + | STATEACTION_F EQUAL ASSIGNMENT_T LPAR countParam COMMA targetParam RPAR +; +countParam ::= VALUE_F EQUAL IDENT:id POINT AMOUNT_U LPAR RPAR {: + getSignal(theBlock.getName(),id.getAvatarName()); + theState.setSignal(theSignal); +:}; + +// TRANSITIONS @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + +transition ::= + transitionBegin:t THEN IDENT:id SEMICOLON:q {: + if (flag) { + getState(id.getAvatarName()); + theTransition.setTarget(theState); + theTransition.setLeft(txleft); + theTransition.setRight(qxright); + } + :} + | transitionBegin:t doActions THEN IDENT:id SEMICOLON:q {: + if (flag) { + getState(id.getAvatarName()); + theTransition.setTarget(theState); + theTransition.setLeft(txleft); + theTransition.setRight(qxright); + } + :} + | transitionBegin:t THEN IDENT:id LBRAC transitionLabels RBRAC:q {: + if (flag) { + getState(id.getAvatarName()); + theTransition.setTarget(theState); + theTransition.setDelayExtra(delayExtraMap); + theTransition.setLeft(txleft); + theTransition.setRight(qxright); + } + delayExtraMap = null; + :} + | transitionBegin:t doActions THEN IDENT:id LBRAC transitionLabels RBRAC:q {: + if (flag) { + getState(id.getAvatarName()); + theTransition.setTarget(theState); + theTransition.setDelayExtra(delayExtraMap); + theTransition.setLeft(txleft); + theTransition.setRight(qxright); + } + delayExtraMap = null; + :} +; +transitionBegin ::= + TRANSITION:t COLON AVTRANSITION_T FIRST IDENT:st {: + getState(st.getAvatarName()); + getTransition(0); + if (!theTransition.declare()) { + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, txleft, + "transition with same index has already been declared", null)); + flag = false; + } + else flag = true; + clearTransitionLbls(); + :} + | TRANSITION:t COLON AVTRANSITION_T FIRST IDENT:st IF INDEX_F EQ INT:i {: + getState(st.getAvatarName()); + getTransition(i-1); + if (!theTransition.declare()) { + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, txleft, + "transition with same index has already been declared", null)); + flag = true; + } + else flag = true; + clearTransitionLbls(); + :} +; + +// TRANSITION ACTIONS--------------------------------- + +doActions ::= + transitionActionBegin LBRAC RBRAC + | transitionActionBegin LBRAC transitionAction RBRAC {: + if (flag) theTransition.setActions(actionList); + actionList = null; + :} + | receiveActionBegin LBRAC RBRAC + | receiveActionBegin LBRAC receiveAction RBRAC {: + if (flag) theTransition.setReceivePayload(receiveMap); + receiveMap = null; + :} +; + +// ORDINARY TRANSITION ACTION LIST .......................... + +transitionActionBegin ::= DO ACTION COLON TRANSITIONACTION_T {: + actionList = new ArrayList<StxAction>(); +:}; + +// RECEIVE TRANSITION ACTION LIST .......................... + +receiveActionBegin ::= DO ACTION COLON RECEIVEACTION_T {: + receiveMap = new HashMap<String,String>(); +:}; + +// ORDINARY TRANSITION ACTION LIST .......................... + +transitionAction ::= + FIRST START_U SEMICOLON THEN DONE_U SEMICOLON + | FIRST START_U SEMICOLON actionSeq +; +actionSeq ::= + THEN act THEN DONE_U SEMICOLON + | THEN act actionSeq +; +act ::= + assign:a fulllIdent:id GETS stxRvalue:v SEMICOLON:q {: + actionList.add(new StxAction(axleft, qxright, id , v)); + :} + | ACTION:a EQUAL stxCall:c SEMICOLON:q {: + actionList.add(new StxAction(axleft, qxright, c)); + :} +; +assign ::= ASSIGN {: + stringAcc = new StringBuffer(); +:}; +fulllIdent ::= fullIdent {: + RESULT = stringAcc.toString(); + stringAcc.setLength(0); +:}; + +// RECEIVE TRANSITION ACTION LIST .......................... + +receiveAction ::= messageLine receiveAssigns | receiveAssigns messageLine; + +messageLine ::= ITEM MSG_U COLON IDENT EQUAL PAYLOAD_F AS IDENT SEMICOLON; + +receiveAssigns ::= + FIRST START_U SEMICOLON THEN DONE_U SEMICOLON + | FIRST START_U SEMICOLON receiveAssignSeq +; +receiveAssignSeq ::= + receiveAssign THEN DONE_U SEMICOLON + | receiveAssign receiveAssignSeq +; +receiveAssign ::= THEN:t assign fullIdent GETS MSG_U POINT IDENT:id SEMICOLON {: + String test = receiveMap.get(id.getAvatarName()); + if (test == null) receiveMap.put(id.getAvatarName(),stringAcc.toString()); + else + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, txleft, + "component " + id.getAvatarName() + " has already been assigned", null)); +:}; + +// TRANSITION DISTRIBUTION LAWS --------------------------------- + +transitionLabels ::= transitionLabel SEMICOLON | transitionLabel SEMICOLON transitionLabels; +transitionLabel ::= distributionLabel | weightLabel | extraLabel; +distributionLabel ::= ATTRIBUTE:a DISTRIBUTION_A COLON STRING_T EQUAL STRING:s {: + if (distributionLbl != null) + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, axleft, + "distribution label has already been assigned", distributionLbl)); + else { + theTransition.setDelayDistributionLaw(s); + distributionLbl = axleft; + } +:}; +weightLabel ::= + ATTRIBUTE:a WEIGHT_A COLON REAL_T EQUAL REAL:r {: + if (weightLbl != null) + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, axleft, + "weight label has already been assigned", weightLbl)); + else { + theTransition.setProbability(r); + weightLbl = axleft; + } + :} + | ATTRIBUTE:a WEIGHT_A COLON REAL_T EQUAL INT:r {: + if (weightLbl != null) + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, axleft, + "weight label has already been assigned", weightLbl)); + else { + theTransition.setProbability((double)r); + weightLbl = axleft; + } + :} +; +extraLabel ::= + ATTRIBUTE ANYNAME:n COLON STRING_T EQUAL STRING:s {: + if (delayExtraMap == null) + delayExtraMap = new HashMap<String,String>(); + delayExtraMap.put(n,s); + :} + | ATTRIBUTE IDENT:n COLON STRING_T EQUAL STRING:s {: + if (delayExtraMap == null) + delayExtraMap = new HashMap<String,String>(); + delayExtraMap.put(n.getAvatarName(),s); + :} +; + +// CLASSIFIED EXPRESSIONS +++++++++++++++++++++++++++++++++++++++ + +stxRvalue ::= + stxCall:c {: RESULT = c; // FUNCTION CALL:} + | expr:e {: RESULT = new StxExpr(e); // INT/BOOL EXPRESSION :} + | complexIdent:i {: RESULT = new StxId(i); :} +; + +stxExpr ::= iexpr:e {: RESULT = new StxExpr(e); // INT/BOOL EXPRESSION :} +; + +iexpr ::= // string int/bool expression or complex ident + expr:e {: RESULT = e; :} + | complexIdent:i {: RESULT = i; :} +; + +// INT/BOOL EXPRESSIONS --------------------------- +expr ::= + iexpr:l PLUS iexpr:r {: RESULT = l + " + " + r; :} + | iexpr:l MINUS iexpr:r {: RESULT = l + " - " + r; :} + | iexpr:l MULT iexpr:r {: RESULT = l + " * " + r; :} + | iexpr:l DIV iexpr:r {: RESULT = l + " / " + r; :} + | iexpr:l MOD iexpr:r {: RESULT = l + " % " + r; :} + | MINUS iexpr:e {: RESULT = "-" + e; :} %prec UMINUS + | iexpr:l OR iexpr:r {: RESULT = l + " || " + r; :} + | iexpr:l AND iexpr:r {: RESULT = l + " && " + r; :} + | NOT iexpr:e {: RESULT = "!" + e; :} + | iexpr:l LT iexpr:r {: RESULT = l + " < " + r; :} + | iexpr:l GT iexpr:r {: RESULT = l + " > " + r; :} + | iexpr:l LEQ iexpr:r {: RESULT = l + " <= " + r; :} + | iexpr:l GEQ iexpr:r {: RESULT = l + " >= " + r; :} + | iexpr:l EQ iexpr:r {: RESULT = l + " == " + r; :} + | iexpr:l DIF iexpr:r {: RESULT = l + " != " + r; :} + | LPAR iexpr:e RPAR {: RESULT = "(" + e + ")"; :} + | INT:i {: RESULT = "" + i; :} + | BOOL:b {: RESULT = ( b ? "true" : "false" ); :} +; + +// COMPLEX IDENT --------------------------- +complexIdent ::= + IDENT:e {: RESULT = e.getAvatarName(); :} + | IDENT:e POINT complexIdent:i {: RESULT = e.getAvatarName() + "." + i; :} +; + + +// METHOD CALL --------------------------- +stxCall ::= + stxCallBegin RPAR {: + theCall.addSegment(stringAcc.toString() + ")"); + RESULT = theCall; + :} + | stxCallBegin stxCallParams:l RPAR {: + theCall.addSegment(stringAcc.toString() + ")"); + RESULT = theCall; + :} +; +stxCallBegin ::= IDENT:i LPAR {: + theCall = new StxCall(); + stringAcc = new StringBuffer(i.getAvatarName() + "("); +:}; + +stxCallParams ::= stxCallParam | stxCallParam comma stxCallParams; +comma ::= COMMA {: stringAcc.append(", "); :} +; +stxCallParam ::= + expr:e {: stringAcc.append(e); :} + | complexIdent:i {: + theCall.addSegment(stringAcc.toString()); + theCall.addIdent(i); + stringAcc.setLength(0); + :} + | call +; +call ::= + callBegin RPAR {: stringAcc.append(")"); :} + | stxCallBegin stxCallParams:l RPAR {: stringAcc.append(")"); :} +; +callBegin ::= IDENT:i LPAR {: + stringAcc.append(i.getAvatarName() + "("); +:}; diff --git a/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jflex b/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jflex new file mode 100644 index 0000000000000000000000000000000000000000..081d157ac306e3cb121377bd5807809fb3f43c61 --- /dev/null +++ b/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jflex @@ -0,0 +1,427 @@ +/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille + * + * ludovic.apvrille AT enst.fr + * + * This software is a computer program whose purpose is to allow the + * edition of TURTLE analysis, design and deployment diagrams, to + * allow the generation of RT-LOTOS or Java code from this diagram, + * and at last to allow the analysis of formal validation traces + * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP + * from INRIA Rhone-Alpes. + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + */ + package avatartranslator.tosysmlv2; +import java_cup.runtime.*; +import java_cup.runtime.ComplexSymbolFactory.*; +import java.util.HashSet; +import avatartranslator.tosysmlv2.AvatarFromSysMLSyntax.*; + +%% + +%class LexerClassName +%public +%unicode +%cup +%line +%column +%eofval{ + return makeSymbol(#Symb.EOF); +%eofval} + +%yylexthrow Exception + +%{ /** create a symbol provided with current lexeme and location */ + ComplexSymbol makeSymbol(int id, Object val) { + // System.out.print(" ##" + #Symb.terminalNames[id] + "-" + val + " " + "(" + "l:" + yyline + ",c:" + yycolumn + ")"); + return new ComplexSymbol( + #Symb.terminalNames[id], + id, + new Location(yyline, yycolumn), + new Location(yyline, yycolumn + yytext().length()), + val); + } + /** create a symbol provided with current lexeme and location */ + ComplexSymbol makeSymbol(int id) { + // System.out.print(" ##" + #Symb.terminalNames[id] + "(" + "l:" + yyline + ",c:" + yycolumn + ")"); + return new ComplexSymbol( + #Symb.terminalNames[id], + id, + new Location(yyline, yycolumn), + new Location(yyline, yycolumn + yytext().length())); + } + + /** to memorize error location before throwing an exception */ + Location errorLocation; + + /** memorize error location */ + public void setErrorLocation(Location _errorLocation) { errorLocation = _errorLocation; } + + /** get memorized error location */ + public Location getErrorLocation() { return errorLocation; } + + /** get current location. To allow parser to know location without lexeme (i.e. through empty grammar rule) */ + public Location getLocation() { return new Location(yyline, yycolumn); } +%} +%init{ + // there is initially no error + errorLocation = null; +%init} +Space = [\ \n\r\t\f] +Natural = 0 | [1-9][0-9]* +Real = {Natural} "." 0* {Natural} + +AvIdent = ("_"[a-zA-Z0-9] | [a-zA-Z]) ("_"[a-zA-Z0-9] | [a-zA-Z0-9])* ("_")? +dataTypeName = "'@dt:" {AvIdent} "'" +blockName = "'@blk:" {AvIdent} "'" +attributeName = "'$" {AvIdent} "'" +fieldName = "'" {AvIdent} "'" +relationName = ("'@BF" | "'@NBF" | "'@SYN") {Natural} ":" {AvIdent} "-" {AvIdent} "'" +channelPreName = {AvIdent} "." {AvIdent} (">"|"<") {AvIdent} "." {AvIdent} +signalName = "'@sig:" {AvIdent} "'" +channelName = ("'@syn" | "'@bf" | "'@nbf") ":" {channelPreName} "'" +messageName = "'@MSG:" {AvIdent} "." {AvIdent} "'" +startStateName = "'@st:start'" +stopStateName = "'@st:stop'" +standardStateName = "'@st:standard." {AvIdent} "'" +choiceStateName = "'@st:standard.choice__" [0-9]* "'" +randomStateName = "'@st:random." {Natural} "'" +countStateName = "'@st:count." {AvIdent} "." {Natural} "'" +sendStateName = "'@st:send." {AvIdent} "." {Natural} "'" +receiveStateName = "'@st:receive." {AvIdent} "." {Natural} "'" +presendStateName = "'@st:presend." {AvIdent} "." {Natural} "'" +prereceiveStateName = "'@st:prereceive." {AvIdent} "." {Natural} "'" +setTimerStateName = "'@st:set." {AvIdent} "." {Natural} "'" +resetTimerStateName = "'@st:reset." {AvIdent} "." {Natural} "'" +expireTimerStateName = "'@st:expire." {AvIdent} "." {Natural} "'" +presetTimerStateName = "'@st:preset." {AvIdent} "." {Natural} "'" +preresetTimerStateName = "'@st:prereset." {AvIdent} "." {Natural} "'" +preexpireTimerStateName = "'@st:preexpire." {AvIdent} "." {Natural} "'" +timerBlockName = "'@tmr:" {AvIdent} "'" + + +%state COMMENTLINE +%state IMPORTITEM + +%% + +<COMMENTLINE> { + [^\n\r]+ { break; } + "\n" { yybegin(YYINITIAL); break; } +} +<IMPORTITEM> { + [^;]+ { break; } + "\;" { yybegin(YYINITIAL); break; } +} + +<YYINITIAL> { + {Space} { break; } + "//" { yybegin(COMMENTLINE); break; } + {Natural} { try { return makeSymbol(#Symb.INT, Integer.parseInt(yytext())); } + catch (NumberFormatException nfe) { + setErrorLocation(new Location(yyline, yycolumn)); + throw new Exception ("lexing : bad format for number : " + yytext()); } + } + {Real} { try { return makeSymbol(#Symb.REAL, Double.parseDouble(yytext())); } + catch (NumberFormatException nfe) { + setErrorLocation(new Location(yyline, yycolumn)); + throw new Exception ("lexing : bad format for number : " + yytext()); } + } + + "+" { return makeSymbol(#Symb.PLUS); } + "-" { return makeSymbol(#Symb.MINUS); } + "*" { return makeSymbol(#Symb.MULT); } + "/" { return makeSymbol(#Symb.DIV); } + "%" { return makeSymbol(#Symb.MOD); } + "&" { return makeSymbol(#Symb.AND); } + "|" { return makeSymbol(#Symb.OR); } + "!=" { return makeSymbol(#Symb.DIF); } + "<" { return makeSymbol(#Symb.LT); } + ">" { return makeSymbol(#Symb.GT); } + "<=" { return makeSymbol(#Symb.LEQ); } + ">=" { return makeSymbol(#Symb.GEQ); } + + "?" { return makeSymbol(#Symb.QUEST); } + + "==" { return makeSymbol(#Symb.EQ); } + "true" { return makeSymbol(#Symb.BOOL, Boolean.TRUE); } + "false" { return makeSymbol(#Symb.BOOL, Boolean.FALSE); } + "(" { return makeSymbol(#Symb.LPAR); } + ")" { return makeSymbol(#Symb.RPAR); } + "{" { return makeSymbol(#Symb.LBRAC); } + "}" { return makeSymbol(#Symb.RBRAC); } + "," { return makeSymbol(#Symb.COMMA); } + ";" { return makeSymbol(#Symb.SEMICOLON); } + ":" { return makeSymbol(#Symb.COLON); } + "." { return makeSymbol(#Symb.POINT); } + "::" { return makeSymbol(#Symb.POINT); } + "=" { return makeSymbol(#Symb.EQUAL); } + ":=" { return makeSymbol(#Symb.GETS); } + [\"][^\"]*[\"] { String s = yytext(); + return makeSymbol(#Symb.STRING, s.substring(1, s.length() - 1)); } + "'@max_size'" { return makeSymbol(#Symb.MAXSIZE_F); } + "'@private'" { return makeSymbol(#Symb.PRIVATE_F); } + "'@relation'" { return makeSymbol(#Symb.RELATION_F); } + "'@block1'" { return makeSymbol(#Symb.BLOCK1_F); } + "'@block2'" { return makeSymbol(#Symb.BLOCK2_F); } + "'@pool'" { return makeSymbol(#Symb.POOL_F); } + "'@request'" { return makeSymbol(#Symb.REQUEST_F); } + "'@state_action'" { return makeSymbol(#Symb.STATEACTION_F); } + "'@index'" { return makeSymbol(#Symb.INDEX_F); } + "'@delay'" { return makeSymbol(#Symb.DELAY_F); } + "'@payload'" { return makeSymbol(#Symb.PAYLOAD_F); } + "'@channel'" { return makeSymbol(#Symb.CHANNEL_F); } + "'@target'" { return makeSymbol(#Symb.TARGET_F); } + "'@value'" { return makeSymbol(#Symb.VALUE_F); } + "'@statemachine'" { return makeSymbol(#Symb.STATEMACHINE); } + "'@set'" { return makeSymbol(#Symb.SET_TM); } + "'@reset'" { return makeSymbol(#Symb.RESET_TM); } + "'@expire'" { return makeSymbol(#Symb.EXPIRE_TM); } + "'@delayDistributionLaw'" { return makeSymbol(#Symb.DISTRIBUTION_A); } + "'@weight'" { return makeSymbol(#Symb.WEIGHT_A); } + + "'#Relation'" { return makeSymbol(#Symb.RELATION_T); } + "'#Sync_Rel'" { return makeSymbol(#Symb.SYNCREL_T); } + "'#Bfifo_Rel'" { return makeSymbol(#Symb.BFIFOREL_T); } + "'#NBfifo_Rel'" { return makeSymbol(#Symb.NBFIFOREL_T); } + "'#InMessage'" { return makeSymbol(#Symb.INMESSAGE_T); } + "'#OutMessage'" { return makeSymbol(#Symb.OUTMESSAGE_T); } + "'#Channel'" { return makeSymbol(#Symb.CHANNEL_T); } + "'#Fifo'" { return makeSymbol(#Symb.FIFO_T); } + "'#Bfifo'" { return makeSymbol(#Symb.BFIFO_T); } + "'#NBfifo'" { return makeSymbol(#Symb.NBFIFO_T); } + "'#Sync'" { return makeSymbol(#Symb.SYNC_T); } + "'#InSignalBinding'" { return makeSymbol(#Symb.INSIGNALBINDING_T); } + "'#OutSignalBinding'" { return makeSymbol(#Symb.OUTSIGNALBINDING_T); } + + "'start'" { return makeSymbol(#Symb.START_U); } + "'done'" { return makeSymbol(#Symb.DONE_U); } + "start" { return makeSymbol(#Symb.START_U); } + "done" { return makeSymbol(#Symb.DONE_U); } + "'@amount'" { return makeSymbol(#Symb.AMOUNT_U); } + "'#nok_request'" { return makeSymbol(#Symb.NOKREQUEST_U); } + "'#TrivialRequest'" { return makeSymbol(#Symb.TRIVIALREQUEST_T); } + "'#immediate_request'" { return makeSymbol(#Symb.IMMEDIATEREQUEST_U); } + "'#SendRequest'" { return makeSymbol(#Symb.SENDREQUEST_T); } + "'#ReceiveRequest'" { return makeSymbol(#Symb.RECEIVEREQUEST_T); } + "'@msg'" { return makeSymbol(#Symb.MSG_U); } + + "'#AvatarDataType'" { return makeSymbol(#Symb.AVDATATYPE_T); } + "'#AvatarBlock'" { return makeSymbol(#Symb.AVBLOCK_T); } + "'#AvatarVoidMethod'" { return makeSymbol(#Symb.AVVOIDMETHOD_T); } + "'#AvatarCalcMethod'" { return makeSymbol(#Symb.AVCALCMETHOD_T); } + "'#AvatarStandardState'" { return makeSymbol(#Symb.AVSTANDARDSTATE_T); } + "'#AvatarStopState'" { return makeSymbol(#Symb.AVSTOPSTATE_T); } + "'#AvatarStartState'" { return makeSymbol(#Symb.AVSTARTSTATE_T); } + "'#AvatarSendState'" { return makeSymbol(#Symb.AVSENDSTATE_T); } + "'#AvatarReceiveState'" { return makeSymbol(#Symb.AVRECEIVESTATE_T); } + "'#AvatarRandomState'" { return makeSymbol(#Symb.AVRANDOMSTATE_T); } + "'#AvatarCountState'" { return makeSymbol(#Symb.AVCOUNTSTATE_T); } + "'#AvatarPreSendState'" { return makeSymbol(#Symb.AVPRESENDSTATE_T); } + "'#AvatarPreReceiveState'" { return makeSymbol(#Symb.AVPRERECEIVESTATE_T); } + "'#AvatarTransition'" { return makeSymbol(#Symb.AVTRANSITION_T); } + "'#AvatarStateMachine'" { return makeSymbol(#Symb.AVSTATEMACHINE_T); } + "'#ReceiveAction'" { return makeSymbol(#Symb.RECEIVEACTION_T); } + "'#TransitionAction'" { return makeSymbol(#Symb.TRANSITIONACTION_T); } + + "'#AvatarSetTimerState'" { return makeSymbol(#Symb.AVSETTIMERSTATE_T); } + "'#AvatarResetTimerState'" { return makeSymbol(#Symb.AVRESETTIMERSTATE_T); } + "'#AvatarExpireTimerState'" { return makeSymbol(#Symb.AVEXPIRETIMERSTATE_T); } + "'#AvatarSetTimerRequest'" { return makeSymbol(#Symb.SETTIMERREQUEST_T); } + "'#AvatarResetTimerRequest'" { return makeSymbol(#Symb.RESETTIMERREQUEST_T); } + "'#AvatarExpireTimerRequest'" { return makeSymbol(#Symb.EXPIRETIMERREQUEST_T); } + "'#TimerSetMsg'" { return makeSymbol(#Symb.TIMERSETMSG_T); } + "'#TimerResetMsg'" { return makeSymbol(#Symb.TIMERRESETMSG_T); } + "'#TimerExpireMsg'" { return makeSymbol(#Symb.TIMEREXPIREMSG_T); } + "'#AvatarTimer'" { return makeSymbol(#Symb.AVTIMER_T); } + + "'#Assignment'" { return makeSymbol(#Symb.ASSIGNMENT_T); } + "'#bound_random'" { return makeSymbol(#Symb.BOUNDRANDOM_U); } + "Integer" { return makeSymbol(#Symb.INTEGER_T); } + "Boolean" { return makeSymbol(#Symb.BOOLEAN_T); } + "String" { return makeSymbol(#Symb.STRING_T); } + "Real" { return makeSymbol(#Symb.REAL_T); } + + "about" { return makeSymbol(#Symb.ABOUT); } + "abstract" { return makeSymbol(#Symb.ABSTRACT); } + "accept" { return makeSymbol(#Symb.ACCEPT); } + "action" { return makeSymbol(#Symb.ACTION); } + "actor" { return makeSymbol(#Symb.ACTOR); } + "after" { return makeSymbol(#Symb.AFTER); } + "alias" { return makeSymbol(#Symb.ALIAS); } + "all" { return makeSymbol(#Symb.ALL); } + "allocate" { return makeSymbol(#Symb.ALLOCATE); } + "allocation" { return makeSymbol(#Symb.ALLOCATION); } + "analysis" { return makeSymbol(#Symb.ANALYSIS); } + "and" { return makeSymbol(#Symb.AND); } + "as" { return makeSymbol(#Symb.AS); } + "assert" { return makeSymbol(#Symb.ASSERT); } + "assign" { return makeSymbol(#Symb.ASSIGN); } + "assoc" { return makeSymbol(#Symb.ASSOC); } + "assume" { return makeSymbol(#Symb.ASSUME); } + "at" { return makeSymbol(#Symb.AT); } + "attribute" { return makeSymbol(#Symb.ATTRIBUTE); } + "bind" { return makeSymbol(#Symb.BIND); } + "binding" { return makeSymbol(#Symb.BINDING); } + "block" { return makeSymbol(#Symb.BLOCK); } + "by" { return makeSymbol(#Symb.BY); } + "calc" { return makeSymbol(#Symb.CALC); } + "case" { return makeSymbol(#Symb.CASE); } + "comment" { return makeSymbol(#Symb.COMMENT); } + "concern" { return makeSymbol(#Symb.CONCERN); } + "connect" { return makeSymbol(#Symb.CONNECT); } + "connection" { return makeSymbol(#Symb.CONNECTION); } + "constraint" { return makeSymbol(#Symb.CONSTRAINT); } + "decide" { return makeSymbol(#Symb.DECIDE); } + "def" { return makeSymbol(#Symb.DEF); } + "default" { return makeSymbol(#Symb.DEFAULT); } + "defined" { return makeSymbol(#Symb.DEFINED); } + "dependency" { return makeSymbol(#Symb.DEPENDENCY); } + "derived" { return makeSymbol(#Symb.DERIVED); } + "do" { return makeSymbol(#Symb.DO); } + "doc" { return makeSymbol(#Symb.DOC); } + "else" { return makeSymbol(#Symb.ELSE); } + "end" { return makeSymbol(#Symb.END); } + "entry" { return makeSymbol(#Symb.ENTRY); } + "enum" { return makeSymbol(#Symb.ENUM); } + "event" { return makeSymbol(#Symb.EVENT); } + "exhibit" { return makeSymbol(#Symb.EXHIBIT); } + "exit" { return makeSymbol(#Symb.EXIT); } + "expose" { return makeSymbol(#Symb.EXPOSE); } + "filter" { return makeSymbol(#Symb.FILTER); } + "first" { return makeSymbol(#Symb.FIRST); } + "flow" { return makeSymbol(#Symb.FLOW); } + "for" { return makeSymbol(#Symb.FOR); } + "fork" { return makeSymbol(#Symb.FORK); } + "frame" { return makeSymbol(#Symb.FRAME); } + "from" { return makeSymbol(#Symb.FROM); } + "hastype" { return makeSymbol(#Symb.HASTYPE); } + "if" { return makeSymbol(#Symb.IF); } + "implies" { return makeSymbol(#Symb.IMPLIES); } + "import" { yybegin(IMPORTITEM); return makeSymbol(#Symb.IMPORT); } + "in" { return makeSymbol(#Symb.IN); } + "include" { return makeSymbol(#Symb.INCLUDE); } + "individual" { return makeSymbol(#Symb.INDIVIDUAL); } + "inout" { return makeSymbol(#Symb.INOUT); } + "interface" { return makeSymbol(#Symb.INTERFACE); } + "istype" { return makeSymbol(#Symb.ISTYPE); } + "item" { return makeSymbol(#Symb.ITEM); } + "join" { return makeSymbol(#Symb.JOIN); } + "language" { return makeSymbol(#Symb.LANGUAGE); } + "loop" { return makeSymbol(#Symb.LOOP); } + "merge" { return makeSymbol(#Symb.MERGE); } + "message" { return makeSymbol(#Symb.MESSAGE); } + "metadata" { return makeSymbol(#Symb.METADATA); } + "nonunique" { return makeSymbol(#Symb.NONUNIQUE); } + "not" { return makeSymbol(#Symb.NOT); } + "objective" { return makeSymbol(#Symb.OBJECTIVE); } + "occurrence" { return makeSymbol(#Symb.OCCURRENCE); } + "of" { return makeSymbol(#Symb.OF); } + "or" { return makeSymbol(#Symb.OR); } + "ordered" { return makeSymbol(#Symb.ORDERED); } + "out" { return makeSymbol(#Symb.OUT); } + "package" { return makeSymbol(#Symb.PACKAGE); } + "parallel" { return makeSymbol(#Symb.PARALLEL); } + "part" { return makeSymbol(#Symb.PART); } + "perform" { return makeSymbol(#Symb.PERFORM); } + "port" { return makeSymbol(#Symb.PORT); } + "private" { return makeSymbol(#Symb.PRIVATE); } + "protected" { return makeSymbol(#Symb.PROTECTED); } + "public" { return makeSymbol(#Symb.PUBLIC); } + "readonly" { return makeSymbol(#Symb.READONLY); } + "redefines" { return makeSymbol(#Symb.REDEFINES); } + "ref" { return makeSymbol(#Symb.REF); } + "references" { return makeSymbol(#Symb.REFERENCES); } + "render" { return makeSymbol(#Symb.RENDER); } + "rendering" { return makeSymbol(#Symb.RENDERING); } + "rep" { return makeSymbol(#Symb.REP); } + "require" { return makeSymbol(#Symb.REQUIRE); } + "requirement" { return makeSymbol(#Symb.REQUIREMENT); } + "return" { return makeSymbol(#Symb.RETURN); } + "satisfy" { return makeSymbol(#Symb.SATISFY); } + "send" { return makeSymbol(#Symb.SEND); } + "snapshot" { return makeSymbol(#Symb.SNAPSHOT); } + "specializes" { return makeSymbol(#Symb.SPECIALIZES); } + ":>" { return makeSymbol(#Symb.REFINES); } + "stakeholder" { return makeSymbol(#Symb.STAKEHOLDER); } + "state" { return makeSymbol(#Symb.STATE); } + "subject" { return makeSymbol(#Symb.SUBJECT); } + "subsets" { return makeSymbol(#Symb.SUBSETS); } + "succession" { return makeSymbol(#Symb.SUCCESSION); } + "then" { return makeSymbol(#Symb.THEN); } + "timeslice" { return makeSymbol(#Symb.TIMESLICE); } + "to" { return makeSymbol(#Symb.TO); } + "transition" { return makeSymbol(#Symb.TRANSITION); } + "until" { return makeSymbol(#Symb.UNTIL); } + "use" { return makeSymbol(#Symb.USE); } + "variant" { return makeSymbol(#Symb.VARIANT); } + "variation" { return makeSymbol(#Symb.VARIATION); } + "verification" { return makeSymbol(#Symb.VERIFICATION); } + "verify" { return makeSymbol(#Symb.VERIFY); } + "via" { return makeSymbol(#Symb.VIA); } + "view" { return makeSymbol(#Symb.VIEW); } + "viewpoint" { return makeSymbol(#Symb.VIEWPOINT); } + "when" { return makeSymbol(#Symb.WHEN); } + "while" { return makeSymbol(#Symb.WHILE); } + "xor" { return makeSymbol(#Symb.XOR); } + "null" { return makeSymbol(#Symb.NULL); } + + {dataTypeName} { return makeSymbol(#Symb.IDENT, new Ident(AvatarFromSysMLSyntax.DATATYPENAME,yytext())); } + {blockName} { return makeSymbol(#Symb.IDENT, new Ident(AvatarFromSysMLSyntax.BLOCKNAME,yytext())); } + {attributeName} { return makeSymbol(#Symb.IDENT, new Ident(AvatarFromSysMLSyntax.ATTRIBUTENAME,yytext())); } + {relationName} { return makeSymbol(#Symb.IDENT, new Ident(AvatarFromSysMLSyntax.RELATIONNAME,yytext())); } + {channelPreName} { return makeSymbol(#Symb.IDENT, new Ident(AvatarFromSysMLSyntax.CHANNELPRENAME,yytext())); } + {signalName} { return makeSymbol(#Symb.IDENT, new Ident(AvatarFromSysMLSyntax.SIGNALNAME,yytext())); } + {channelName} { return makeSymbol(#Symb.IDENT, new Ident(AvatarFromSysMLSyntax.CHANNELNAME,yytext())); } + {messageName} { return makeSymbol(#Symb.IDENT, new Ident(AvatarFromSysMLSyntax.MESSAGENAME,yytext())); } + {startStateName} { return makeSymbol(#Symb.IDENT, new Ident(AvatarFromSysMLSyntax.CHANNELPRENAME,yytext())); } + {stopStateName} { return makeSymbol(#Symb.IDENT, new Ident(AvatarFromSysMLSyntax.STARTSTATENAME,yytext())); } + {choiceStateName} { return makeSymbol(#Symb.IDENT, new Ident(AvatarFromSysMLSyntax.STANDARDSTATENAME,yytext())); } + {standardStateName} { return makeSymbol(#Symb.IDENT, new Ident(AvatarFromSysMLSyntax.STANDARDSTATENAME,yytext())); } + {randomStateName} { return makeSymbol(#Symb.IDENT, new Ident(AvatarFromSysMLSyntax.RANDOMSTATENAME,yytext())); } + {countStateName} { return makeSymbol(#Symb.IDENT, new Ident(AvatarFromSysMLSyntax.COUNTSTATENAME,yytext())); } + {sendStateName} { return makeSymbol(#Symb.IDENT, new Ident(AvatarFromSysMLSyntax.SENDSTATENAME,yytext())); } + {receiveStateName} { return makeSymbol(#Symb.IDENT, new Ident(AvatarFromSysMLSyntax.RECEIVESTATENAME,yytext())); } + {presendStateName} { return makeSymbol(#Symb.IDENT, new Ident(AvatarFromSysMLSyntax.PRESENDSTATENAME,yytext())); } + {prereceiveStateName} { return makeSymbol(#Symb.IDENT, new Ident(AvatarFromSysMLSyntax.PRERECEIVESTATENAME,yytext())); } + {setTimerStateName} { return makeSymbol(#Symb.IDENT, new Ident(AvatarFromSysMLSyntax.SETTIMERSTATENAME,yytext())); } + {resetTimerStateName} { return makeSymbol(#Symb.IDENT, new Ident(AvatarFromSysMLSyntax.RESETTIMERSTATENAME,yytext())); } + {expireTimerStateName} { return makeSymbol(#Symb.IDENT, new Ident(AvatarFromSysMLSyntax.EXPIRETIMERSTATENAME,yytext())); } + {presetTimerStateName} { return makeSymbol(#Symb.IDENT, new Ident(AvatarFromSysMLSyntax.PRESETTIMERSTATENAME,yytext())); } + {preresetTimerStateName} { return makeSymbol(#Symb.IDENT, new Ident(AvatarFromSysMLSyntax.PRERESETTIMERSTATENAME,yytext())); } + {preexpireTimerStateName} { return makeSymbol(#Symb.IDENT, new Ident(AvatarFromSysMLSyntax.PREEXPIRETIMERSTATENAME,yytext())); } + {timerBlockName} { return makeSymbol(#Symb.IDENT, new Ident(AvatarFromSysMLSyntax.TIMERBLOCKNAME,yytext())); } + {fieldName} { return makeSymbol(#Symb.IDENT, new Ident(AvatarFromSysMLSyntax.QUOTEDNAME,yytext())); } + {AvIdent} { return makeSymbol(#Symb.IDENT, new Ident(AvatarFromSysMLSyntax.AVATARNAME,yytext())); } + "'"{AvIdent}"'" { return makeSymbol(#Symb.IDENT, new Ident(AvatarFromSysMLSyntax.AVATARNAME,yytext())); } + "'"[^']+"'" { String s = yytext(); + return makeSymbol(#Symb.ANYNAME, s.substring(1, s.length() - 1)); } + . { setErrorLocation(new Location(yyline, yycolumn)); + throw new Exception ("unexpected character in expression"); } +} + + diff --git a/src/main/java/avatartranslator/tosysmlv2/javacup/compile b/src/main/java/avatartranslator/tosysmlv2/javacup/compile new file mode 100755 index 0000000000000000000000000000000000000000..3dbee88ea266a8ede84b5d468e401a8916dafbc9 --- /dev/null +++ b/src/main/java/avatartranslator/tosysmlv2/javacup/compile @@ -0,0 +1,22 @@ +#!/bin/sh + +JFLEX_FILE="Avatar2SysMLLexer.jflex" +JAVACUP_FILE="Avatar2SysMLParser.jcup" +LEXER_CLASS="Avatar2SysMLLexer" +PARSER_CLASS="Avatar2SysMLParser" +SYMBOL_CLASS="Avatar2SysMLSymbols" + +sed "s/LexerClassName/$LEXER_CLASS/g" $JFLEX_FILE > __${LEXER_CLASS}2__.jflex +sed "s/#Symb/$SYMBOL_CLASS/g" __${LEXER_CLASS}2__.jflex > __${LEXER_CLASS}__.jflex + +jflex __${LEXER_CLASS}__.jflex +rm __${LEXER_CLASS}__.jflex __${LEXER_CLASS}2__.jflex +sed "s/<tt>/<code>/g" ${LEXER_CLASS}.java > __${LEXER_CLASS}2__.java +sed "s/<\/tt>/<\/code>/g" __${LEXER_CLASS}2__.java > ${LEXER_CLASS}.java +rm __${LEXER_CLASS}2__.java +sed "s/LexerClassName/$LEXER_CLASS/g" $JAVACUP_FILE > __${PARSER_CLASS}2__.jcup +sed "s/ParserClassName/$PARSER_CLASS/g" __${PARSER_CLASS}2__.jcup > __${PARSER_CLASS}__.jcup +java-cup -dump -nonterms -parser $PARSER_CLASS -symbols $SYMBOL_CLASS __${PARSER_CLASS}__.jcup 2> truc + +rm __${PARSER_CLASS}__.jcup __${PARSER_CLASS}2__.jcup *~ +mv $LEXER_CLASS.java $PARSER_CLASS.java $SYMBOL_CLASS.java .. diff --git a/src/main/java/avatartranslator/tosysmlv2/javacup/compile2 b/src/main/java/avatartranslator/tosysmlv2/javacup/compile2 new file mode 100755 index 0000000000000000000000000000000000000000..1542c8fd8925f4a145d1886ebbf6a25405c29167 --- /dev/null +++ b/src/main/java/avatartranslator/tosysmlv2/javacup/compile2 @@ -0,0 +1,22 @@ +#!/bin/sh + +JFLEX_FILE="AvatarFromSysML.jflex" +JAVACUP_FILE="AvatarFromSysML.jcup" +LEXER_CLASS="AvatarFromSysMLLexer" +PARSER_CLASS="AvatarFromSysMLParser" +SYMBOL_CLASS="AvatarFromSysMLSymbols" + +sed "s/LexerClassName/$LEXER_CLASS/g" $JFLEX_FILE > __${LEXER_CLASS}2__.jflex +sed "s/#Symb/$SYMBOL_CLASS/g" __${LEXER_CLASS}2__.jflex > __${LEXER_CLASS}__.jflex + +jflex __${LEXER_CLASS}__.jflex +rm __${LEXER_CLASS}__.jflex __${LEXER_CLASS}2__.jflex +sed "s/<tt>/<code>/g" ${LEXER_CLASS}.java > __${LEXER_CLASS}2__.java +sed "s/<\/tt>/<\/code>/g" __${LEXER_CLASS}2__.java > ${LEXER_CLASS}.java +rm __${LEXER_CLASS}2__.java +sed "s/LexerClassName/$LEXER_CLASS/g" $JAVACUP_FILE > __${PARSER_CLASS}2__.jcup +sed "s/ParserClassName/$PARSER_CLASS/g" __${PARSER_CLASS}2__.jcup > __${PARSER_CLASS}__.jcup +java-cup -dump -nonterms -locations -parser $PARSER_CLASS -symbols $SYMBOL_CLASS __${PARSER_CLASS}__.jcup 2> truc + +rm __${PARSER_CLASS}__.jcup __${PARSER_CLASS}2__.jcup *~ +mv $LEXER_CLASS.java $PARSER_CLASS.java $SYMBOL_CLASS.java .. diff --git a/src/main/java/avatartranslator/tosysmlv2/package-info.java b/src/main/java/avatartranslator/tosysmlv2/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..9574a808dc75d5ed74adcebe69834908da1e227c --- /dev/null +++ b/src/main/java/avatartranslator/tosysmlv2/package-info.java @@ -0,0 +1,358 @@ + /* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille + * + * ludovic.apvrille AT enst.fr + * + * This software is a computer program whose purpose is to allow the + * edition of TURTLE analysis, design and deployment diagrams, to + * allow the generation of RT-LOTOS or Java code from this diagram, + * and at last to allow the analysis of formal validation traces + * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP + * from INRIA Rhone-Alpes. + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + */ + +/** + * Package intboolsolver, a generic modular parser/evaluator for + * boolean/integer expressions with variables. + * Creation: 11/04/2023. + * + * <p> This package (IntBoolSolver or IBS) provides a way to parse and + * evaluate boolean/integer expressions. The handling of variables is + * parametrized (thus it can be instantiated in different contexts). The + * package is modular in the sense that expression structure or parsing + * algorithm can be changed without having to modify other components. </p> + * + * <p> The solver may be instantiated by usual expressions with variables + * and their usual evaluation, but it is more generally dedicated to + * two-level structured systems, i.e global specifications build over + * a set of components. Identifiers can be associated to components or + * to specifications. The solver also handles a notion of component/specification + * state that can be interpreted as state machine state. </p> + * <p> To instantiate this generic system, trivial parameters can be used + * when targeting solvers that do not use all the features, such as for example + * a solver for closed expressions (which is provided).</p> + * <ul> + * <li> <p>{@link myutil.intboolsolver.IBSParserAPI + * IBSParserAPI} provides documentation about the functions + * exported by the provided parser instances.</p> + * <p> The way leaves are handled depends on the notions of specification, + * component, specification state, component state and (state machine) + * state of the instance. Thus the corresponding classes are parameters + * of the generic parser.</p> + * <p> The handling of variables relies on an "<b>attribute class</b>" that + * must be provided for each instance (partial implementation is + * provided).</p> + * <p> The parser also relies on an "<b>expression class</b>" which + * implements the structure of the expressions build by the parser (full + * implementations is provided)</p> + * <p> {@link myutil.intboolsolver.IBSStdParser IBSStdParser}, + * {@link myutil.intboolsolver.IBSStdLexer IBSStdLexer} and + * {@link myutil.intboolsolver.IBSStdSymbols IBSStdSymbol} are classes + * generated by a <a href="#javacup">java-cup/jflex parser </a> (sources + * in the "javacup" subdirectory) that implements + * {@link myutil.intboolsolver.IBSParserAPI IBSParserAPI}. + * The additional interface {@link myutil.intboolsolver.IBSScanner + * IBSScanner} abstracts the lexers required by IBS, allowing to make + * them a parameter of the parser. + * </p> + * </li> + * <li> <p>{@link myutil.intboolsolver.IBSExpressions IBSExpressions} + * describes the interface expected for expression handling. It contains two + * kind of methods: methods for building expressions (required by parsing) + * and methods for evaluating expressions (useful for final user, but also + * available for parser implementations).</p> + * <p>{@link myutil.intboolsolver.IBSStdExpressions + * IBSStdExpressions} is a full implementation of {@link + * myutil.intboolsolver.IBSExpressions IBSExpressions}. + * Its classical structure is easy to extend (for example by adding + * operators). W.r.t. {@link myutil.intboolsolver.IBSExpressions + * IBSExpressions}, it provides additional features such as tools + * to identify expression kinds and to access sub-expressions.</p> + * <li> <p>{@link myutil.intboolsolver.IBSAttributes IBSAttributes} + * describes the interface required from the attribute class that must be + * provided for instantiation. It also provides some data shared by all + * instances (some constants and a technical classes). Roughly speaking, + * this class provides an interpretation for variables.</p> + * <p>{@link myutil.intboolsolver.IBSStdAttributes + * IBSStdAttributes} extends {@link + * myutil.intboolsolver.IBSAttributes IBSAttributes}. It + * provides a partial implementation so that instances just have + * to provide low level methods.</p> + * <li><p>{@link myutil.intboolsolver.IBSParamSpec IBSParamSpec}, + * {@link myutil.intboolsolver.IBSParamComp IBSParamComp}, + * {@link myutil.intboolsolver.IBSParamState IBSParamState}, + * {@link myutil.intboolsolver.IBSParamSpecState IBSParamSpecState} + * and {@link myutil.intboolsolver.IBSParamCompState IBSParamCompState} are + * trivial classes used for technical reasons. The corresponding concrete + * classes provided for instantiation must extend them. They are the type + * of the parameters of the generic parser. Thus to instantiate a parser we + * have to provide:</p> + * <ul> + * <li> <p>a {@code Spec} class, which <b>must implement</b> {@link + * myutil.intboolsolver.IBSParamSpec IBSParamSpec}: the class of + * global system specifications, which intuitively associates + * structures to specification level variables.</p> + * </li> + * <li> <p>a {@code Comp} class, which <b>must implement</b> {@link + * myutil.intboolsolver.IBSParamComp IBSParamComp}: the class + * of system components, which intuitively associates + * structures to component level variables.</p> + * </li> + * <li> <p>a {@code State} class, which <b>must implement</b> + * {@link myutil.intboolsolver.IBSParamState IBSParamState}: + * a class of states. In provided extension + * {@link myutil.intboolsolver.IBSStdAttributes IBSStdAttributes}, + * these states are state machine states associated to components. + * </p> + * </li> + * <li> <p>a {@code SpecState} class, which <b>must implement</b> + * {@link myutil.intboolsolver.IBSParamSpecState + * IBSParamSpecState}: the class of specification state, which + * associates int/bool values to specification level variables.</p> + * </li> + * <li> <p>a {@code CompState} class, which <b>must implement</b> + * {@link myutil.intboolsolver.IBSParamCompState + * IBSParamCompState}: the class of component states, which + * * associates int/bool values to component level variables.</p> + * </li> + * </ul> + * <p><b>WARNING!!</b> A successful instantiation requires that + * class <i>xxx</i> (with <i>xxx</i> among {@code Spec}, {@code Comp}, + * {@code SpecState}, {@code CompState} and {@code State}) does + * not implement any IBS<i>yyy</i>Param with <i>yyy</i> + * ≠ <i>xxx</i>.</p> + * <p> Trivial implementations of {@link myutil.intboolsolver.IBSParamSpec + * IBSParamSpec}, + * {@link myutil.intboolsolver.IBSParamComp IBSParamComp}, + * {@link myutil.intboolsolver.IBSParamState IBSParamState}, + * {@link myutil.intboolsolver.IBSParamSpecState IBSParamSpecState} + * and + * {@link myutil.intboolsolver.IBSParamCompState IBSParamCompState} + * (i.e. classes with empty code) can be used to + * instantiate solvers that do not implement the corresponding concepts.</p> + * </li><li> + * To make the use of the IBS system easier (in particular hide casts), + * wrapper classes can be written, as illustrated in the provided IBS + * instances. + * </li> + * + * </ul> + * <p><a id="instanciation_sumary"> <b>Instantiation summary:</b></a></p> + * <ol> + * <li><p> provide {@code Spec}, {@code Comp}, {@code SpecState}, + * {@code CompState} and {@code State} from application. These classes + * just have to extend their associated parameter IBS<i>xxx</i>Param + * and not extend any other IBS<i>yyy</i>Param (with + * <i>xxx</i> ≠ <i>yyy</i>)</p> + * </li> + * <li> <p> provide an implementation {@code Attribs} of + * {@link myutil.intboolsolver.IBSAttributes IBSAttributes} or + * {@link myutil.intboolsolver.IBSStdAttributes + * IBSStdAttributes}, and instanciate it with the chosen {@code Spec}, + * {@code Comp}, {@code SpecState}, {@code CompState} and {@code State}.</p> + <PRE> + known from context (package, imports): intboolsolver, + Spec, Comp, SpecState, CompState, State + + public class Attribs + extends IBS[Std]Attributes <Spec,Comp,SpecState,CompState,State> { + + !!! put implementation of IBS[Std]Attributes here + } + * </PRE> + * </li> + * <li> <p>build expression class <code>Exprs</code> for your instance, ie. + * for example instantiate {@link myutil.intboolsolver.IBSStdExpressions + * IBSStdExpressions}:</p> + <PRE> + known from context (package, imports): intboolsolver, + Spec, Comp, SpecState, CompState, State + + public class Exprs + extends IBSStdExpressions <Spec,Comp, SpecState, CompState, State> { + + public Exprs(){} + + !!! optionnal additionnal features here + } + * </PRE> + * <p>Note that if you want to add features to the inner class <code>Expr</code>, + * you have to directly modify {@link myutil.intboolsolver.IBSStdExpressions + * IBSStdExpressions}.</p> + * </li> + * <li> <p>build the parser <code>Parser</code> for your instance, ie. + * instantiate an implementation of the generic parser:</p> + * <PRE> + * known from context (package, imports): intboolsolver, + * Spec, Comp, SpecState, CompState, State + * + * public class Parser + * extends IBSParserImpl <Spec,Comp, SpecState, CompState, State> { + * + * public Parser() { super(new Attrs(),new Exprs()); } + * public Parser(Attrs _a, Exprs _e) { super(_c,_e); } + * + * !!! optional additional features here + * } + * </PRE> + * <p>Note: for the JavaCUP/Jflex parser, the scanner must also be provided + * (see <a href="#javacup">here </a>). {@link myutil.intboolsolver.IBSStdParser + * IBSStdParser} is the provided JavaCUP/Jflex implementation.</p> + * </li> + * <li> <p>Subpackage intboolsolver/closedformula contains a complete instantiation + * for closed formulas. This instantiation is trivial as behaviours for closed + * formulas are the default ones.This instantiation is made of + * {@link myutil.intboolsolver.closedformula.IBSClosedComp IBSClosedComp}, + * {@link myutil.intboolsolver.closedformula.IBSClosedSpec IBSClosedSpec}, + * {@link myutil.intboolsolver.closedformula.IBSClosedState IBSClosedState}, + * {@link myutil.intboolsolver.closedformula.IBSClosedCompState IBSClosedCompState}, + * {@link myutil.intboolsolver.closedformula.IBSClosedSpecState IBSClosedSpecState}, + * {@link myutil.intboolsolver.closedformula.IBSClosedFormulaAttributes IBSClosedFormulaAttributes}, + * {@link myutil.intboolsolver.closedformula.IBSClosedFormulaExpressions IBSClosedFormulaExpressions}, + * {@link myutil.intboolsolver.closedformula.IBSClosedFormulaParser IBSClosedFormulaParser}.</p> + * <p>Finally, two wrapper classes are provided that make all features available in + * a single classe and do most of the instance related casts. + * {@link myutil.intboolsolver.closedformula.IBSClosedFormulaSolver IBSClosedFormulaSolver} is + * a static instance of the system that that can be used from anywhere. It is not thread safe. + * {@link myutil.intboolsolver.closedformula.IBSClosedFormula IBSClosedFormula} is dynamic and thus + * must be used through objects. It is then thread safe but be careful: the class is quite big... + * Note that not all features are wrapped in these classes. In particular, some additional features + * are in {@link myutil.intboolsolver.closedformula.IBSClosedFormulaExpressions + * IBSClosedFormulaExpressions}</p> + * </li> + * <li> <p>There is also an instance dedicated to AVATAR structures, which can be found as an "intboolsolver" + * subpackage of the avatartranslator package of TTool</p></li> + * </ol> + * <p><a id="instanciation_use"> <b>Typical use of an instantiated parser (without wrapper classes):</b></a></p> + * <PRE> + * public Parser parser = new Parser(new Attribs(),new Exprs()); + * Exprs.BExpr e = (Exprs.BExpr) parser.parseBool("10 + 15 >= 20"); + * boolean b = e.eval(); + * ... + * </PRE> + * <p></p> + * <hr> + * <p><a id="javacup"> <b>The JavaCUP/JFlex provided parser</b></a></p> + * <p>A classical JavaCUP/JFlex parser is provided. Sources are in the subdirectory + * "javacup" of the intboolsolver package. A script <code>compile</code> is provided to + * generate the java code from the source. It relies on <code>sed</code> to make the + * small modifyings that cannot be made directly by the generating tools. + * Moreover by setting the variables at the beginning of the script, + * several different parsers and lexers can be produced (obviously, a lexer can only + * be coupled with a parser that defines all the symbols it uses)</p> + * <p>Notice that executing this script requires that javacup and jflex jar files + * be in the {@code CLASSPATH} environment variable (generally java-cup.jar or + * java_cup.jar and jflex.jar).</p> + * <p> In fact, two javacup parsers are provided (IBSStdParser.jcup and + * IBSOptParser.jcup). They both recognise the same set of usual boolean and integer + * expressions. The difference is that IBSOptParser implements constant propagation + * while parsing, which may simplify expression, while IBSStdParser does not and thus + * globally preserves original structure (provided that expression building primitives + * do)</p> + * + * <i>Script variables : </i> + * <ul><li><code>JFLEX_FILE</code>: the lexer jflex source file + * </li><li><code>JAVACUP_FILE</code>: the parser java-cup source file + * </li><li><code>LEXER_CLASS</code>: the class-and-file name of the generated lexer + * </li><li><code>PARSER_CLASS</code>: the class-and-file name of the generated parser + * </li><li><code>SYMBOL_CLASS</code>: the class-and-file name of the set of symbols + * generated by the parser and used by the lexer. + * </li></ul> + * <p> The script replaces tags in sources by the parameters provided in variables. + * Moreover it restore in the resulting java files the generic parameters that are not + * correctly handled by java-cup and jflex.</p> + * <ul><li> + * in the lexer source file, <code>IBSLexerClassName</code> is replaced by + * <code>LEXER_CLASS</code> and <code>IBSFlex#Symb</code> is replaced by + * <code>SYMBOL_CLASS</code>. After generation, the generic parameters + * of the lexer class are added in the lexer java file (<code>< Spec extends + * IBSParamSpec, Comp extends IBSParamComp, State extends IBSParamState, + * SpecState extends IBSParamSpecState, CompState extends IBSParamCompState + * ></code>) + * </li><li> + * the generic parameters + * of the parser class are added in the parser generated java file (<code>< + * Spec extends IBSParamSpec, Comp extends IBSParamComp, State extends + * IBSParamState, SpecState extends IBSParamSpecState, CompState extends + * IBSParamCompState ></code>) + * </li></ul> + * <p>As an example, the instantiation of the standard JFlex/javaCUP parser + * for Avatar : </p> + * <PRE> +public class AvatarIBSStdParser extends IBSStdParser< + AvatarSpecification, + AvatarBlock, + AvatarStateMachineElement, + SpecificationState, + SpecificationBlock> { + public AvatarIBSStdParser(AvatarIBSAttributes _a, AvatarIBSExpressions _e) { + super(); + setLexer(new IBSStdLexer< + AvatarSpecification, + AvatarBlock, + AvatarStateMachineElement, + SpecificationState, + SpecificationBlock>()); + setAttributes(_a); + setExpressions(_e); + } +} + </PRE> + * <p>Tech : the parser methods setAttributes and setExpressions modify + * the lexer as these classes are saved as member of the lexer and not + * as direct member of the parser. Thus these two methods must be called + * each time the lexer is set.</p> + * + * @version 1.0 11/04/2023 + * @author Sophie Coudert + */ +/** This package implements the generation of SysML V2 textual models from Avatar Models + * and the building of Avatar Models from SysML V2 textual models that respect the + * structure of Avatar (in fact a strongly constrained sub-language of SysML V2. + * <ul> + * <li>Avatar2SysML: generation of SysML V2 models from Avatar Models. This rely on + * <ul> + * <li> The content of the directory "static": libraries for Avatar SysML models</li> + * <li> Avatar2SysMLNames : generates names from Avatar idents that avoid any + * name clash with SysML keywords or fieldname in used SysML libraries </li> + * <li> A parser/lexer couple used to convert Avatar int/bool expressions into + * SysML int/bool expressions </li> + * </ul> + * </li> <li> AvatarFromSysML: building of Avatar Models from Avatar-compatible + * SysML V2 models + * <ul> + * <li> A parser/lexer couple builds an abstract syntax tree. The structures + * used for these trees are defined in AvatarSysMLSyntax.</li> + * <li>AvatarFromSysML then builds an Avatar Model from this abstract + * syntax tree.</li> + * <li> AvatarFromSysMLError is the format for errors collected during this + * process (a list of errors is available at the end of the process) </li> + * </ul> + * </ul> + */ +package avatartranslator.tosysmlv2; \ No newline at end of file diff --git a/src/main/java/avatartranslator/tosysmlv2/static/AvatarBlockTypes.sysml b/src/main/java/avatartranslator/tosysmlv2/static/AvatarBlockTypes.sysml new file mode 100644 index 0000000000000000000000000000000000000000..4a2a4e8669687e8d4677cdc687eac5c9018d11dc --- /dev/null +++ b/src/main/java/avatartranslator/tosysmlv2/static/AvatarBlockTypes.sysml @@ -0,0 +1,183 @@ +package AvatarBlockTypes { + private import AvatarGeneral::*; + private import AvatarCommunication::*; + private import AvatarTransitionServer::*; + private import States::*; + + abstract attribute def '#AvatarDataType'; + part def '#AvatarBlock'{ + item localClock : Clock redefines localClock = systemClock ; + } + abstract action def '#AvatarMethod'; + action def '#AvatarVoidMethod' :> '#AvatarMethod'; + calc def '#AvatarCalcMethod' :> '#AvatarMethod'; + state def '#AvatarStateMachine'{ + item localClock : Clock redefines localClock = systemClock ; + } + action def '#ReceiveAction'; + action def '#TransitionAction'; + + abstract state def '#AvatarState' { + protected item '@pool'[0..*] : '#Request' default '#immediate_request'; + protected action '@state_action' default '#nop'; + + item localClock : Clock redefines localClock = systemClock ; + + // the request '@pool' + private state the_state : '#AvatarState' = self; + private part request_pool : '#RequestPool'{ + occurrence requestor : '#AvatarState' redefines requestor = the_state; + public item pool[0..*] redefines pool = the_state.'@pool'; + } + out item response : '#Response' := '#default_response'; + entry action { + perform '@state_action'; + then action if request_pool.pool != null & request_pool.pool != '#immediate_request'{ + first start; + then action subsets '#transitionRequestServer'.submit { + in request_pool redefines request_pool = request_pool; + } + then action receive accept response : '#Response' via the_state; + then assign response := receive.response; + then done; + } + then done; + } + } + state def '#AvatarStandardState' :> '#AvatarState'{ + private action '@state_action' redefines '@state_action' = '#nop'; + protected item '@pool'[0..*] redefines '@pool' default '#immediate_request'; + } + state def '#AvatarStopState' :> '#AvatarState'{ + private action '@state_action' redefines '@state_action' = '#nop'; + private item '@pool'[0] redefines '@pool' = null; + } + state def '#AvatarStartState' :> '#AvatarState'{ + private action '@state_action' redefines '@state_action' = '#nop'; + protected item '@request'[1] redefines '@pool' default '#immediate_request'; + } + + abstract state def '#AvatarCommunicationState' :> '#AvatarState'{ + private action '@state_action' redefines '@state_action' = '#nop'; + protected item '@request'[1] redefines '@pool' default '#immediate_request'; + } + state def '#AvatarSendState' :> '#AvatarCommunicationState'; + state def '#AvatarReceiveState' :> '#AvatarCommunicationState'; + state def '#AvatarRandomState' :> '#AvatarState' { + protected item '@request'[1] redefines '@pool' default '#immediate_request'; + } + state def '#AvatarCountState' :> '#AvatarState' { + protected item '@request'[1] redefines '@pool' default '#immediate_request'; + } + abstract state def '#AvatarPreCommunicationState' :> '#AvatarState' { + private action '@state_action' redefines '@state_action' = '#nop'; + protected item '@request'[1] redefines '@pool' default '#immediate_request'; + } + state def '#AvatarPreSendState' :> '#AvatarPreCommunicationState'; + state def '#AvatarPreReceiveState' :> '#AvatarPreCommunicationState'; + + action def '#AvatarTransition' :> StateTransitionAction { + attribute '@index' : Positive = (transitionLinkSource as '#AvatarState').response.'@index'; + item '@payload' : '#Message' = (transitionLinkSource as '#AvatarState').response.'@payload'; + } + + + // states, requests and messages specializations for timers + + state def '#AvatarSetTimerState' :> '#AvatarSendState'; + state def '#AvatarResetTimerState' :> '#AvatarSendState'; + state def '#AvatarExpireTimerState' :> '#AvatarReceiveState'; + + part def '#AvatarSetTimerRequest' :> '#SendRequest'; + part def '#AvatarResetTimerRequest' :> '#SendRequest'; + part def '#AvatarExpireTimerRequest' :> '#ReceiveRequest'; + + part def '#TimerSetMsg' :> '#DataMessage' { attribute value : Integer; } + part def '#TimerResetMsg' :> '#DataMessage'; + part def '#TimerExpireMsg' :> '#DataMessage'; + + // Block type for timers + part def '#AvatarTimer' :> '#AvatarBlock' { + + private attribute value : Integer := 0; + + private part t_rel: '#Sync_Rel'; + part '@set' : '#Sync' = '#Sync'('@relation' = t_rel); + part '@reset' : '#Sync' = '#Sync'('@relation' = t_rel); + part '@expire' : '#Sync' = '#Sync'('@relation' = t_rel); + + // state-machine ------------------- + exhibit state '@statemachine' : '#AvatarStateMachine' { + + entry action startstate :'#AvatarStartState'; + + transition : '#AvatarTransition' first startstate + then st_wait4set; + + state st_wait4set : '#AvatarStandardState' = '#AvatarStandardState'( + '@pool' = ( + '#ReceiveRequest'('@channel'= '@set'), + '#ReceiveRequest'('@index' = 2,'@channel'= '@reset') ) + ); + + transition : '#AvatarTransition' first st_wait4set if '@index' == 1 + do action : '#ReceiveAction' { + item msg : '#TimerSetMsg' = '@payload' as '#TimerSetMsg'; + first start; then assign value := msg.value; then done; + } then rcv_set_0; + + transition : '#AvatarTransition' first st_wait4set if '@index' == 2 + then rcv_reset_2; + + state st_wait4expire : '#AvatarStandardState' = '#AvatarStandardState'( + '@pool' = ( + '#ReceiveRequest'('@channel'= '@set'), + '#SendRequest'( + '@index' = 2, + '@channel'= '@expire', + '@delay' = value, + '@payload' = '#TimerExpireMsg'() + ), + '#ReceiveRequest'('@index' = 3,'@channel'= '@reset') + ) + ); + + transition : '#AvatarTransition' first st_wait4expire if '@index' == 1 + do action : '#ReceiveAction' { + item msg : '#TimerSetMsg' = '@payload' as '#TimerSetMsg'; + first start; then assign value := msg.'value'; then done; + } then rcv_set_1; + + transition : '#AvatarTransition' first st_wait4expire if '@index' == 2 + then snd_expire_0; + + transition : '#AvatarTransition' first st_wait4expire if '@index' == 3 + then rcv_reset_3; + + state rcv_set_0 : '#AvatarReceiveState'; + + transition : '#AvatarTransition' first rcv_set_0 + then st_wait4expire; + + state rcv_set_1 : '#AvatarReceiveState'; + + transition : '#AvatarTransition' first rcv_set_1 + then st_wait4expire; + + state rcv_reset_2 : '#AvatarReceiveState'; + + transition : '#AvatarTransition' first rcv_reset_2 + then st_wait4set; + + state rcv_reset_3 : '#AvatarReceiveState'; + + transition : '#AvatarTransition' first rcv_reset_3 + then st_wait4set; + + state snd_expire_0 : '#AvatarSendState'; + + transition : '#AvatarTransition' first snd_expire_0 + then st_wait4set; + } + } +} diff --git a/src/main/java/avatartranslator/tosysmlv2/static/AvatarCommunication.sysml b/src/main/java/avatartranslator/tosysmlv2/static/AvatarCommunication.sysml new file mode 100644 index 0000000000000000000000000000000000000000..9cf3d4b76104ce37ac84db3a44bb4ba1e33510f3 --- /dev/null +++ b/src/main/java/avatartranslator/tosysmlv2/static/AvatarCommunication.sysml @@ -0,0 +1,148 @@ +// AVATAR COMMUNICATION: RELATIONS, MESSAGES AND CHANNELS %%%%%%%%%%%%%% + +package AvatarCommunication { + private import AvatarGeneral::*; + private import AvatarBlockTypes::*; + private import Links::SelfLink; + +// AVATAR COMMUNICATION RELATIONS ====================================== + + abstract part def '#Relation' { + doc /* #Relation correspond to Avatar Relation Class. They provide avatar communication + * channels with types (blocking/non blocking fifos or synchroneous channels). Avatar + * relations have two end blocks but this is not usefull in our SysML modeling, thus + * it will be true in instances but not required by SysML #Relation description. + * Avatar AMS relations are not modeled. Broadcast is removed before generation and + * thus not appear here. Relations may also make channels private. + */ + comment RelationPartition about '#Sync_Rel', '#Fifo_Rel', '#Relation' + /* #Sync_Rel, #Fifo_Rel is a partition of #Relation */ + // attribute source + attribute '@private' : Boolean default false; + part '@block1' : '#AvatarBlock'; + part '@block2' : '#AvatarBlock'; + + } + + part def '#Sync_Rel' :> '#Relation' { + doc /* #Sync_Rel correspond to Avatar synchroneous relations */ + } + + abstract part def '#Fifo_Rel' :> '#Relation' { + doc /* #Fifo_Rel define Avatar asynchroneous relations, i.e., they label fifo channels */ + comment Fifo_Rel_Partition about '#Fifo_Rel', '#Bfifo_Rel', '#NBfifo_Rel' + /* #Bfifo_Rel, #NBfifo_Rel is a partition of #Fifo_Rel */ + readonly attribute '@lossy' : Boolean default false; + readonly attribute '@max_size': Positive default 1; + assert constraint { '@max_size' > 0 } + } + + part def '#Bfifo_Rel' :> '#Fifo_Rel'{ + doc /* #BFifo_Rel correspond to fifos with blocking send */ + } + + part def '#NBfifo_Rel' :> '#Fifo_Rel'{ + doc /* #NBFifo_Rel correspond to fifos with non-blocking send */ + } + +// AVATAR COMMUNICATION MESSAGES ========================================== + + abstract item def '#Message' { + doc /* the type of all messages */ + comment MessagePartition about '#AckMessage', '#DataMessage'//, '#Channel', '#ack' + /* Channels convey messages that can be either data messages or the (unique) + * acknowledgment message (Partition) + */ + } + + individual item def '#AckMessage' :> '#Message' { doc /* A single acknowledgment message is sufficient */ } + + part def '#DataMessage' :> '#Message' { doc /* Data messages are used to exchange data between tasks */ } + part def '#InMessage' :> '#DataMessage'; + part def '#OutMessage' :> '#InMessage'; + + individual item '#ack_message' : '#AckMessage' { doc /* the (single) acknowledgment message */ } + + + +// AVATAR COMMUNICATION CHANNELS ========================================== + + abstract part def '#Channel' { + doc /* Communication channels are typed by relations */ + readonly part '@relation' : '#Relation'; + } + + /* Fifos have a list as internal state and usual behaviour */ + abstract part def '#Fifo' :> '#Channel' { + + readonly part '@relation' : '#Fifo_Rel' redefines '@relation'; + private item fifo : '#Message'[0..*] ordered nonunique := null ; + assert constraint { size(fifo) <= '@relation'.'@max_size' } + + calc '@amount' { return : Positive := size(fifo); } + + calc can_get { return : Boolean; notEmpty(fifo) } + calc can_put { return : Boolean; size(fifo) < '@relation'.'@max_size' } + + calc get { + doc /* remove head of fifo and return it */ + return result : '#Message' redefines result; + snapshot start redefines start { assert constraint { can_get() } } + then action assign result := head(fifo); + then action assign fifo := tail(fifo); + then done; + } + + action put { + doc /* add message at end of fifo. if the fifo is full the message is discarded */ + in 'message' : '#Message'; + + first start then begin; + + decide begin; + if can_put() then do_put; + else done; + + decide do_put; + if '@relation'.'@lossy' then may_loss; + else enqueue; + + decide may_loss; // random choice + then done; + then enqueue; + + action enqueue : addAt { + inout seq = fifo; + in values = 'message'; + in startIndex = size(fifo)+1; + } + then done; + } + } + + part def '#Bfifo' :> '#Fifo' { + public readonly item '@relation' : '#Bfifo_Rel' redefines '@relation'; + action put redefines put { snapshot start redefines start { assert constraint { can_put() } } } + } + + part def '#NBfifo' :> '#Fifo' { + public readonly item '@relation' : '#NBfifo_Rel' redefines '@relation'; + } + + part def '#Sync' :> '#Channel' { + public readonly item '@relation' : '#Sync_Rel' redefines '@relation'; + } + + comment Channel_Partition about '#Bfifo', '#NBfifo', '#Sync' + /* #Bfifo, #NBfifo, #Sync is a partition of #Channel. + Disjointness is ensured by #Fifo_Rel and #Channel partitions */ + + connection def '#InSignalBinding' :> SelfLink { + end part sameThing : '#Channel' redefines sameThing; + end part thisThing : '#Channel' redefines thisThing; + } + connection def '#OutSignalBinding' :> SelfLink { + end part sameThing : '#Channel' redefines sameThing; + end part thisThing : '#Channel' redefines thisThing; + } +} \ No newline at end of file diff --git a/src/main/java/avatartranslator/tosysmlv2/static/AvatarGeneral.sysml b/src/main/java/avatartranslator/tosysmlv2/static/AvatarGeneral.sysml new file mode 100644 index 0000000000000000000000000000000000000000..fd666669d8977588145c7b87c857d1679a7f9ec4 --- /dev/null +++ b/src/main/java/avatartranslator/tosysmlv2/static/AvatarGeneral.sysml @@ -0,0 +1,174 @@ +package AvatarGeneral { + public import Base::Anything; + public import ScalarValues::Positive; + public import ScalarValues::Integer; + public import ScalarValues::Boolean; + public import ScalarValues::String; + public import ScalarValues::Real; + public import Occurrences::HappensJustBefore; + public import SequenceFunctions::*; + public import Clocks::Clock; + + // Assignment ======================================= + action def '#Assignment' { + inout '@target' : Anything[0..*] nonunique; + in '@value' : Anything[0..*] nonunique; + first start; then assign '@target':= '@value'; then done; + } + + // SETS AND RANDOMS ============================================================= + + calc '#bound_random' { + doc /* A primitive to get a random number between two bounds */ + + in low : Integer; + in high : Integer; + return result: Integer; + snapshot start redefines start {assert constraint { low <= high }} + snapshot done redefines done {assert constraint { result >= low & result <= high }} + } + + calc def '#Unary_predicate' { + doc /* A unary predicate is a predicate with one single parameter */ + in parameter : Anything; + return result : Boolean; + } + + action def '#Unary_action' { + doc /* A unary action is an action with one single parameter */ + in parameter : Anything; + } + + calc '#identity' { + doc /* To build a predicate that tests if a value is equal to another one */ + in tgt : Anything; + return : '#Unary_predicate' = pred; + calc pred : '#Unary_predicate' { + in parameter : Anything redefines parameter; + return result : Boolean; + parameter == tgt + } + } + + action '#unary_nop' : '#Unary_action' { + doc /* A unary action that does nothing */ + succession immediate : HappensJustBefore first start then done; + } + + calc '#unary_true' : '#Unary_predicate' { + doc /* A unary predicate that always return true */ + succession immediate : HappensJustBefore first start then done; + assign result := true; + } + + action '#nop' { doc /* the action which does nothing */ } + + action '#multiset_iter' { + doc + /* A general purpose tool to iter tests and actions on elements of a multiset represented + * by an ordered list + */ + in multiset : Anything[0..*] ordered nonunique; // the multiset on which to iter + in pred : '#Unary_predicate' default '#unary_true'; // to select elements + in pre_act : '#Unary_action' default '#unary_nop'; // to apply on all elements, before if_act + in if_act : '#Unary_action' default '#unary_nop'; // to apply on selected elements + in post_act : '#Unary_action' default '#unary_nop'; // to apply on all elements, after if_act + out selected : Anything[0..*]; // all x in s satisfying pred(x) + out discarded : Anything[0..*]; // all x in s satisfying not pred(x) + attribute accepted : Boolean; + + first start then iter; + action iter for i : Positive in 1..multiset -> size() { + + first start then select; + action select + if pred(multiset#(i)) { + first start; + then assign accepted := true; + } + else { + first start; + then assign accepted := false; + then assign discarded := (discarded,multiset#(i)); + } + then do_actions; + action do_actions { + first start; + then action subsets pre_act{ in parameter = multiset#(i); } + then if accepted { + first start; + then action subsets if_act { in parameter = multiset#(i); } + then done; + } + then action subsets post_act { in parameter = multiset#(i); } + then done; + } then done; + } then done; + } + + calc '#multiset_random' { + doc /* A function that randomly returns an element of a (parameter) multiset */ + in multiset : Anything[0..*] ordered; // the set from which an element is expected + out : Anything[0..1] := if multiset == null? null else multiset#('#bound_random'(1,size(multiset))); + } + + action '#multiset_remove' { + doc + /* A tool for removing elements from a multiset */ + + inout multiset : Anything[0..*] ordered nonunique; // the multiset to update + in pred : '#Unary_predicate'; // to select elements to remove + + perform action iter subsets '#multiset_iter' { + in multiset redefines multiset = multiset; + in pred redefines pred = pred; + } + then assign multiset := iter.discarded; + } + + calc '#multiset_exists' { + doc + /* A tool for testing if some elements of a multiset satisfy a predicate */ + + in multiset : Anything[0..*] ordered nonunique; // the multiset to update + in pred : '#Unary_predicate'; // to select elements to remove + + perform action iter subsets '#multiset_iter' { + in multiset redefines multiset = multiset; + in pred redefines pred = pred; + } + iter.selected != null + } + + // LOCK FOR MUTUAL EXCLUSION =================================================== + + part def '#Lock' { + doc /* A simple semaphore with size 1, to protect critical sections */ + private attribute locked : Boolean := false; + + action lock { + doc /* To take the helm. Blocks until the protected ressource is available */ + comment + /* In this action, assignments actions are atomic, immediate succession s + * (HappensJustBefore) correctly handles concurrency */ + attribute success : Boolean; + first start; + then action wait accept when not locked; + then action test_lock assign success := not locked; + succession s : HappensJustBefore first test_lock then do_lock; + action do_lock assign locked := true; + } + + action unlock { + doc /* To release the protected ressource */ + first start; then assign locked := false; + } + } + + // SYSTEM SHARED CLOCK FOR DISCRETE TIME ================================ + + item systemClock : Clock { + doc /* a system level discrete clock to handle delays */ + currentTime : Integer redefines currentTime; + } +} \ No newline at end of file diff --git a/src/main/java/avatartranslator/tosysmlv2/static/AvatarTransitionServer.sysml b/src/main/java/avatartranslator/tosysmlv2/static/AvatarTransitionServer.sysml new file mode 100644 index 0000000000000000000000000000000000000000..32b3ace50127662285e3cb3333dec830571379a3 --- /dev/null +++ b/src/main/java/avatartranslator/tosysmlv2/static/AvatarTransitionServer.sysml @@ -0,0 +1,652 @@ +// AVATAR CENTRALIZED TRANSITION SERVER %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +package AvatarTransitionServer { + private import Clocks::TimeOf; + private import Time::TimeInstantValue; + private import AvatarGeneral::*; + private import AvatarCommunication::*; + public import Occurrences::Occurrence; + + doc /* The server is used to select a transition to execute among the possible outgoing transitions + * of a state of an Avatar block statemachine. For this, states will submit pools of requests to + * the server, where each request is associated to one of its outgoing transitions. Then, as soon + * as some requests in the pool are feasible, the server chose one of them and send a response to + * the state identifying the selected request and providing the associated '@payload' (transmitted + * message for receiving requests, and acknowledgment in other cases) + */ + +// AVATAR TRANSITION REQUESTS ============================================ + + abstract part def '#Request' { + doc /* The most general request type. Outgoing transition from a state are statically ordered. + * Thus associated requests have an index w.r.t this order, which identifies the request they + * are associated to. + */ + + readonly attribute '@index' : Positive default 1; + + comment Request_Partition about '#OKrequest', '#NOKrequest', '#Request' + /* Requests are either certainly unfeasible (a #NOKrequest has false guard) + * or potentially feasible (an #OKrequest has true guard) + * #OKrequest, #NOKrequest is a partition of #Request + */ + } + + part def '#NOKrequest' :> '#Request' { + doc /* Certainly unfeasible requests, i.e. requests with false guard. + * they cannot be selected by the centralized server. + */ + } + calc '#nok_request' { + in '@index' : Positive; + return : '#NOKrequest' { + attribute '@index' redefines '@index' = '@index'; + } + } + + abstract part def '#OKrequest' :> '#Request' { + doc /* Potentially feasible requests, i.e. requests with true guard. + * they may be selected by the centralized server. + * They may be '@delay'ed by an "after", thus they have a trigger date w.r.t + * the system discrete clock. + */ + + item localClock : Clock redefines localClock = systemClock ; + readonly attribute '@delay' : Positive default 0; + derived attribute trigger_at = TimeOf(clock=localClock, o=self) + '@delay'; + + comment OKrequest_Partition about '#OKrequest', '#TrivialRequest', '#CommunicationRequest' + /* OK requests may be without dependency and thus Trivialially feasible (#TrivialRequest). + * Non Trivialial requests are the ones associated to communication (#CommunicationRequest). + * They may require synchronization, or channel or data to be available. + * #TrivialRequest, #CommunicationRequest, is a partition of #OKrequest + */ + } + + part def '#TrivialRequest' :> '#OKrequest'{ + doc /* Trivialial requests don't communicate, thus don't block. Associated transitions + * only execute actions such as assignment, external method calls,... + */ + } + + item '#immediate_request' : '#TrivialRequest' = '#TrivialRequest'(); + + abstract part def '#CommunicationRequest' :> '#OKrequest' { + doc /* Communication requests, which have an associated communication channel. + * They may block until some ressource is available, depending of the kind of channel + */ + + readonly item '@channel' : '#Channel'; + readonly attribute is_send : Boolean { + doc /* request direction, which is redoundant with #CommunicationRequest + * specializations but useful to factor some descriptions in the model + */ + } + + comment about '#CommunicationRequest', '#SendRequest', '#ReceiveRequest' + /* communication requests have a direction: they are "send" or "receive". + * #SendRequest, #ReceiveRequest, is a partition of #CommunicationRequest + */ + } + + part def '#SendRequest' :> '#CommunicationRequest' { + doc /* Requests for sending. They have have a '@payload' (message) */ + + readonly item '@payload' : '#Message'; + readonly attribute is_send redefines is_send = true; + } + + part def '#ReceiveRequest' :> '#CommunicationRequest' { + doc /* Requests for receiving */ + + readonly attribute is_send redefines is_send = false; + } + + part def '#RequestPool' { + doc /* Pools of requests. They contain one request per outgoing transition of the + * state they are associated to. They have an associated requestor identifying + * who to send the response to (generally the block whose statemachine contains + * the state) + */ + + occurrence requestor : Occurrence; + item pool : '#Request'[0..*] ordered default '#immediate_request'; + + assert constraint { + doc /* Request indexes correspond to their range in the pool. This is a redoundancy which + * makes the model more simple. + * Moreover, all transitions from the concerned state in Avatar model have a corresponding + * request , which cannot be expressed here as it is a constraint on the software which + * generates the Avatar SysMLV2 model + */ + calc test { + first start; + then assign result := true; + then for i in 1..size(pool) { + first start; + then assign result := result & pool#(i).'@index' == i; + } + } + test() + } + + } + +// AVATAR RESPONSES TO REQUESTS ============================================ + item def '#Response' { + doc /* Response to submitted request pool. + * Once a request in a pool is satisfied, the server sends a response to + * the requestor associated to the pool. This response identifies the + * (index of the transition corresponding to the) satisfied request in + * the pool and carry some '@payload'. A '@payload' is a message (which can be + * a simple acknowledgement). + * Remark: As a resquestor should not have more than one pending request + * pool in the server, this information is sufficient to root the response + * to a unique well identified waiting accept action. + */ + + attribute '@index' : Positive default 1; + item '@payload' : '#Message' default '#ack_message'; + } + item '#default_response' = '#Response'(); + +// THE SERVER ITSELF ======================================================== + + part '#transitionRequestServer' { + doc /* The transition request server. + * General Principle: all submitted requests are initially considered as + * '@delay'ed (even if their '@delay' is 0, for homogeneity). '@delay'ed requests + * wake up themself at their "trigger_at" date and launch the server's + * request handler on themself. The handler try to execute the request + * which may lead either to successfull or blocking issue. + * A request wake up once and only once. After this, if it is blocked + * (pending communication), it remains in the pending requests but is + * removed from the '@delay'ed requests. Such requests may then be unblocked + * by the wake-up of a dual request (a send for a receive or a receive for + * a send), or discarded if some other request in their pool is selected + * to be executed. Pools may also wait forever... + * + * The server maintains two sets of pending pools: + * - general pending pools are all pending pools, containing all + * pending requests + * - '@delay'ed pending pools (each one associated to a general pending pools) + * are pools containing '@delay'ed requests, and only '@delay'ed requests. + * + * When a pool is submitted by a state, it is added to both sets. + * When a '@delay'ed request wake up, it is removed from its '@delay'ed pool (which + * is removed when becomming empty -- facultatif) and if handling + * this request leads to a success, all involved pools are removed from + * both sets and relevant responses are send to the involved communicating + * ends (which pools and which responses depends on channel types). + */ + + item localClock : Clock redefines localClock = systemClock ; + private individual item def Kill { doc /* type of the local kill signal */ } + private individual item kill : Kill { + doc /* The local kill signal to be sent to '@delay'ed requests when + * their pool is deleted because some other request in the pool + * is executed + */ + } + private item mutex : '#Lock'; + private item request_pools : '#RequestPool'[0..*] ordered { + doc /* general pending pools containing requests waiting for wake up + * or available ressources + */ + } + protected item delayed_pools : '#delayedPool'[0..*] ordered { + doc /* '@delay'ed pending pools containing requests waiting for wake up */ + } + + part def '#delayedPool' { + doc /* Type of pools containing '@delay'ed requests. Such pools are + * associated to the general request pool that contain their requests. + */ + item request_pool : '#RequestPool'; + item delayed_requests : '#delayedRequest'[0..*] ordered; + } + + part def '#delayedRequest' { + doc /* (operational) structure for '@delay'ed requests */ + + attribute trigger_at : Positive, TimeInstantValue { doc /* The date at which to wake up */ } + item delayed_pool : '#delayedPool' { doc /* the '@delay'ed pool the request belongs to */} + attribute '@index' : Positive; + + private readonly item myself = self; // technical... to be referenced in sub-components + protected item delayed_pools : '#delayedPool'[0..*] ordered = '#transitionRequestServer'.delayed_pools; + // apparently required !?! + + state statemachine { + doc /* waits for wake up or kill */ + entry; then state wait; + transition first wait accept Kill then done; + transition first wait accept at trigger_at + do action { + perform action remove_request subsets + '#multiset_remove' { + in multiset redefines multiset = delayed_pool.delayed_requests; + in pred redefines pred = '#identity'(myself); + } + then if delayed_pool.delayed_requests == null { + perform action remove_delayed_pool subsets + '#multiset_remove' { + in multiset redefines multiset = delayed_pools; + in pred redefines pred = '#identity'(delayed_pool); + } then done; + } + then action wake_up subsets '#transitionRequestServer'.request_wake_up { + in request_pool redefines request_pool = delayed_pool.request_pool; + in transition_id redefines transition_id = transition_id; + } + } + then done; + } + first statemachine then done; + } + + // FOR SUBMITTING A REQUEST POOL ========================================== + + action submit { // add parameter pool to request_pools and delayed_pools + in request_pool : '#RequestPool'; + part delayed_pool : '#delayedPool' { + item request_pool : '#RequestPool' redefines request_pool = request_pool; + item delayed_requests : '#delayedRequest'[0..*] redefines delayed_requests := null; + } + first start; then perform mutex.lock; + for i in 1..size(request_pool.pool) { + if request_pool.pool#(i) hastype '#OKrequest' { // build '@delay'ed request for ith request + item request := request_pool.pool#(i) as '#OKrequest'; + part delayed_request : '#delayedRequest' { + in trigger_at redefines trigger_at = request.trigger_at; + in delayed_pool redefines delayed_pool = delayed_pool; + in '@index' redefines '@index' = request.'@index'; + } + first start; then // add '@delay'ed request + assign delayed_pool.delayed_requests := (delayed_pool.delayed_requests,delayed_request); + then delayed_request.start; + } + } + then assign request_pools := (request_pools, request_pool); // add general request pool + then if delayed_pools.delayed_requests != null { + assign delayed_pools := (delayed_pools, delayed_pool); + } // add '@delay'ed request pool if not empty + then perform mutex.unlock; + then done; + } + + // REQUEST WAKE UP: tries request synchronization if request has not already been handled + + comment about request, request_pool /* ALGORITHMIC VARIABLES: inputs for trying a synchronization */ + protected part request : '#Request'{ doc /* ALGORITHMIC VARIABLE : the request to be synchronized */ } + protected part request_pool : '#RequestPool'{ doc /* tALGORITHMIC VARIABLE :he pool of the request to be synchronized */ } + + action request_wake_up { + doc /* verifies that request has not already been synchronized and if not, try to synchronize it */ + in request_pool : '#RequestPool'; + in transition_id : Positive; + + first start; then perform mutex.lock; + then perform action todo subsets '#multiset_exists'{ + in multiset redefines multiset = request_pools; + in pred redefines pred = '#identity'(request_pool); } + then if todo.result { + first start; + then assign request := request_pool#(transition_id); + then assign request_pool := request_pool; + then perform try_request_synchronization; + } + then perform mutex.unlock; + then done; + } + + action try_request_synchronization { + first start; + then perform search_request_synchronization; + then perform remove_request_pools; + then perform send_mails; + then done; + } + + // SUBROUTINE : removing synchronized pending pools ========================= + + item pools_to_remove : '#RequestPool'[0..2] { + doc /* ALGORITHMIC VARIABLE: synchronized pools, i.e associated to synchronized + * requests. Updated when finding a synchronization. Removed from pending pools + * when executing this synchronization. + */ + } + + protected action remove_request_pools { + doc /* Removing pools in pools_to_remove, i.e removing them from both sets of + * pending pools (general and '@delay'ed). This also kills the process in '@delay'ed + * requests which are waiting for either a trigger signal or a kill signal. + */ + + // subroutine + action kill_delayed_pool_requests : '#Unary_action' { + doc /* kill all waiting requests of a parameter '@delay'ed pool */ + in parameter : '#delayedPool'; + first start; + then for r in parameter.delayed_requests { first start; then send kill to r; } + } + + first start; + then for p : '#RequestPool' in pools_to_remove { + + // subroutine + calc has_request_pool : '#Unary_predicate' { + doc /* test if the request pool of a parameter '@delay'ed pool is p */ + in parameter : '#delayedPool'; parameter.request_pool == p + } + + first start; + then action remove_request_pool subsets '#multiset_remove' { // remove pool from general pending pools + in multiset redefines multiset = request_pools; + in pred redefines pred = '#identity'(p); + } + then action remove_delayed_pool subsets '#multiset_iter' { + in multiset redefines multiset = delayed_pools; + in pred redefines pred = has_request_pool; + in if_act redefines if_act = kill_delayed_pool_requests; + } + succession flow remove_delayed_pool.discarded to update_delayed_pools.new_delayed_pools; + action update_delayed_pools { + in new_delayed_pools : '#RequestPool'[0..*]; + first start; then assign delayed_pools := new_delayed_pools; then done; + } + } + then done; + } + + // SUBROUTINE: sending responses to requestors ============================= + + protected part def '#Mail' { + doc /* Response computed while finding synchronizations have an associated recipient, + * This characterizes mails. + */ + item recipient: Occurrence; + item response: '#Response'; + } + + item mails_to_send : '#Mail'[0..2] { + doc /* ALGORITHMIC VARIABLE: mails associated to synchronized requests. Updated + * when finding a synchronization. Responses are sent to recipients when executing + * this synchronization. + */ + } + + protected action send_mails { + doc /* send responses to requestors of synchronized requests */ + first start; + then for i : Positive in 1..size(mails_to_send) { + first start; + then send mails_to_send#(i).response to mails_to_send#(i).recipient; + then done; + } + } + + // SUBROUTINE searching a dual request for current request in pending requests =============== + + private part dual_request : '#Request'[0..1]{ + doc /* selected dual pending request of the current request, + * among the found ones + */ + } + private part dual_request_pool : '#RequestPool'[0..1] { + doc /* ALGORITHMIC VARIABLE: the pool containing the selected dual pending + * request of the current request. + */ + } + + action search_pending_dual_request { + doc /* search for a dual request of current request in request_pools. + * updates dual_request and dual_request_pool accordingly. If no dual request + * is found, they are set to null. If severall are found, one is choosed + * randomly. + * Dual requests are communication requests on a same channel with opposite + * directions + */ + + comment about dual_requests, dual_request_pools + /* order in these two items are parallel: i-th request belongs to i-th pool */ + + part dual_requests : '#Request'[0..*] := null{ + doc /* found requests that are dual of current request */ + } + + part dual_request_pools : '#RequestPool'[0..*] := null { + doc /* the pools containing dual requests in dual_requests, in the same order */ + } + + first start; + then assign dual_requests := null; + then assign dual_request_pools := null; + then decide; + if request hastype '#CommunicationRequest' then search; + else done; + + item communication_request[0..1] : '#CommunicationRequest' := request as '#CommunicationRequest'; + + action search assign dual_request := null; + then assign dual_request_pool := null; + then for p : '#RequestPool' in request_pools { + item found : '#Request'[0..*] := null; // dual requests in pool p + first start; + then for r : '#Request' in p.pool { + if r hastype '#CommunicationRequest' { + item req = r as '#CommunicationRequest'; + first start; + then if communication_request.'@channel' == req.'@channel' and + communication_request.is_send != req.is_send and + communication_request.trigger_at >= localClock.currentTime + { first start; then assign found := (found,r); then done; } + } + } + then if found != null { + first start; + then assign dual_request_pools := (dual_request_pools, p); + then assign dual_requests := (dual_requests,'#multiset_random'(found)); + then done; + } + then done; + } + then if dual_requests != null { // randomly select one of the possible dual requests + attribute x : Positive := '#bound_random'(low=1, high=size(dual_requests)); + first start; + then assign dual_request_pool:= dual_request_pools#(x); + then assign dual_request:= dual_requests#(x); + } + else { + first start; + then assign dual_request_pool:= null; + then assign dual_request:= null; + } + then done; + } + + // SUBROUTINE add an acknowledgement for a couple (pool,request) + + action acknowledge { + doc /* add acknowledgement in mails_to_send and pools_to_remove */ + in request_pool : '#RequestPool'; + in request : '#Request'; + first start; + then assign mails_to_send := ( mails_to_send, + '#Mail'( recipient = request_pool.requestor, + response = '#Response'('@index' = request.'@index', + '@payload' = '#ack_message') ) ); + then assign pools_to_remove := (pools_to_remove, request_pool); + } + + // SEARCH A SYNCHRONIZATION FOR request ============================== + + action search_request_synchronization { + doc /* search a synchronization for current request and updates mails_to_send + * and pools_to_remove accordingly. If no synchronization is found, both + * variables are set to null. + */ + first start; + then assign mails_to_send := null; + then assign pools_to_remove := null; + then decide select_wrt_request_type; + if request hastype '#NOKrequest' then done; + if request hastype '#TrivialRequest' then trivial_synchro; + else communication_synchro; + + // Synchronization of Trivialial actions -------------------------------- + action trivial_synchro subsets acknowledge { + doc /* Trivialial actions are always synchronized (with no other pool) and simply return + * an acknowledgment + */ + in request_pool redefines request_pool; + in request redefines request; + } + then done; // end of trivial_synchro : search_request_synchronization returns + + // Synchronization of communication requests, depends on channel type ---- + item communication_request[0..1] : '#CommunicationRequest' := request as '#CommunicationRequest'; + decide communication_synchro; + if communication_request.'@channel' hastype '#Fifo' then fifo_synchro; + else sync_synchro; + + // Synchronization of communication requests on fifo channel ------------ + action fifo_synchro { + item fifo : '#Fifo' := communication_request.'@channel' as '#Fifo'; + first start; + then decide select_wrt_communication_direction; + if request hastype '#SendRequest' then send_synchro; + else receive_synchro; + + action send_synchro { + item send_request : '#SendRequest' := communication_request as '#SendRequest'; + first start; + then decide test_if_lossy; + if fifo.'@relation'.'@lossy' == true then lossy_synchro; + else noloss_synchro; + + decide lossy_synchro; // loss or not, random choice + then loss_synchro; + then noloss_synchro; + + action loss_synchro subsets acknowledge { + in request_pool redefines request_pool = request_pool; + in request redefines request = request; + } + then done; + + action noloss_synchro { + first start; + then decide test_if_full; + if fifo.can_put() then put_synchro; + else full_synchro; + + decide full_synchro; // test if blocking + if fifo hastype '#NBfifo' then discard_synchro; + else done; + + action discard_synchro subsets acknowledge { + in request_pool redefines request_pool = request_pool; + in request redefines request = request; + } + then done; + + action put_synchro { + first start; + then action put subsets fifo.put { + in 'message' redefines 'message' = send_request.'@payload'; + } + then action ack subsets acknowledge { + in request_pool redefines request_pool = request_pool; + in request redefines request = request; + } + then perform search_pending_dual_request; + then + if dual_request != null { + first start; + then assign pools_to_remove := (pools_to_remove,dual_request_pool); + then assign mails_to_send := (mails_to_send, + '#Mail'( recipient = dual_request_pool.requestor, + response = '#Response'( '@index' = dual_request.'@index', + '@payload' = fifo.get() ))); + then done; + } + } then done; + } then done; + } then done; // end of send_synchro : fifo_synchro returns + + action receive_synchro { + first start; + then if fifo.can_get() { + first start; + then assign mails_to_send := + '#Mail'( recipient = request_pool.requestor, + response = '#Response'('@index' = communication_request.'@index', + '@payload' = fifo.get() )); + then assign pools_to_remove := request_pool; + then perform search_pending_dual_request; + then + if dual_request != null { + first start; + then assign pools_to_remove := (pools_to_remove,dual_request_pool); + then action ack subsets acknowledge { + in request_pool redefines request_pool = dual_request_pool; + in request redefines request = dual_request; + } then done; + } then done; + } then done; + } then done; // end of receive_synchro : fifo_synchro returns + } then done; // end of fifo_synchro : search_request_synchronization returns + + // Synchronization of communication requests on synchroneous channel ------------ + action sync_synchro { + first start; + then decide select_wrt_communication_direction; + if communication_request hastype '#SendRequest' then send_synchro; + else receive_synchro; + + action send_synchro { + first start; + then perform search_pending_dual_request; + then + if dual_request != null { + item send_request : '#SendRequest' = request as '#SendRequest'; + first start; + then action ack subsets acknowledge { + in request_pool redefines request_pool = request_pool; + in request redefines request = request; + } + then assign mails_to_send := ( mails_to_send, + '#Mail'( recipient = dual_request_pool.requestor, + response = '#Response'( + '@index' = dual_request.'@index', + '@payload' = send_request.'@payload' )) ); + then assign pools_to_remove := (pools_to_remove, dual_request_pool); + then done; + } then done; + } then done; // end of send_synchro : sync_synchro returns + + action receive_synchro { + first start; + then perform search_pending_dual_request; + then + if dual_request != null { + item send_request : '#SendRequest' = dual_request as '#SendRequest'; + first start; + then action ack subsets acknowledge { + in request_pool redefines request_pool = dual_request_pool; + in request redefines request = dual_request; + } + then assign mails_to_send := ( mails_to_send, + '#Mail'( recipient = request_pool.requestor, + response = '#Response'( + '@index' = request.'@index', + '@payload' = send_request.'@payload' )) ); + then assign pools_to_remove := (pools_to_remove, request_pool); + then done; + } then done; + } then done; // end of receive_synchro : sync_synchro returns + } then done; // end of sync_synchro : search_request_synchronization returns + } // end of search_request_synchronization + } +} + diff --git a/src/main/java/ui/AvatarDesignPanelTranslator.java b/src/main/java/ui/AvatarDesignPanelTranslator.java index be4ffc9015e16c346d13be94382b7e662ca5189d..75f50c1d85cf966b98b3f9ef6912775d74f093bf 100644 --- a/src/main/java/ui/AvatarDesignPanelTranslator.java +++ b/src/main/java/ui/AvatarDesignPanelTranslator.java @@ -49,6 +49,7 @@ import ui.avatarsmd.*; import java.awt.*; import java.util.*; import java.util.List; +import java.util.function.BiConsumer; /** * Class AvatarDesignPanelTranslator @@ -1101,21 +1102,44 @@ public class AvatarDesignPanelTranslator { return aa; } + + private class CompleteDataTypeAttribute implements BiConsumer<AvatarAttribute,String> { + AvatarSpecification as; + public CompleteDataTypeAttribute(AvatarSpecification _as) { as = _as;} + public void accept(AvatarAttribute aa, String dt) { + AvatarDataType adt = as.getDataTypeByName(dt); + if (adt == null) { + addCheckingError(new CheckingError(CheckingError.STRUCTURE_ERROR, "datatype " + dt + "in datatype field " + + aa.getName() + " is undefined (set to integer)")); + aa.setType(AvatarType.INTEGER); + } + else aa.setDataType(adt); + } + } private void createDataTypes(AvatarSpecification _as, List<AvatarBDDataType> _dataTypes) { + HashMap<AvatarAttribute,String> attributeMap = new HashMap<AvatarAttribute,String>(); for(AvatarBDDataType type: _dataTypes) { AvatarDataType adt = new AvatarDataType(type.getDataTypeName(), type); for(TAttribute ta: type.getAttributeList()) { - AvatarType ty; - if (ta.getType() == TAttribute.INTEGER) { - ty = AvatarType.INTEGER; - } else { - ty = AvatarType.BOOLEAN; + AvatarAttribute aa; + if (ta.getType() == TAttribute.INTEGER || ta.getType() == TAttribute.NATURAL) + aa = new AvatarAttribute(ta.getName(), AvatarType.INTEGER, null, type); + else if (ta.getType() == TAttribute.BOOLEAN) + aa = new AvatarAttribute(ta.getName(), AvatarType.BOOLEAN, null, type); + else if (ta.getType() == TAttribute.OTHER) { + aa = new AvatarAttribute(ta.getName(), AvatarType.UNDEFINED, null, type); + attributeMap.put(aa, ta.getTypeOther().trim()); + } + else { // ERROR, should not happen ?? + addCheckingError(new CheckingError(CheckingError.STRUCTURE_ERROR, + "Unauthorized type for field " + ta.getId() + " of datatype " + type.getDataTypeName())); + aa = new AvatarAttribute(ta.getName(), AvatarType.INTEGER, null, type); } - AvatarAttribute aa = new AvatarAttribute(ta.getName(), ty, null, type); adt.addAttribute(aa); } _as.addDataType(adt); - } + attributeMap.forEach(new CompleteDataTypeAttribute(_as)); + } } private void createLibraryFunctions(AvatarSpecification _as, List<AvatarBDLibraryFunction> _libraryFunctions) { @@ -1393,6 +1417,8 @@ public class AvatarDesignPanelTranslator { if ((rt.compareTo("int") == 0) || (rt.compareTo("bool") == 0)) { aa = new AvatarAttribute("return__0", AvatarType.getType(rt), _ab, _block); _atam.addReturnParameter(aa); + aa = new AvatarAttribute("return__", AvatarType.getType(rt), _ab, _block); + _atam.addOriginalReturnParameter(aa); } else { List<TAttribute> types = adp.getAvatarBDPanel().getAttributesOfDataType(rt); if (types == null) { diff --git a/src/main/java/ui/AvatarPanelDrawer.java b/src/main/java/ui/AvatarPanelDrawer.java index f2cb6258afce6a74d02308c8386f230ee4e93fc0..0f06bbb4c74609449f156dbc9ccc952d04a909f6 100644 --- a/src/main/java/ui/AvatarPanelDrawer.java +++ b/src/main/java/ui/AvatarPanelDrawer.java @@ -306,14 +306,18 @@ public class AvatarPanelDrawer { abdType.setDataTypeName(adt.getName()); // Adding attributes for (AvatarAttribute attr : adt.getAttributes()) { - int type = 4; - if (attr.getType() == AvatarType.INTEGER) { - type = 0; + if (attr.getType() == AvatarType.UNDEFINED) { + abdType.addAttribute(new TAttribute(0, attr.getName(), + attr.getType().getDefaultInitialValue(), attr.getDataType().getName())); } - if (attr.getType() == AvatarType.TIMER) { - type = 9; + else { + int type = 4; + if (attr.getType() == AvatarType.INTEGER) { + type = 0; + } + String initialValue = (attr.getProvidedInitialValue() == null ? "" : attr.getProvidedInitialValue()); + abdType.addAttribute(new TAttribute(0, attr.getName(), initialValue, type)); } - abdType.addAttribute(new TAttribute(0, attr.getName(), attr.getType().getDefaultInitialValue(), type)); } @@ -578,11 +582,15 @@ public class AvatarPanelDrawer { // Guard SMDCon.setTransitionInfo(t.getGuard(useOriginalValuesFirst), action); + // Probability + if (t.getProbability() != t.DEFAULT_PROBABILITY) SMDCon.setTransitionProbability("" + (t.getProbability())); + // Action for (int i = 1; i < t.getActions().size(); i++) { SMDCon.setTransitionInfo("", t.getAction(i, useOriginalValuesFirst).replaceAll(" ", "")); } + // Transition Law SMDCon.setTransitionProbability(t.getDelayDistributionLaw(), t.getDelayExtra1(), t.getDelayExtra2()); smp.addComponent(SMDCon, p1.getX(), p1.getY(), false, true); @@ -1051,7 +1059,7 @@ public class AvatarPanelDrawer { //TraceManager.addDev("Handling original attributes"); //TraceManager.addDev("\tHandling attribute: " + attr); if (attr.isDataType()) { - bl.addAttribute(new TAttribute(0, attr.getName(), attr.getInitialValue(), attr.getDataType().getName())); + bl.addAttribute(new TAttribute(0, attr.getName(), attr.getProvidedInitialValue(), attr.getDataType().getName())); } else { int type = TAttribute.OTHER; if (attr.getType() == AvatarType.BOOLEAN) { @@ -1066,7 +1074,7 @@ public class AvatarPanelDrawer { if (attr.hasInitialValue()) { bl.addAttribute(new TAttribute(0, attr.getName(), attr.getInitialValue(), type)); } else { - bl.addAttribute(new TAttribute(0, attr.getName(), attr.getType().getDefaultInitialValue(), type)); + bl.addAttribute(new TAttribute(0, attr.getName(), "", type)); } } @@ -1092,7 +1100,7 @@ public class AvatarPanelDrawer { if (attr.hasInitialValue()) { bl.addAttribute(new TAttribute(0, attr.getName(), attr.getInitialValue(), type)); } else { - bl.addAttribute(new TAttribute(0, attr.getName(), attr.getType().getDefaultInitialValue(), type)); + bl.addAttribute(new TAttribute(0, attr.getName(), "", type)); } if (attr.getName().contains("key_") || attr.getName().contains("privKey_")) { hasCrypto = true; diff --git a/src/main/java/ui/avatarsmd/AvatarSMDConnector.java b/src/main/java/ui/avatarsmd/AvatarSMDConnector.java index 2e19d3accd37425f11c0b5b69640bed716bdc532..107790ad1fb4d5b7784db021027e9bc6d698f9d4 100644 --- a/src/main/java/ui/avatarsmd/AvatarSMDConnector.java +++ b/src/main/java/ui/avatarsmd/AvatarSMDConnector.java @@ -119,6 +119,11 @@ public class AvatarSMDConnector extends TGConnectorWithCommentConnectionPoints i } } + public void setTransitionProbability(String probability) { + AvatarSMDTransitionInfo tgc = getAvatarSMDTransitionInfo(); + tgc.setProbability(probability); + } + public void setTransitionTime(String minDelay, String maxDelay, String minCompute, String maxCompute) { AvatarSMDTransitionInfo tgc = getAvatarSMDTransitionInfo(); tgc.setTimes(minDelay, maxDelay, minCompute, maxCompute); diff --git a/ttool/src/test/java/cli/CLIAvatar2SysMLV2Test.java b/ttool/src/test/java/cli/CLIAvatar2SysMLV2Test.java new file mode 100644 index 0000000000000000000000000000000000000000..e00481e12e603ce78a8d58712fe5e1de243b4f5d --- /dev/null +++ b/ttool/src/test/java/cli/CLIAvatar2SysMLV2Test.java @@ -0,0 +1,150 @@ +/**Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille + * + * ludovic.apvrille AT enst.fr + * + * This software is a computer program whose purpose is to allow the + * edition of TURTLE analysis, design and deployment diagrams, to + * allow the generation of RT-LOTOS or Java code from this diagram, + * and at last to allow the analysis of formal validation traces + * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP + * from INRIA Rhone-Alpes. + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + * + * /** + * Class AvatarPragma + * Creation: 20/05/2010 + * @version 1.1 01/07/2014 + * @author Ludovic APVRILLE, Raja GATGOUT + * @see + */ + +package cli; + +import graph.AUTGraph; +import graph.AUTTransition; +import myutil.TraceManager; +import org.junit.Test; +import test.AbstractTest; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + + +public class CLIAvatar2SysMLV2Test extends AbstractTest implements InterpreterOutputInterface { + + final static String PATH_TO_TEST_FILE = "cli/input/"; + final static String PATH_TO_EXPECTED_FILE = "cli/expected/"; + final static String PATH_TO_MODELS = "cli/models/"; + private final String[] toThenFrom = {"CoffeeMachine_Avatar", "avSysML_mixedexample", "PressureController"}; // + private StringBuilder outputResult; + + + public CLIAvatar2SysMLV2Test() { + // + } + + + public void exit(int reason) { + System.out.println("Exit reason=" + reason); + assertTrue(reason == 0); + } + public void printError(String error) { + System.out.println("Error=" + error); + } + + public void print(String s) { + System.out.println("info from interpreter:" + s); + outputResult.append(s); + } + + @Test + public void testToThenFrom() { + String filePath = getBaseResourcesDir() + PATH_TO_TEST_FILE + "scriptavsysml"; + String script; + + outputResult = new StringBuilder(); + + File f = new File(filePath); + assertTrue(myutil.FileUtils.checkFileForOpen(f)); + + script = myutil.FileUtils.loadFileData(f); + + assertTrue(script.length() > 0); + String header = "print dir\n set model resources/test/cli/models/"; + + boolean show = false; + for(String model : toThenFrom) { + System.out.println("Testing Model " + model + "................................."); + String modelScript = header + model + ".xml\n" + script; + Interpreter interpret = new Interpreter(modelScript, this, show); + interpret.clearAvatarSpecification(); + interpret.interpret(); + + // Must now load the graph + filePath = "avsysml_ori.aut"; + f = new File(filePath); + assertTrue(myutil.FileUtils.checkFileForOpen(f)); + String data = myutil.FileUtils.loadFileData(f); + + assertTrue(data.length() > 0); + AUTGraph graph = new AUTGraph(); + graph.buildGraph(data); + graph.computeStates(); + int oristates = graph.getNbOfStates(); + int oritrans = graph.getNbOfTransitions(); + + filePath = "avsysml_tgt.aut"; + f = new File(filePath); + assertTrue(myutil.FileUtils.checkFileForOpen(f)); + data = myutil.FileUtils.loadFileData(f); + + assertTrue(data.length() > 0); + graph = new AUTGraph(); + graph.buildGraph(data); + graph.computeStates(); + int tgtstates = graph.getNbOfStates(); + int tgttrans = graph.getNbOfTransitions(); + + + System.out.println("states=" + oristates + ", " + tgtstates + " -- transitions=" + oritrans + ", " + tgttrans); + assertTrue(oristates == tgtstates); + assertTrue(oritrans == tgttrans); + } + + + // Graph minimization + + + } +} diff --git a/ttool/src/test/resources/cli/input/scriptavsysml b/ttool/src/test/resources/cli/input/scriptavsysml new file mode 100644 index 0000000000000000000000000000000000000000..5484512aa5a4ff050ba6852f1810064844b1e3f9 --- /dev/null +++ b/ttool/src/test/resources/cli/input/scriptavsysml @@ -0,0 +1,20 @@ +action start +wait 2 +#toto +action open $model +wait 4 +action check-syntax +action avatar-rg -g avsysml_ori.aut +wait 3 +action ass2 avsysml.sysml +wait 2 +a als2 avsysml.sysml +wait 1 +a save +a new +a ad +a sf avsysml2 +a save +action check-syntax +action avatar-rg -g avsysml_tgt.aut +action quit diff --git a/ttool/src/test/resources/cli/models/avSysML_mixedexample.xml b/ttool/src/test/resources/cli/models/avSysML_mixedexample.xml new file mode 100644 index 0000000000000000000000000000000000000000..42fb3616b0fff1563a605fbbac83eb6d257811c4 --- /dev/null +++ b/ttool/src/test/resources/cli/models/avSysML_mixedexample.xml @@ -0,0 +1,1183 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<TURTLEGMODELING version="3.0 beta" ANIMATE_INTERACTIVE_SIMULATION="true" ACTIVATE_PENALTIES="true" UPDATE_INFORMATION_DIPLO_SIM="false" ANIMATE_WITH_INFO_DIPLO_SIM="true" OPEN_DIAG_DIPLO_SIM="false" LAST_SELECTED_MAIN_TAB="0" LAST_SELECTED_SUB_TAB="3"> + +<Modeling type="AVATAR Design" nameTab="Design" tabs="Block Diagram$B0$B1$B1_0" > +<AVATARBlockDiagramPanel name="Block Diagram" minX="10" maxX="2500" minY="10" maxY="1500" zoom="1.0" > +<MainCode value="void __user_init() {"/> +<MainCode value="}"/> +<Optimized value="true" /> +<considerTimingOperators value="true" /> +<Validated value="B1;B1_0;B0;" /> +<Ignored value="" /> + +<CONNECTOR type="5002" id="2" index="0" uid="e2d900d2-9cd1-419a-a79e-03081de16bf0" > +<cdparam x="338" y="230" /> +<sizeparam width="0" height="0" minWidth="0" minHeight="0" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<infoparam name="connector" value="" /> +<TGConnectingPoint num="0" id="1" /> +<P1 x="315" y="285" id="98" /> +<P2 x="384" y="277" id="13" /> +<AutomaticDrawing data="true" /> +<new d="false" /> +<extraparam> +<iso value="in in0(int x, Point p, bool b)" /> +<osd value="out out1(int x, Point p, bool b)" /> +<isd value="in in1(int x, Point p, bool b)" /> +<oso value="out out0(int x, Point p, bool b)" /> +<FIFOType asynchronous="false" synchronousCH="true" size="1" blocking="false" private="true" broadcast="false" lossy="false" ams="false" /> +</extraparam> +</CONNECTOR> +<COMPONENT type="5000" id="84" index="1" uid="94fc245f-ba93-486c-a741-c888fb20658d" > +<cdparam x="356" y="175" /> +<sizeparam width="229" height="228" minWidth="5" minHeight="2" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<hidden value="false" /> +<cdrectangleparam minX="10" maxX="2500" minY="10" maxY="1500" /> +<infoparam name="Block" value="B1" /> +<new d="false" /> +<TGConnectingPoint num="0" id="44" /> +<TGConnectingPoint num="1" id="45" /> +<TGConnectingPoint num="2" id="46" /> +<TGConnectingPoint num="3" id="47" /> +<TGConnectingPoint num="4" id="48" /> +<TGConnectingPoint num="5" id="49" /> +<TGConnectingPoint num="6" id="50" /> +<TGConnectingPoint num="7" id="51" /> +<TGConnectingPoint num="8" id="52" /> +<TGConnectingPoint num="9" id="53" /> +<TGConnectingPoint num="10" id="54" /> +<TGConnectingPoint num="11" id="55" /> +<TGConnectingPoint num="12" id="56" /> +<TGConnectingPoint num="13" id="57" /> +<TGConnectingPoint num="14" id="58" /> +<TGConnectingPoint num="15" id="59" /> +<TGConnectingPoint num="16" id="60" /> +<TGConnectingPoint num="17" id="61" /> +<TGConnectingPoint num="18" id="62" /> +<TGConnectingPoint num="19" id="63" /> +<TGConnectingPoint num="20" id="64" /> +<TGConnectingPoint num="21" id="65" /> +<TGConnectingPoint num="22" id="66" /> +<TGConnectingPoint num="23" id="67" /> +<TGConnectingPoint num="24" id="68" /> +<TGConnectingPoint num="25" id="69" /> +<TGConnectingPoint num="26" id="70" /> +<TGConnectingPoint num="27" id="71" /> +<TGConnectingPoint num="28" id="72" /> +<TGConnectingPoint num="29" id="73" /> +<TGConnectingPoint num="30" id="74" /> +<TGConnectingPoint num="31" id="75" /> +<TGConnectingPoint num="32" id="76" /> +<TGConnectingPoint num="33" id="77" /> +<TGConnectingPoint num="34" id="78" /> +<TGConnectingPoint num="35" id="79" /> +<TGConnectingPoint num="36" id="80" /> +<TGConnectingPoint num="37" id="81" /> +<TGConnectingPoint num="38" id="82" /> +<TGConnectingPoint num="39" id="83" /> +<extraparam> +<blockType data="block" color="-4072719" /> +<CryptoBlock value="false" /> +</extraparam> +</COMPONENT> +<SUBCOMPONENT type="5000" id="43" index="4" uid="2b8839f5-8a46-4ef8-b202-68d15fae0cbb" > +<father id="84" num="0" /> +<cdparam x="384" y="239" /> +<sizeparam width="183" height="154" minWidth="5" minHeight="2" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<hidden value="false" /> +<cdrectangleparam minX="0" maxX="46" minY="0" maxY="74" /> +<infoparam name="Block0" value="B1_0" /> +<new d="false" /> +<TGConnectingPoint num="0" id="3" /> +<TGConnectingPoint num="1" id="4" /> +<TGConnectingPoint num="2" id="5" /> +<TGConnectingPoint num="3" id="6" /> +<TGConnectingPoint num="4" id="7" /> +<TGConnectingPoint num="5" id="8" /> +<TGConnectingPoint num="6" id="9" /> +<TGConnectingPoint num="7" id="10" /> +<TGConnectingPoint num="8" id="11" /> +<TGConnectingPoint num="9" id="12" /> +<TGConnectingPoint num="10" id="13" /> +<TGConnectingPoint num="11" id="14" /> +<TGConnectingPoint num="12" id="15" /> +<TGConnectingPoint num="13" id="16" /> +<TGConnectingPoint num="14" id="17" /> +<TGConnectingPoint num="15" id="18" /> +<TGConnectingPoint num="16" id="19" /> +<TGConnectingPoint num="17" id="20" /> +<TGConnectingPoint num="18" id="21" /> +<TGConnectingPoint num="19" id="22" /> +<TGConnectingPoint num="20" id="23" /> +<TGConnectingPoint num="21" id="24" /> +<TGConnectingPoint num="22" id="25" /> +<TGConnectingPoint num="23" id="26" /> +<TGConnectingPoint num="24" id="27" /> +<TGConnectingPoint num="25" id="28" /> +<TGConnectingPoint num="26" id="29" /> +<TGConnectingPoint num="27" id="30" /> +<TGConnectingPoint num="28" id="31" /> +<TGConnectingPoint num="29" id="32" /> +<TGConnectingPoint num="30" id="33" /> +<TGConnectingPoint num="31" id="34" /> +<TGConnectingPoint num="32" id="35" /> +<TGConnectingPoint num="33" id="36" /> +<TGConnectingPoint num="34" id="37" /> +<TGConnectingPoint num="35" id="38" /> +<TGConnectingPoint num="36" id="39" /> +<TGConnectingPoint num="37" id="40" /> +<TGConnectingPoint num="38" id="41" /> +<TGConnectingPoint num="39" id="42" /> +<extraparam> +<blockType data="block" color="-4072719" /> +<CryptoBlock value="false" /> +<Attribute access="0" var="0" id="x" value="0" type="8" typeOther="" /> +<Attribute access="0" var="0" id="b" value="false" type="4" typeOther="" /> +<Attribute access="0" var="0" id="p" value="" type="5" typeOther="Point" /> +<Attribute access="0" var="0" id="t" value="" type="9" typeOther="" /> +<Signal value="in in1(int x, Point p, bool b)" attached="true" /> +<Signal value="out out1(int x, Point p, bool b)" attached="true" /> +</extraparam> +</SUBCOMPONENT> + +<COMPONENT type="5003" id="93" index="2" uid="8aa452d0-d94c-4687-872a-d8da736a353a" > +<cdparam x="235" y="77" /> +<sizeparam width="93" height="88" minWidth="5" minHeight="2" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<hidden value="false" /> +<cdrectangleparam minX="10" maxX="2500" minY="10" maxY="1500" /> +<infoparam name="DataType" value="Point" /> +<new d="false" /> +<TGConnectingPoint num="0" id="85" /> +<TGConnectingPoint num="1" id="86" /> +<TGConnectingPoint num="2" id="87" /> +<TGConnectingPoint num="3" id="88" /> +<TGConnectingPoint num="4" id="89" /> +<TGConnectingPoint num="5" id="90" /> +<TGConnectingPoint num="6" id="91" /> +<TGConnectingPoint num="7" id="92" /> +<extraparam> +<Attribute access="0" var="0" id="x" value="0" type="8" typeOther="" /> +<Attribute access="0" var="0" id="y" value="0" type="8" typeOther="" /> +</extraparam> +</COMPONENT> + +<COMPONENT type="5000" id="134" index="3" uid="06d9b9cf-d5f5-46a8-ba3d-befc1c5aff9f" > +<cdparam x="97" y="180" /> +<sizeparam width="218" height="210" minWidth="5" minHeight="2" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<hidden value="false" /> +<cdrectangleparam minX="10" maxX="2500" minY="10" maxY="1500" /> +<infoparam name="Block" value="B0" /> +<new d="false" /> +<TGConnectingPoint num="0" id="94" /> +<TGConnectingPoint num="1" id="95" /> +<TGConnectingPoint num="2" id="96" /> +<TGConnectingPoint num="3" id="97" /> +<TGConnectingPoint num="4" id="98" /> +<TGConnectingPoint num="5" id="99" /> +<TGConnectingPoint num="6" id="100" /> +<TGConnectingPoint num="7" id="101" /> +<TGConnectingPoint num="8" id="102" /> +<TGConnectingPoint num="9" id="103" /> +<TGConnectingPoint num="10" id="104" /> +<TGConnectingPoint num="11" id="105" /> +<TGConnectingPoint num="12" id="106" /> +<TGConnectingPoint num="13" id="107" /> +<TGConnectingPoint num="14" id="108" /> +<TGConnectingPoint num="15" id="109" /> +<TGConnectingPoint num="16" id="110" /> +<TGConnectingPoint num="17" id="111" /> +<TGConnectingPoint num="18" id="112" /> +<TGConnectingPoint num="19" id="113" /> +<TGConnectingPoint num="20" id="114" /> +<TGConnectingPoint num="21" id="115" /> +<TGConnectingPoint num="22" id="116" /> +<TGConnectingPoint num="23" id="117" /> +<TGConnectingPoint num="24" id="118" /> +<TGConnectingPoint num="25" id="119" /> +<TGConnectingPoint num="26" id="120" /> +<TGConnectingPoint num="27" id="121" /> +<TGConnectingPoint num="28" id="122" /> +<TGConnectingPoint num="29" id="123" /> +<TGConnectingPoint num="30" id="124" /> +<TGConnectingPoint num="31" id="125" /> +<TGConnectingPoint num="32" id="126" /> +<TGConnectingPoint num="33" id="127" /> +<TGConnectingPoint num="34" id="128" /> +<TGConnectingPoint num="35" id="129" /> +<TGConnectingPoint num="36" id="130" /> +<TGConnectingPoint num="37" id="131" /> +<TGConnectingPoint num="38" id="132" /> +<TGConnectingPoint num="39" id="133" /> +<extraparam> +<blockType data="block" color="-4072719" /> +<CryptoBlock value="false" /> +<Attribute access="0" var="0" id="x" value="" type="8" typeOther="" /> +<Attribute access="0" var="0" id="b" value="" type="4" typeOther="" /> +<Attribute access="0" var="0" id="p" value="" type="5" typeOther="Point" /> +<Attribute access="0" var="0" id="y" value="" type="8" typeOther="" /> +<Method value="Point make(int x, int y)" /> +<Method value="int getx(Point p)" /> +<Method value="foo(bool b, Point p, int x)" /> +<Signal value="in in0(int x, Point p, bool b)" attached="true" /> +<Signal value="out out0(int x, Point p, bool b)" attached="true" /> +</extraparam> +</COMPONENT> + + +</AVATARBlockDiagramPanel> + +<AVATARStateMachineDiagramPanel name="B0" minX="16" maxX="3906" minY="16" maxY="2344" zoom="1.5625" > +<CONNECTOR type="5102" id="141" index="0" uid="1146a1cf-2f3c-4f6a-9b58-131f269eed11" > +<cdparam x="359" y="240" /> +<sizeparam width="0" height="0" minWidth="0" minHeight="0" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<infoparam name="connector" value="null" /> +<TGConnectingPoint num="0" id="140" /> +<P1 x="359" y="240" id="175" /> +<P2 x="359" y="309" id="187" /> +<AutomaticDrawing data="true" /> +<new d="false" /> +</CONNECTOR><SUBCOMPONENT type="-1" id="139" index="9" uid="c3a05878-d247-4b3b-b344-d32b2ad13ad7" > +<father id="141" num="0" /> +<cdparam x="379" y="240" /> +<sizeparam width="119" height="48" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<hidden value="false" /> +<enabled value="true" /> +<cdrectangleparam minX="16" maxX="3906" minY="16" maxY="2344" /> +<infoparam name="List of all parameters of an Avatar SMD transition" value="" /> +<new d="false" /> +<TGConnectingPoint num="0" id="135" /> +<TGConnectingPoint num="1" id="136" /> +<TGConnectingPoint num="2" id="137" /> +<TGConnectingPoint num="3" id="138" /> +<extraparam> +<guard value="[ ]" enabled="true"/> +<afterMin value="" enabled="true"/> +<afterMax value="" enabled="true"/> +<extraDelay1 value="" enabled="true"/> +<extraDelay2 value="" enabled="true"/> +<delayDistributionLaw value="0" enabled="true"/> +<computeMin value="" enabled="true"/> +<computeMax value="" enabled="true"/> +<probability value="" enabled="true"/> +<actions value="p = make(x,y)" enabled="true"/> +<actions value="x = getx(p)" enabled="true"/> +</extraparam> +</SUBCOMPONENT> + +<CONNECTOR type="5102" id="148" index="1" uid="1f01956e-7a84-47df-9fd9-f7a45d1e5f4c" > +<cdparam x="172" y="610" /> +<sizeparam width="0" height="0" minWidth="0" minHeight="0" maxWidth="3125" maxHeight="3125" minDesiredWidth="0" minDesiredHeight="0" /> +<infoparam name="connector" value="null" /> +<TGConnectingPoint num="0" id="147" /> +<P1 x="359" y="446" id="164" /> +<P2 x="359" y="493" id="185" /> +<AutomaticDrawing data="true" /> +<new d="false" /> +</CONNECTOR><SUBCOMPONENT type="-1" id="146" index="10" uid="de96ca94-86cb-4bf3-b63e-421a93ccfc67" > +<father id="148" num="0" /> +<cdparam x="172" y="668" /> +<sizeparam width="50" height="25" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<hidden value="false" /> +<enabled value="true" /> +<cdrectangleparam minX="10" maxX="3906" minY="10" maxY="2343" /> +<infoparam name="List of all parameters of an Avatar SMD transition" value="" /> +<new d="false" /> +<TGConnectingPoint num="0" id="142" /> +<TGConnectingPoint num="1" id="143" /> +<TGConnectingPoint num="2" id="144" /> +<TGConnectingPoint num="3" id="145" /> +<extraparam> +<guard value="[ ]" enabled="true"/> +<afterMin value="" enabled="true"/> +<afterMax value="" enabled="true"/> +<extraDelay1 value="" enabled="true"/> +<extraDelay2 value="" enabled="true"/> +<delayDistributionLaw value="0" enabled="true"/> +<computeMin value="" enabled="true"/> +<computeMax value="" enabled="true"/> +<probability value="" enabled="true"/> +</extraparam> +</SUBCOMPONENT> + +<CONNECTOR type="5102" id="155" index="2" uid="1a1f75f0-3055-4d7a-aa5a-4a70634e3484" > +<cdparam x="278" y="537" /> +<sizeparam width="0" height="0" minWidth="0" minHeight="0" maxWidth="3125" maxHeight="3125" minDesiredWidth="0" minDesiredHeight="0" /> +<infoparam name="connector" value="null" /> +<TGConnectingPoint num="0" id="154" /> +<P1 x="359" y="354" id="188" /> +<P2 x="359" y="401" id="163" /> +<AutomaticDrawing data="true" /> +<new d="false" /> +</CONNECTOR><SUBCOMPONENT type="-1" id="153" index="11" uid="14ed42f2-4c94-4e0a-9a05-d5bc511d1aa5" > +<father id="155" num="0" /> +<cdparam x="378" y="350" /> +<sizeparam width="107" height="48" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<hidden value="false" /> +<enabled value="true" /> +<cdrectangleparam minX="10" maxX="3906" minY="10" maxY="2343" /> +<infoparam name="List of all parameters of an Avatar SMD transition" value="" /> +<new d="false" /> +<TGConnectingPoint num="0" id="149" /> +<TGConnectingPoint num="1" id="150" /> +<TGConnectingPoint num="2" id="151" /> +<TGConnectingPoint num="3" id="152" /> +<extraparam> +<guard value="[p.x>4 ]" enabled="true"/> +<afterMin value="" enabled="true"/> +<afterMax value="" enabled="true"/> +<extraDelay1 value="" enabled="true"/> +<extraDelay2 value="" enabled="true"/> +<delayDistributionLaw value="0" enabled="true"/> +<computeMin value="" enabled="true"/> +<computeMax value="" enabled="true"/> +<probability value="" enabled="true"/> +<actions value="foo(b,p,x)" enabled="true"/> +</extraparam> +</SUBCOMPONENT> + +<CONNECTOR type="5102" id="162" index="3" uid="833ce51f-ce8d-402a-819a-526a0071f83a" > +<cdparam x="356" y="181" /> +<sizeparam width="0" height="0" minWidth="0" minHeight="0" maxWidth="3125" maxHeight="3125" minDesiredWidth="0" minDesiredHeight="0" /> +<infoparam name="connector" value="null" /> +<TGConnectingPoint num="0" id="161" /> +<P1 x="359" y="74" id="190" /> +<P2 x="359" y="195" id="174" /> +<AutomaticDrawing data="true" /> +<new d="false" /> +</CONNECTOR><SUBCOMPONENT type="-1" id="160" index="12" uid="dd687934-2033-4ae7-a9a0-36d732978073" > +<father id="162" num="0" /> +<cdparam x="380" y="75" /> +<sizeparam width="112" height="94" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<hidden value="false" /> +<enabled value="true" /> +<cdrectangleparam minX="10" maxX="3906" minY="10" maxY="2343" /> +<infoparam name="List of all parameters of an Avatar SMD transition" value="" /> +<new d="false" /> +<TGConnectingPoint num="0" id="156" /> +<TGConnectingPoint num="1" id="157" /> +<TGConnectingPoint num="2" id="158" /> +<TGConnectingPoint num="3" id="159" /> +<extraparam> +<guard value="[ ]" enabled="true"/> +<afterMin value="1" enabled="true"/> +<afterMax value="p.x" enabled="true"/> +<extraDelay1 value="" enabled="true"/> +<extraDelay2 value="" enabled="true"/> +<delayDistributionLaw value="0" enabled="true"/> +<computeMin value="" enabled="true"/> +<computeMax value="" enabled="true"/> +<probability value="" enabled="true"/> +<actions value="x = 1" enabled="true"/> +<actions value="b = true" enabled="true"/> +<actions value="p.x = x" enabled="true"/> +</extraparam> +</SUBCOMPONENT> + +<COMPONENT type="5104" id="173" index="4" uid="507ab36b-12af-40a9-b4d3-d1687f4ee635" > +<cdparam x="303" y="408" /> +<sizeparam width="113" height="31" minWidth="30" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<hidden value="false" /> +<enabled value="true" /> +<cdrectangleparam minX="10" maxX="2499" minY="10" maxY="1500" /> +<infoparam name="Receive signal" value="in0(x, p, b)" /> +<new d="false" /> +<TGConnectingPoint num="0" id="163" /> +<TGConnectingPoint num="1" id="164" /> +<TGConnectingPoint num="2" id="165" /> +<TGConnectingPoint num="3" id="166" /> +<TGConnectingPoint num="4" id="167" /> +<TGConnectingPoint num="5" id="168" /> +<TGConnectingPoint num="6" id="169" /> +<TGConnectingPoint num="7" id="170" /> +<TGConnectingPoint num="8" id="171" /> +<TGConnectingPoint num="9" id="172" /> +</COMPONENT> + +<COMPONENT type="5103" id="184" index="5" uid="83bfdfcd-2185-424c-ad19-260ec86acd32" > +<cdparam x="301" y="202" /> +<sizeparam width="116" height="31" minWidth="30" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<hidden value="false" /> +<enabled value="true" /> +<cdrectangleparam minX="10" maxX="2499" minY="10" maxY="1500" /> +<infoparam name="Send signal" value="out0(x, p, b)" /> +<new d="false" /> +<TGConnectingPoint num="0" id="174" /> +<TGConnectingPoint num="1" id="175" /> +<TGConnectingPoint num="2" id="176" /> +<TGConnectingPoint num="3" id="177" /> +<TGConnectingPoint num="4" id="178" /> +<TGConnectingPoint num="5" id="179" /> +<TGConnectingPoint num="6" id="180" /> +<TGConnectingPoint num="7" id="181" /> +<TGConnectingPoint num="8" id="182" /> +<TGConnectingPoint num="9" id="183" /> +</COMPONENT> + +<COMPONENT type="5101" id="186" index="6" uid="4c83d303-bd2a-4705-9638-d3da5a6d30ba" > +<cdparam x="344" y="500" /> +<sizeparam width="31" height="31" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<hidden value="false" /> +<cdrectangleparam minX="16" maxX="3906" minY="16" maxY="2344" /> +<infoparam name="stop state" value="null" /> +<new d="false" /> +<TGConnectingPoint num="0" id="185" /> +</COMPONENT> + +<COMPONENT type="5108" id="189" index="7" uid="c8fc7cc9-d99c-4e2d-b466-4e440c0ba0d7" > +<cdparam x="261" y="316" /> +<sizeparam width="196" height="31" minWidth="46" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<hidden value="false" /> +<enabled value="true" /> +<cdrectangleparam minX="10" maxX="2499" minY="10" maxY="1500" /> +<infoparam name="TGComponent" value="null" /> +<new d="false" /> +<TGConnectingPoint num="0" id="187" /> +<TGConnectingPoint num="1" id="188" /> +<extraparam> +<Data variable="x" minValue="0" maxValue="p.y" functionId="0" extraAttribute1="" extraAttribute2="" /> +</extraparam> +</COMPONENT> + +<COMPONENT type="5100" id="191" index="8" uid="02d7e1f1-28a4-4403-9e64-d6a4786cea7d" > +<cdparam x="348" y="44" /> +<sizeparam width="23" height="23" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<hidden value="false" /> +<cdrectangleparam minX="10" maxX="2499" minY="10" maxY="1500" /> +<infoparam name="start state" value="null" /> +<new d="false" /> +<TGConnectingPoint num="0" id="190" /> +</COMPONENT> + + +</AVATARStateMachineDiagramPanel> + +<AVATARStateMachineDiagramPanel name="B1" minX="10" maxX="2500" minY="10" maxY="1500" zoom="1.0" > +<COMPONENT type="5100" id="193" index="0" uid="5ee8db59-2cb6-4210-9cac-0363ba606b88" > +<cdparam x="400" y="50" /> +<sizeparam width="15" height="15" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<hidden value="false" /> +<cdrectangleparam minX="10" maxX="2500" minY="10" maxY="1500" /> +<infoparam name="start state" value="null" /> +<new d="false" /> +<TGConnectingPoint num="0" id="192" /> +</COMPONENT> + + +</AVATARStateMachineDiagramPanel> + +<AVATARStateMachineDiagramPanel name="B1_0" minX="10" maxX="2500" minY="10" maxY="1500" zoom="1.0" > +<CONNECTOR type="5102" id="206" index="0" uid="74d4d087-22e6-4735-a473-2b777a473eee" > +<cdparam x="519" y="439" /> +<sizeparam width="0" height="0" minWidth="0" minHeight="0" maxWidth="1280" maxHeight="1280" minDesiredWidth="0" minDesiredHeight="0" /> +<infoparam name="connector" value="null" /> +<TGConnectingPoint num="0" id="202" /> +<TGConnectingPoint num="1" id="203" /> +<TGConnectingPoint num="2" id="204" /> +<TGConnectingPoint num="3" id="205" /> +<P1 x="484" y="427" id="277" /> +<P2 x="404" y="223" id="386" /> +<Point x="484" y="439" /> +<Point x="535" y="439" /> +<Point x="535" y="223" /> +<AutomaticDrawing data="true" /> +<new d="false" /> +</CONNECTOR><SUBCOMPONENT type="-1" id="194" index="19" uid="36a4768a-9652-43bb-845d-209be2c965da" > +<father id="206" num="0" /> +<cdparam x="484" y="439" /> +<sizeparam width="8" height="8" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<hidden value="false" /> +<cdrectangleparam minX="16" maxX="2499" minY="16" maxY="1500" /> +<infoparam name="point " value="null" /> +<new d="false" /> +</SUBCOMPONENT> +<SUBCOMPONENT type="-1" id="195" index="20" uid="39ef4810-055d-4eaf-a409-784ef6b1a786" > +<father id="206" num="1" /> +<cdparam x="535" y="439" /> +<sizeparam width="8" height="8" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<hidden value="false" /> +<cdrectangleparam minX="16" maxX="2499" minY="16" maxY="1500" /> +<infoparam name="point " value="null" /> +<new d="false" /> +</SUBCOMPONENT> +<SUBCOMPONENT type="-1" id="196" index="21" uid="026cf268-175f-4163-a255-750c9c778d1d" > +<father id="206" num="2" /> +<cdparam x="535" y="223" /> +<sizeparam width="8" height="8" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<hidden value="false" /> +<cdrectangleparam minX="16" maxX="2499" minY="16" maxY="1500" /> +<infoparam name="point " value="null" /> +<new d="false" /> +</SUBCOMPONENT> +<SUBCOMPONENT type="-1" id="201" index="22" uid="7270605d-c970-425f-8bf8-b5065cf75ec2" > +<father id="206" num="3" /> +<cdparam x="438" y="311" /> +<sizeparam width="50" height="25" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<hidden value="false" /> +<enabled value="true" /> +<cdrectangleparam minX="16" maxX="2499" minY="16" maxY="1500" /> +<infoparam name="List of all parameters of an Avatar SMD transition" value="" /> +<new d="false" /> +<TGConnectingPoint num="0" id="197" /> +<TGConnectingPoint num="1" id="198" /> +<TGConnectingPoint num="2" id="199" /> +<TGConnectingPoint num="3" id="200" /> +<extraparam> +<guard value="[ ]" enabled="true"/> +<afterMin value="" enabled="true"/> +<afterMax value="" enabled="true"/> +<extraDelay1 value="" enabled="true"/> +<extraDelay2 value="" enabled="true"/> +<delayDistributionLaw value="0" enabled="true"/> +<computeMin value="" enabled="true"/> +<computeMax value="" enabled="true"/> +<probability value="" enabled="true"/> +</extraparam> +</SUBCOMPONENT> + +<CONNECTOR type="5102" id="213" index="1" uid="928bb940-f1ee-436c-9f17-4857b6f782aa" > +<cdparam x="484" y="373" /> +<sizeparam width="0" height="0" minWidth="0" minHeight="0" maxWidth="1280" maxHeight="1280" minDesiredWidth="0" minDesiredHeight="0" /> +<infoparam name="connector" value="null" /> +<TGConnectingPoint num="0" id="212" /> +<P1 x="485" y="373" id="329" /> +<P2 x="484" y="397" id="276" /> +<AutomaticDrawing data="true" /> +<new d="false" /> +</CONNECTOR><SUBCOMPONENT type="-1" id="211" index="23" uid="0213b0ca-9329-414a-80ad-7921a4d9583b" > +<father id="213" num="0" /> +<cdparam x="501" y="391" /> +<sizeparam width="50" height="25" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<hidden value="false" /> +<enabled value="true" /> +<cdrectangleparam minX="16" maxX="2499" minY="16" maxY="1500" /> +<infoparam name="List of all parameters of an Avatar SMD transition" value="" /> +<new d="false" /> +<TGConnectingPoint num="0" id="207" /> +<TGConnectingPoint num="1" id="208" /> +<TGConnectingPoint num="2" id="209" /> +<TGConnectingPoint num="3" id="210" /> +<extraparam> +<guard value="[ ]" enabled="true"/> +<afterMin value="" enabled="true"/> +<afterMax value="" enabled="true"/> +<extraDelay1 value="" enabled="true"/> +<extraDelay2 value="" enabled="true"/> +<delayDistributionLaw value="0" enabled="true"/> +<computeMin value="" enabled="true"/> +<computeMax value="" enabled="true"/> +<probability value="" enabled="true"/> +</extraparam> +</SUBCOMPONENT> + +<CONNECTOR type="5102" id="226" index="2" uid="bc2e2186-ed41-4917-b20c-6144ac1bf4d7" > +<cdparam x="429" y="424" /> +<sizeparam width="0" height="0" minWidth="0" minHeight="0" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<infoparam name="connector" value="null" /> +<TGConnectingPoint num="0" id="222" /> +<TGConnectingPoint num="1" id="223" /> +<TGConnectingPoint num="2" id="224" /> +<TGConnectingPoint num="3" id="225" /> +<P1 x="410" y="428" id="288" /> +<P2 x="398" y="348" id="301" /> +<Point x="409" y="441" /> +<Point x="366" y="441" /> +<Point x="366" y="348" /> +<AutomaticDrawing data="true" /> +<new d="false" /> +</CONNECTOR><SUBCOMPONENT type="-1" id="214" index="24" uid="0de4328e-37e4-435d-81e5-d1d840c7b967" > +<father id="226" num="0" /> +<cdparam x="409" y="441" /> +<sizeparam width="8" height="8" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<hidden value="false" /> +<cdrectangleparam minX="10" maxX="2499" minY="10" maxY="1499" /> +<infoparam name="point " value="null" /> +<new d="false" /> +</SUBCOMPONENT> +<SUBCOMPONENT type="-1" id="215" index="25" uid="4cdf03f5-ab6b-4197-961f-5725ef18f4c2" > +<father id="226" num="1" /> +<cdparam x="366" y="441" /> +<sizeparam width="8" height="8" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<hidden value="false" /> +<cdrectangleparam minX="10" maxX="2499" minY="10" maxY="1499" /> +<infoparam name="point " value="null" /> +<new d="false" /> +</SUBCOMPONENT> +<SUBCOMPONENT type="-1" id="216" index="26" uid="c81192a6-0500-4f55-b09a-6458263194a2" > +<father id="226" num="2" /> +<cdparam x="366" y="348" /> +<sizeparam width="8" height="8" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<hidden value="false" /> +<cdrectangleparam minX="10" maxX="2499" minY="10" maxY="1499" /> +<infoparam name="point " value="null" /> +<new d="false" /> +</SUBCOMPONENT> +<SUBCOMPONENT type="-1" id="221" index="27" uid="fe9df050-f3a4-40b9-be8f-2206708a7e69" > +<father id="226" num="3" /> +<cdparam x="413" y="386" /> +<sizeparam width="50" height="25" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<hidden value="false" /> +<enabled value="true" /> +<cdrectangleparam minX="10" maxX="2499" minY="10" maxY="1499" /> +<infoparam name="List of all parameters of an Avatar SMD transition" value="" /> +<new d="false" /> +<TGConnectingPoint num="0" id="217" /> +<TGConnectingPoint num="1" id="218" /> +<TGConnectingPoint num="2" id="219" /> +<TGConnectingPoint num="3" id="220" /> +<extraparam> +<guard value="[ ]" enabled="true"/> +<afterMin value="" enabled="true"/> +<afterMax value="" enabled="true"/> +<extraDelay1 value="" enabled="true"/> +<extraDelay2 value="" enabled="true"/> +<delayDistributionLaw value="0" enabled="true"/> +<computeMin value="" enabled="true"/> +<computeMax value="" enabled="true"/> +<probability value="" enabled="true"/> +</extraparam> +</SUBCOMPONENT> + +<CONNECTOR type="5102" id="233" index="3" uid="fbada9ae-ff5e-4412-920c-379b7fa44bea" > +<cdparam x="422" y="373" /> +<sizeparam width="0" height="0" minWidth="0" minHeight="0" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<infoparam name="connector" value="null" /> +<TGConnectingPoint num="0" id="232" /> +<P1 x="410" y="373" id="326" /> +<P2 x="410" y="398" id="287" /> +<AutomaticDrawing data="true" /> +<new d="false" /> +</CONNECTOR><SUBCOMPONENT type="-1" id="231" index="28" uid="7a339b9b-cfe9-41af-9206-3daa79b45745" > +<father id="233" num="0" /> +<cdparam x="425" y="384" /> +<sizeparam width="50" height="25" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<hidden value="false" /> +<enabled value="true" /> +<cdrectangleparam minX="10" maxX="2499" minY="10" maxY="1499" /> +<infoparam name="List of all parameters of an Avatar SMD transition" value="" /> +<new d="false" /> +<TGConnectingPoint num="0" id="227" /> +<TGConnectingPoint num="1" id="228" /> +<TGConnectingPoint num="2" id="229" /> +<TGConnectingPoint num="3" id="230" /> +<extraparam> +<guard value="[ ]" enabled="true"/> +<afterMin value="" enabled="true"/> +<afterMax value="" enabled="true"/> +<extraDelay1 value="" enabled="true"/> +<extraDelay2 value="" enabled="true"/> +<delayDistributionLaw value="0" enabled="true"/> +<computeMin value="" enabled="true"/> +<computeMax value="" enabled="true"/> +<probability value="" enabled="true"/> +</extraparam> +</SUBCOMPONENT> + +<CONNECTOR type="5102" id="240" index="4" uid="90c7cded-4725-4883-8841-04e2104531d6" > +<cdparam x="397" y="278" /> +<sizeparam width="0" height="0" minWidth="0" minHeight="0" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<infoparam name="connector" value="null" /> +<TGConnectingPoint num="0" id="239" /> +<P1 x="409" y="301" id="372" /> +<P2 x="410" y="323" id="314" /> +<AutomaticDrawing data="true" /> +<new d="false" /> +</CONNECTOR><SUBCOMPONENT type="-1" id="238" index="29" uid="2b987670-9d6b-4c27-96f4-d6b309ccfb2e" > +<father id="240" num="0" /> +<cdparam x="396" y="295" /> +<sizeparam width="50" height="25" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<hidden value="false" /> +<enabled value="true" /> +<cdrectangleparam minX="10" maxX="2499" minY="10" maxY="1499" /> +<infoparam name="List of all parameters of an Avatar SMD transition" value="" /> +<new d="false" /> +<TGConnectingPoint num="0" id="234" /> +<TGConnectingPoint num="1" id="235" /> +<TGConnectingPoint num="2" id="236" /> +<TGConnectingPoint num="3" id="237" /> +<extraparam> +<guard value="[ ]" enabled="true"/> +<afterMin value="" enabled="true"/> +<afterMax value="" enabled="true"/> +<extraDelay1 value="" enabled="true"/> +<extraDelay2 value="" enabled="true"/> +<delayDistributionLaw value="0" enabled="true"/> +<computeMin value="" enabled="true"/> +<computeMax value="" enabled="true"/> +<probability value="" enabled="true"/> +</extraparam> +</SUBCOMPONENT> + +<CONNECTOR type="5102" id="247" index="5" uid="6fa3f361-9845-4556-8ba4-a3a14d3111d5" > +<cdparam x="358" y="209" /> +<sizeparam width="0" height="0" minWidth="0" minHeight="0" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<infoparam name="connector" value="null" /> +<TGConnectingPoint num="0" id="246" /> +<P1 x="391" y="248" id="413" /> +<P2 x="409" y="271" id="371" /> +<AutomaticDrawing data="true" /> +<new d="false" /> +</CONNECTOR><SUBCOMPONENT type="-1" id="245" index="30" uid="3df7dee5-1456-4a30-9e72-50704be7af2b" > +<father id="247" num="0" /> +<cdparam x="411" y="248" /> +<sizeparam width="50" height="25" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<hidden value="false" /> +<enabled value="true" /> +<cdrectangleparam minX="10" maxX="2499" minY="10" maxY="1499" /> +<infoparam name="List of all parameters of an Avatar SMD transition" value="" /> +<new d="false" /> +<TGConnectingPoint num="0" id="241" /> +<TGConnectingPoint num="1" id="242" /> +<TGConnectingPoint num="2" id="243" /> +<TGConnectingPoint num="3" id="244" /> +<extraparam> +<guard value="[ ]" enabled="true"/> +<afterMin value="" enabled="true"/> +<afterMax value="" enabled="true"/> +<extraDelay1 value="" enabled="true"/> +<extraDelay2 value="" enabled="true"/> +<delayDistributionLaw value="0" enabled="true"/> +<computeMin value="" enabled="true"/> +<computeMax value="" enabled="true"/> +<probability value="" enabled="true"/> +<actions value="x = 2" enabled="true"/> +</extraparam> +</SUBCOMPONENT> + +<CONNECTOR type="5102" id="254" index="6" uid="08f30cae-8315-4af1-ba7e-c7b1d755e30f" > +<cdparam x="295" y="209" /> +<sizeparam width="0" height="0" minWidth="0" minHeight="0" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<infoparam name="connector" value="null" /> +<TGConnectingPoint num="0" id="253" /> +<P1 x="316" y="248" id="410" /> +<P2 x="298" y="271" id="468" /> +<AutomaticDrawing data="true" /> +<new d="false" /> +</CONNECTOR><SUBCOMPONENT type="-1" id="252" index="31" uid="50d6509f-dd5f-4b32-9fa5-cf9bf9197a97" > +<father id="254" num="0" /> +<cdparam x="216" y="227" /> +<sizeparam width="50" height="25" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<hidden value="false" /> +<enabled value="true" /> +<cdrectangleparam minX="10" maxX="2499" minY="10" maxY="1499" /> +<infoparam name="List of all parameters of an Avatar SMD transition" value="" /> +<new d="false" /> +<TGConnectingPoint num="0" id="248" /> +<TGConnectingPoint num="1" id="249" /> +<TGConnectingPoint num="2" id="250" /> +<TGConnectingPoint num="3" id="251" /> +<extraparam> +<guard value="[ ]" enabled="true"/> +<afterMin value="" enabled="true"/> +<afterMax value="" enabled="true"/> +<extraDelay1 value="" enabled="true"/> +<extraDelay2 value="" enabled="true"/> +<delayDistributionLaw value="0" enabled="true"/> +<computeMin value="" enabled="true"/> +<computeMax value="" enabled="true"/> +<probability value="" enabled="true"/> +</extraparam> +</SUBCOMPONENT> + +<CONNECTOR type="5102" id="261" index="7" uid="5c51932f-46f4-459a-9797-88581a319459" > +<cdparam x="292" y="226" /> +<sizeparam width="0" height="0" minWidth="0" minHeight="0" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<infoparam name="connector" value="null" /> +<TGConnectingPoint num="0" id="260" /> +<P1 x="298" y="299" id="469" /> +<P2 x="298" y="345" id="455" /> +<AutomaticDrawing data="true" /> +<new d="false" /> +</CONNECTOR><SUBCOMPONENT type="-1" id="259" index="32" uid="ea67405d-8c98-415c-9bf0-24fdf4cb37c4" > +<father id="261" num="0" /> +<cdparam x="269" y="242" /> +<sizeparam width="73" height="25" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<hidden value="false" /> +<enabled value="true" /> +<cdrectangleparam minX="10" maxX="2499" minY="10" maxY="1499" /> +<infoparam name="List of all parameters of an Avatar SMD transition" value="" /> +<new d="false" /> +<TGConnectingPoint num="0" id="255" /> +<TGConnectingPoint num="1" id="256" /> +<TGConnectingPoint num="2" id="257" /> +<TGConnectingPoint num="3" id="258" /> +<extraparam> +<guard value="[ ]" enabled="true"/> +<afterMin value="" enabled="true"/> +<afterMax value="" enabled="true"/> +<extraDelay1 value="" enabled="true"/> +<extraDelay2 value="" enabled="true"/> +<delayDistributionLaw value="0" enabled="true"/> +<computeMin value="" enabled="true"/> +<computeMax value="" enabled="true"/> +<probability value="" enabled="true"/> +<userResized /> +</extraparam> +</SUBCOMPONENT> + +<CONNECTOR type="5102" id="268" index="8" uid="9fbaf0a3-016c-40cc-952d-2d93b5149e83" > +<cdparam x="292" y="163" /> +<sizeparam width="0" height="0" minWidth="0" minHeight="0" maxWidth="1280" maxHeight="1280" minDesiredWidth="0" minDesiredHeight="0" /> +<infoparam name="connector" value="null" /> +<TGConnectingPoint num="0" id="267" /> +<P1 x="353" y="178" id="479" /> +<P2 x="354" y="198" id="383" /> +<AutomaticDrawing data="true" /> +<new d="false" /> +</CONNECTOR><SUBCOMPONENT type="-1" id="266" index="33" uid="ad8b960b-ba33-44a2-9bb8-9ea351468048" > +<father id="268" num="0" /> +<cdparam x="288" y="112" /> +<sizeparam width="50" height="25" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<hidden value="false" /> +<enabled value="true" /> +<cdrectangleparam minX="16" maxX="2497" minY="16" maxY="1499" /> +<infoparam name="List of all parameters of an Avatar SMD transition" value="" /> +<new d="false" /> +<TGConnectingPoint num="0" id="262" /> +<TGConnectingPoint num="1" id="263" /> +<TGConnectingPoint num="2" id="264" /> +<TGConnectingPoint num="3" id="265" /> +<extraparam> +<guard value="[ ]" enabled="true"/> +<afterMin value="" enabled="true"/> +<afterMax value="" enabled="true"/> +<extraDelay1 value="" enabled="true"/> +<extraDelay2 value="" enabled="true"/> +<delayDistributionLaw value="0" enabled="true"/> +<computeMin value="" enabled="true"/> +<computeMax value="" enabled="true"/> +<probability value="" enabled="true"/> +</extraparam> +</SUBCOMPONENT> + +<CONNECTOR type="5102" id="275" index="9" uid="fd4f056d-39b0-4db4-b956-fe6fd3013328" > +<cdparam x="298" y="285" /> +<sizeparam width="0" height="0" minWidth="0" minHeight="0" maxWidth="1280" maxHeight="1280" minDesiredWidth="0" minDesiredHeight="0" /> +<infoparam name="connector" value="null" /> +<TGConnectingPoint num="0" id="274" /> +<P1 x="298" y="373" id="456" /> +<P2 x="298" y="423" id="466" /> +<AutomaticDrawing data="true" /> +<new d="false" /> +</CONNECTOR><SUBCOMPONENT type="-1" id="273" index="34" uid="80004114-d230-4100-8abd-0089257c3b74" > +<father id="275" num="0" /> +<cdparam x="297" y="305" /> +<sizeparam width="50" height="25" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<hidden value="false" /> +<enabled value="true" /> +<cdrectangleparam minX="16" maxX="2497" minY="16" maxY="1499" /> +<infoparam name="List of all parameters of an Avatar SMD transition" value="" /> +<new d="false" /> +<TGConnectingPoint num="0" id="269" /> +<TGConnectingPoint num="1" id="270" /> +<TGConnectingPoint num="2" id="271" /> +<TGConnectingPoint num="3" id="272" /> +<extraparam> +<guard value="[ ]" enabled="true"/> +<afterMin value="" enabled="true"/> +<afterMax value="" enabled="true"/> +<extraDelay1 value="" enabled="true"/> +<extraDelay2 value="" enabled="true"/> +<delayDistributionLaw value="0" enabled="true"/> +<computeMin value="" enabled="true"/> +<computeMax value="" enabled="true"/> +<probability value="" enabled="true"/> +</extraparam> +</SUBCOMPONENT> + +<COMPONENT type="5111" id="286" index="10" uid="62c92403-5ee8-445e-bf96-3e600f59a4b9" > +<cdparam x="451" y="402" /> +<sizeparam width="66" height="20" minWidth="30" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<hidden value="false" /> +<enabled value="true" /> +<cdrectangleparam minX="10" maxX="2500" minY="10" maxY="1500" /> +<infoparam name="Reset timer" value="expire(t)" /> +<new d="false" /> +<TGConnectingPoint num="0" id="276" /> +<TGConnectingPoint num="1" id="277" /> +<TGConnectingPoint num="2" id="278" /> +<TGConnectingPoint num="3" id="279" /> +<TGConnectingPoint num="4" id="280" /> +<TGConnectingPoint num="5" id="281" /> +<TGConnectingPoint num="6" id="282" /> +<TGConnectingPoint num="7" id="283" /> +<TGConnectingPoint num="8" id="284" /> +<TGConnectingPoint num="9" id="285" /> +</COMPONENT> + +<COMPONENT type="5110" id="297" index="11" uid="491c316f-9dd9-4849-979f-c56b1fd77a3c" > +<cdparam x="385" y="403" /> +<sizeparam width="51" height="20" minWidth="40" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<hidden value="false" /> +<enabled value="true" /> +<cdrectangleparam minX="10" maxX="2500" minY="10" maxY="1500" /> +<infoparam name="Reset timer" value="reset(t)" /> +<new d="false" /> +<TGConnectingPoint num="0" id="287" /> +<TGConnectingPoint num="1" id="288" /> +<TGConnectingPoint num="2" id="289" /> +<TGConnectingPoint num="3" id="290" /> +<TGConnectingPoint num="4" id="291" /> +<TGConnectingPoint num="5" id="292" /> +<TGConnectingPoint num="6" id="293" /> +<TGConnectingPoint num="7" id="294" /> +<TGConnectingPoint num="8" id="295" /> +<TGConnectingPoint num="9" id="296" /> +</COMPONENT> + +<COMPONENT type="5106" id="370" index="12" uid="153cbc7a-51c9-4403-b1fa-af4ed8ae661e" > +<cdparam x="398" y="323" /> +<sizeparam width="100" height="50" minWidth="54" minHeight="40" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<hidden value="false" /> +<enabled value="true" /> +<cdrectangleparam minX="10" maxX="2500" minY="10" maxY="1500" /> +<infoparam name="state" value="state2" /> +<new d="false" /> +<TGConnectingPoint num="0" id="298" /> +<TGConnectingPoint num="1" id="299" /> +<TGConnectingPoint num="2" id="300" /> +<TGConnectingPoint num="3" id="301" /> +<TGConnectingPoint num="4" id="302" /> +<TGConnectingPoint num="5" id="303" /> +<TGConnectingPoint num="6" id="304" /> +<TGConnectingPoint num="7" id="305" /> +<TGConnectingPoint num="8" id="306" /> +<TGConnectingPoint num="9" id="307" /> +<TGConnectingPoint num="10" id="308" /> +<TGConnectingPoint num="11" id="309" /> +<TGConnectingPoint num="12" id="310" /> +<TGConnectingPoint num="13" id="311" /> +<TGConnectingPoint num="14" id="312" /> +<TGConnectingPoint num="15" id="313" /> +<TGConnectingPoint num="16" id="314" /> +<TGConnectingPoint num="17" id="315" /> +<TGConnectingPoint num="18" id="316" /> +<TGConnectingPoint num="19" id="317" /> +<TGConnectingPoint num="20" id="318" /> +<TGConnectingPoint num="21" id="319" /> +<TGConnectingPoint num="22" id="320" /> +<TGConnectingPoint num="23" id="321" /> +<TGConnectingPoint num="24" id="322" /> +<TGConnectingPoint num="25" id="323" /> +<TGConnectingPoint num="26" id="324" /> +<TGConnectingPoint num="27" id="325" /> +<TGConnectingPoint num="28" id="326" /> +<TGConnectingPoint num="29" id="327" /> +<TGConnectingPoint num="30" id="328" /> +<TGConnectingPoint num="31" id="329" /> +<TGConnectingPoint num="32" id="330" /> +<TGConnectingPoint num="33" id="331" /> +<TGConnectingPoint num="34" id="332" /> +<TGConnectingPoint num="35" id="333" /> +<TGConnectingPoint num="36" id="334" /> +<TGConnectingPoint num="37" id="335" /> +<TGConnectingPoint num="38" id="336" /> +<TGConnectingPoint num="39" id="337" /> +<TGConnectingPoint num="40" id="338" /> +<TGConnectingPoint num="41" id="339" /> +<TGConnectingPoint num="42" id="340" /> +<TGConnectingPoint num="43" id="341" /> +<TGConnectingPoint num="44" id="342" /> +<TGConnectingPoint num="45" id="343" /> +<TGConnectingPoint num="46" id="344" /> +<TGConnectingPoint num="47" id="345" /> +<TGConnectingPoint num="48" id="346" /> +<TGConnectingPoint num="49" id="347" /> +<TGConnectingPoint num="50" id="348" /> +<TGConnectingPoint num="51" id="349" /> +<TGConnectingPoint num="52" id="350" /> +<TGConnectingPoint num="53" id="351" /> +<TGConnectingPoint num="54" id="352" /> +<TGConnectingPoint num="55" id="353" /> +<TGConnectingPoint num="56" id="354" /> +<TGConnectingPoint num="57" id="355" /> +<TGConnectingPoint num="58" id="356" /> +<TGConnectingPoint num="59" id="357" /> +<TGConnectingPoint num="60" id="358" /> +<TGConnectingPoint num="61" id="359" /> +<TGConnectingPoint num="62" id="360" /> +<TGConnectingPoint num="63" id="361" /> +<TGConnectingPoint num="64" id="362" /> +<TGConnectingPoint num="65" id="363" /> +<TGConnectingPoint num="66" id="364" /> +<TGConnectingPoint num="67" id="365" /> +<TGConnectingPoint num="68" id="366" /> +<TGConnectingPoint num="69" id="367" /> +<TGConnectingPoint num="70" id="368" /> +<TGConnectingPoint num="71" id="369" /> +<extraparam> +</extraparam> +</COMPONENT> + +<COMPONENT type="5109" id="381" index="13" uid="83cdd050-a535-466f-a3bc-8910fe1b1c16" > +<cdparam x="364" y="276" /> +<sizeparam width="91" height="20" minWidth="40" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<hidden value="false" /> +<enabled value="true" /> +<cdrectangleparam minX="10" maxX="2500" minY="10" maxY="1500" /> +<infoparam name="Set timer" value="setTimer(t,10)" /> +<new d="false" /> +<TGConnectingPoint num="0" id="371" /> +<TGConnectingPoint num="1" id="372" /> +<TGConnectingPoint num="2" id="373" /> +<TGConnectingPoint num="3" id="374" /> +<TGConnectingPoint num="4" id="375" /> +<TGConnectingPoint num="5" id="376" /> +<TGConnectingPoint num="6" id="377" /> +<TGConnectingPoint num="7" id="378" /> +<TGConnectingPoint num="8" id="379" /> +<TGConnectingPoint num="9" id="380" /> +</COMPONENT> + +<COMPONENT type="5106" id="454" index="14" uid="2d76bc2d-5cb6-43ee-8143-f800f7bc2c0f" > +<cdparam x="304" y="198" /> +<sizeparam width="100" height="50" minWidth="54" minHeight="40" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<hidden value="false" /> +<enabled value="true" /> +<cdrectangleparam minX="10" maxX="2500" minY="10" maxY="1500" /> +<infoparam name="state" value="state1" /> +<new d="false" /> +<TGConnectingPoint num="0" id="382" /> +<TGConnectingPoint num="1" id="383" /> +<TGConnectingPoint num="2" id="384" /> +<TGConnectingPoint num="3" id="385" /> +<TGConnectingPoint num="4" id="386" /> +<TGConnectingPoint num="5" id="387" /> +<TGConnectingPoint num="6" id="388" /> +<TGConnectingPoint num="7" id="389" /> +<TGConnectingPoint num="8" id="390" /> +<TGConnectingPoint num="9" id="391" /> +<TGConnectingPoint num="10" id="392" /> +<TGConnectingPoint num="11" id="393" /> +<TGConnectingPoint num="12" id="394" /> +<TGConnectingPoint num="13" id="395" /> +<TGConnectingPoint num="14" id="396" /> +<TGConnectingPoint num="15" id="397" /> +<TGConnectingPoint num="16" id="398" /> +<TGConnectingPoint num="17" id="399" /> +<TGConnectingPoint num="18" id="400" /> +<TGConnectingPoint num="19" id="401" /> +<TGConnectingPoint num="20" id="402" /> +<TGConnectingPoint num="21" id="403" /> +<TGConnectingPoint num="22" id="404" /> +<TGConnectingPoint num="23" id="405" /> +<TGConnectingPoint num="24" id="406" /> +<TGConnectingPoint num="25" id="407" /> +<TGConnectingPoint num="26" id="408" /> +<TGConnectingPoint num="27" id="409" /> +<TGConnectingPoint num="28" id="410" /> +<TGConnectingPoint num="29" id="411" /> +<TGConnectingPoint num="30" id="412" /> +<TGConnectingPoint num="31" id="413" /> +<TGConnectingPoint num="32" id="414" /> +<TGConnectingPoint num="33" id="415" /> +<TGConnectingPoint num="34" id="416" /> +<TGConnectingPoint num="35" id="417" /> +<TGConnectingPoint num="36" id="418" /> +<TGConnectingPoint num="37" id="419" /> +<TGConnectingPoint num="38" id="420" /> +<TGConnectingPoint num="39" id="421" /> +<TGConnectingPoint num="40" id="422" /> +<TGConnectingPoint num="41" id="423" /> +<TGConnectingPoint num="42" id="424" /> +<TGConnectingPoint num="43" id="425" /> +<TGConnectingPoint num="44" id="426" /> +<TGConnectingPoint num="45" id="427" /> +<TGConnectingPoint num="46" id="428" /> +<TGConnectingPoint num="47" id="429" /> +<TGConnectingPoint num="48" id="430" /> +<TGConnectingPoint num="49" id="431" /> +<TGConnectingPoint num="50" id="432" /> +<TGConnectingPoint num="51" id="433" /> +<TGConnectingPoint num="52" id="434" /> +<TGConnectingPoint num="53" id="435" /> +<TGConnectingPoint num="54" id="436" /> +<TGConnectingPoint num="55" id="437" /> +<TGConnectingPoint num="56" id="438" /> +<TGConnectingPoint num="57" id="439" /> +<TGConnectingPoint num="58" id="440" /> +<TGConnectingPoint num="59" id="441" /> +<TGConnectingPoint num="60" id="442" /> +<TGConnectingPoint num="61" id="443" /> +<TGConnectingPoint num="62" id="444" /> +<TGConnectingPoint num="63" id="445" /> +<TGConnectingPoint num="64" id="446" /> +<TGConnectingPoint num="65" id="447" /> +<TGConnectingPoint num="66" id="448" /> +<TGConnectingPoint num="67" id="449" /> +<TGConnectingPoint num="68" id="450" /> +<TGConnectingPoint num="69" id="451" /> +<TGConnectingPoint num="70" id="452" /> +<TGConnectingPoint num="71" id="453" /> +<extraparam> +</extraparam> +</COMPONENT> + +<COMPONENT type="5103" id="465" index="15" uid="2defadde-3ad2-4986-8807-b8bca2d42df1" > +<cdparam x="260" y="350" /> +<sizeparam width="76" height="18" minWidth="29" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<hidden value="false" /> +<enabled value="true" /> +<cdrectangleparam minX="10" maxX="2500" minY="10" maxY="1500" /> +<infoparam name="Send signal" value="out1(x, p, b)" /> +<new d="false" /> +<TGConnectingPoint num="0" id="455" /> +<TGConnectingPoint num="1" id="456" /> +<TGConnectingPoint num="2" id="457" /> +<TGConnectingPoint num="3" id="458" /> +<TGConnectingPoint num="4" id="459" /> +<TGConnectingPoint num="5" id="460" /> +<TGConnectingPoint num="6" id="461" /> +<TGConnectingPoint num="7" id="462" /> +<TGConnectingPoint num="8" id="463" /> +<TGConnectingPoint num="9" id="464" /> +</COMPONENT> + +<COMPONENT type="5101" id="467" index="16" uid="3320dfa8-dc96-4387-a94f-25c3a07759ae" > +<cdparam x="289" y="428" /> +<sizeparam width="18" height="18" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<hidden value="false" /> +<cdrectangleparam minX="10" maxX="2500" minY="10" maxY="1500" /> +<infoparam name="stop state" value="null" /> +<new d="false" /> +<TGConnectingPoint num="0" id="466" /> +</COMPONENT> + +<COMPONENT type="5104" id="478" index="17" uid="6223a7dd-5783-455b-b937-fbe533f02445" > +<cdparam x="261" y="276" /> +<sizeparam width="74" height="18" minWidth="39" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<hidden value="false" /> +<enabled value="true" /> +<cdrectangleparam minX="10" maxX="2500" minY="10" maxY="1500" /> +<infoparam name="Receive signal" value="in1(x, p, b)" /> +<new d="false" /> +<TGConnectingPoint num="0" id="468" /> +<TGConnectingPoint num="1" id="469" /> +<TGConnectingPoint num="2" id="470" /> +<TGConnectingPoint num="3" id="471" /> +<TGConnectingPoint num="4" id="472" /> +<TGConnectingPoint num="5" id="473" /> +<TGConnectingPoint num="6" id="474" /> +<TGConnectingPoint num="7" id="475" /> +<TGConnectingPoint num="8" id="476" /> +<TGConnectingPoint num="9" id="477" /> +</COMPONENT> + +<COMPONENT type="5100" id="480" index="18" uid="29fdf48a-fe0e-45e1-b3e2-a04dbeaf94de" > +<cdparam x="347" y="160" /> +<sizeparam width="13" height="13" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<hidden value="false" /> +<cdrectangleparam minX="10" maxX="2500" minY="10" maxY="1500" /> +<infoparam name="start state" value="null" /> +<new d="false" /> +<TGConnectingPoint num="0" id="479" /> +</COMPONENT> + + +</AVATARStateMachineDiagramPanel> + +</Modeling> + + + + +</TURTLEGMODELING> \ No newline at end of file