From: rtrimana Date: Wed, 9 Nov 2016 21:36:41 +0000 (-0800) Subject: Completing parser to parse generic/template return types; adding standard method... X-Git-Url: http://plrg.eecs.uci.edu/git/?p=iot2.git;a=commitdiff_plain;h=8290504f8875a9d00d0a0ceff3fe06864723def9 Completing parser to parse generic/template return types; adding standard method bodies in stubs --- diff --git a/config/iotpolicy/camerapolicy.pol b/config/iotpolicy/camerapolicy.pol index c2aa98b..d85eb53 100644 --- a/config/iotpolicy/camerapolicy.pol +++ b/config/iotpolicy/camerapolicy.pol @@ -1,6 +1,6 @@ public interface Camera { - public void MethodA(int A, int B); + public List MethodA(int A, int B); public void MethodA(int A, int B, int AB); public int MethodB(int C, String D[]); public String MethodC(String E, List F); diff --git a/iotjava/Makefile b/iotjava/Makefile index feafe51..50792f4 100644 --- a/iotjava/Makefile +++ b/iotjava/Makefile @@ -32,8 +32,8 @@ PHONY += compile compile: cd $(BIN_DIR)/iotpolicy/output_files; cp *.java ./Java cd $(BIN_DIR)/iotpolicy/output_files; cp *.hpp ./Cplus - cd $(BIN_DIR)/iotpolicy/output_files/Java; $(JAVAC) -cp .:.. *.java - cd $(BIN_DIR)/iotpolicy/output_files/Cplus; $(G++) ./*.hpp --std=c++11 -pthread -pg + #cd $(BIN_DIR)/iotpolicy/output_files/Java; $(JAVAC) -cp .:..:../../../$(BIN_DIR) *.java + cd $(BIN_DIR)/iotpolicy/output_files/Cplus; $(G++) ./*.hpp --std=c++11 -pthread -pg -I../../../../iotjava/iotrmi/C++/ PHONY += clean clean: diff --git a/iotjava/iotpolicy/IoTCompiler.java b/iotjava/iotpolicy/IoTCompiler.java index 8849c4d..94029ca 100644 --- a/iotjava/iotpolicy/IoTCompiler.java +++ b/iotjava/iotpolicy/IoTCompiler.java @@ -3,6 +3,8 @@ package iotpolicy; import java_cup.runtime.ComplexSymbolFactory; import java_cup.runtime.ScannerBuffer; import java.io.*; +import java.util.Arrays; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -48,6 +50,8 @@ public class IoTCompiler { private Map mapPrimitives; private Map mapNonPrimitivesJava; private Map mapNonPrimitivesCplus; + // Other data structures + private Map mapIntfaceObjId; // Maps interface name to object Id private PrintWriter pw; private String dir; private String subdir; @@ -72,6 +76,7 @@ public class IoTCompiler { mapIntfacePTH = new HashMap(); mapIntDeclHand = new HashMap(); mapInt2NewInts = new HashMap>>(); + mapIntfaceObjId = new HashMap(); mapPrimitives = new HashMap(); arraysToMap(mapPrimitives, IoTRMITypes.primitivesJava, IoTRMITypes.primitivesCplus); mapNonPrimitivesJava = new HashMap(); @@ -85,7 +90,7 @@ public class IoTCompiler { /** - * setParseTree() sets parse tree based on policy files. + * setDataStructures() sets parse tree and other data structures based on policy files. *

* It also generates parse tree (ParseTreeHandler) and * copies useful information from parse tree into @@ -95,11 +100,10 @@ public class IoTCompiler { * returned from tree-parsing for further process. * */ - public void setParseTree(String origInt, ParseNode pnPol, ParseNode pnReq) { + public void setDataStructures(String origInt, ParseNode pnPol, ParseNode pnReq) { ParseTreeHandler ptHandler = new ParseTreeHandler(origInt, pnPol, pnReq); DeclarationHandler decHandler = new DeclarationHandler(); - // Process ParseNode and generate Declaration objects ptHandler.processInterfaceDecl(); InterfaceDecl intDecl = ptHandler.getInterfaceDecl(); @@ -113,6 +117,9 @@ public class IoTCompiler { mapIntfacePTH.put(origInt, ptHandler); mapIntDeclHand.put(origInt, decHandler); + // Set object Id counter to 0 for each interface + mapIntfaceObjId.put(origInt, new Integer(0)); + //System.out.println("\nInterface: " + origInt + "\n\n"); } @@ -253,6 +260,83 @@ public class IoTCompiler { } + /** + * HELPER: writePropertiesJavaStub() writes the properties of the stub class + */ + private void writePropertiesJavaStub(String intface) { + + println("private IoTRMICall rmiCall;"); + //println("private IoTRMIObject rmiObj;"); + println("private String address;"); + println("private int[] ports;\n"); + // Get the object Id + Integer objId = mapIntfaceObjId.get(intface); + println("private final static int objectId = " + objId + ";"); + mapIntfaceObjId.put(intface, objId++); + println("\n"); + } + + + /** + * HELPER: writeConstructorJavaStub() writes the constructor of the stub class + */ + private void writeConstructorJavaStub(String intface) { + + println("public " + intface + "(int _port, String _address, int _rev, int[] _ports) throws Exception {"); + println("address = _address;"); + println("ports = _ports;"); + println("rmiCall = new IoTRMICall(_port, _address, _rev);"); + println("}\n"); + } + + + /** + * HELPER: writeStdMethodBodyJavaStub() writes the standard method body in the stub class + */ + private void writeStdMethodBodyJavaStub(InterfaceDecl intDecl, List methParams, + List methPrmTypes, String method) { + + println("int methodId = " + intDecl.getMethodNumId(method) + ";"); + String retType = intDecl.getMethodType(method); + println("Class retType = " + getSimpleType(retType) + ".class;"); + // Generate array of parameter types + print("Class[] paramCls = new Class[] { "); + for (int i = 0; i < methParams.size(); i++) { + print(getSimpleType(methPrmTypes.get(i)) + ".class"); + // Check if this is the last element (don't print a comma) + if (i != methParams.size() - 1) { + print(", "); + } + } + println(" };"); + // Generate array of parameter objects + print("Object[] paramObj = new Object[] { "); + for (int i = 0; i < methParams.size(); i++) { + print(getSimpleIdentifier(methParams.get(i))); + // Check if this is the last element (don't print a comma) + if (i != methParams.size() - 1) { + print(", "); + } + } + println(" };"); + // Check if this is "void" + if (retType.equals("void")) { + println("rmiCall.remoteCall(objectId, methodId, retType, null, paramCls, paramObj);"); + } else { // We do have a return value + // Check if the return value NONPRIMITIVES + if (getParamCategory(retType) == ParamCategory.NONPRIMITIVES) { + String[] retGenValType = getTypeOfGeneric(retType); + println("Class retGenValType = " + retGenValType[0] + ".class;"); + println("Object retObj = rmiCall.remoteCall(objectId, methodId, retType, retGenValType, paramCls, paramObj);"); + println("return (" + retType + ")retObj;"); + } else { + println("Object retObj = rmiCall.remoteCall(objectId, methodId, retType, null, paramCls, paramObj);"); + println("return (" + retType + ")retObj;"); + } + } + } + + /** * HELPER: writeMethodJavaStub() writes the method of the stub class */ @@ -273,12 +357,9 @@ public class IoTCompiler { } } println(") {"); - // Check if this is not "void" - if (!intDecl.getMethodType(method).equals("void")) { - String retStmt = generateReturnStmt(intDecl.getMethodType(method)); - println("return " + retStmt + ";"); - } - println("}"); println(""); + // Now, write the body of stub! + writeStdMethodBodyJavaStub(intDecl, methParams, methPrmTypes, method); + println("}\n"); } } @@ -304,11 +385,15 @@ public class IoTCompiler { InterfaceDecl intDecl = (InterfaceDecl) decHandler.getInterfaceDecl(intface); // Pass in set of methods and get import classes Set importClasses = getImportClasses(intMeth.getValue(), intDecl); - printImportStatements(importClasses); + List stdImportClasses = getStandardJavaImportClasses(); + List allImportClasses = getAllImportClasses(stdImportClasses, importClasses); + printImportStatements(allImportClasses); println(""); // Write interface header - println(""); - println("public class " + newStubClass + " implements " + newIntface + " {"); - println(""); + println("public class " + newStubClass + " implements " + newIntface + " {\n"); + // Write properties + writePropertiesJavaStub(intface); + // Write constructor + writeConstructorJavaStub(newStubClass); // Write methods writeMethodJavaStub(intMeth.getValue(), intDecl); println("}"); @@ -328,7 +413,7 @@ public class IoTCompiler { List methParams = intDecl.getMethodParams(method); List methPrmTypes = intDecl.getMethodParamTypes(method); - print("virtual " + convertType(intDecl.getMethodType(method)) + " " + + print("virtual " + checkAndGetCplusType(intDecl.getMethodType(method)) + " " + intDecl.getMethodId(method) + "("); for (int i = 0; i < methParams.size(); i++) { // Check for params with driver class types and exchange it @@ -365,23 +450,22 @@ public class IoTCompiler { FileWriter fw = new FileWriter(dir + "/" + intface + ".hpp"); pw = new PrintWriter(new BufferedWriter(fw)); // Write file headers + println("#ifndef _" + intface.toUpperCase() + "_HPP__"); + println("#define _" + intface.toUpperCase() + "_HPP__"); println("#include "); // Pass in set of methods and get include classes DeclarationHandler decHandler = mapIntDeclHand.get(intface); InterfaceDecl intDecl = (InterfaceDecl) decHandler.getInterfaceDecl(intface); List methods = intDecl.getMethods(); Set includeClasses = getIncludeClasses(methods, intDecl); - printIncludeStatements(includeClasses); - println(""); - println("using namespace std;"); - println(""); - println("class " + intface); - println("{"); + printIncludeStatements(includeClasses); println(""); + println("using namespace std;\n"); + println("class " + intface); println("{"); println("public:"); // Write methods writeMethodCplusInterface(methods, intDecl); - print("}"); - println(";"); + println("};"); + println("#endif"); pw.close(); System.out.println("IoTCompiler: Generated local interface " + intface + ".hpp..."); } @@ -409,20 +493,22 @@ public class IoTCompiler { DeclarationHandler decHandler = mapIntDeclHand.get(intface); InterfaceDecl intDecl = (InterfaceDecl) decHandler.getInterfaceDecl(intface); // Write file headers + println("#ifndef _" + newIntface.toUpperCase() + "_HPP__"); + println("#define _" + newIntface.toUpperCase() + "_HPP__"); println("#include "); // Pass in set of methods and get import classes Set includeClasses = getIncludeClasses(intMeth.getValue(), intDecl); - printIncludeStatements(includeClasses); - println(""); - println("using namespace std;"); - println(""); + List stdIncludeClasses = getStandardCplusIncludeClasses(); + List allIncludeClasses = getAllImportClasses(stdIncludeClasses, includeClasses); + printIncludeStatements(allIncludeClasses); println(""); + println("using namespace std;\n"); println("class " + newIntface); println("{"); println("public:"); // Write methods writeMethodCplusInterface(intMeth.getValue(), intDecl); - print("}"); - println(";"); + println("};"); + println("#endif"); pw.close(); System.out.println("IoTCompiler: Generated interface " + newIntface + ".hpp..."); } @@ -439,7 +525,7 @@ public class IoTCompiler { List methParams = intDecl.getMethodParams(method); List methPrmTypes = intDecl.getMethodParamTypes(method); - print(convertType(intDecl.getMethodType(method)) + " " + + print(checkAndGetCplusType(intDecl.getMethodType(method)) + " " + intDecl.getMethodId(method) + "("); for (int i = 0; i < methParams.size(); i++) { String methPrmType = checkAndGetCplusType(methPrmTypes.get(i)); @@ -451,16 +537,102 @@ public class IoTCompiler { } } println(") { "); - // Check if this is not "void" - if (!intDecl.getMethodType(method).equals("void")) { - String retStmt = generateReturnStmt(intDecl.getMethodType(method)); - if (retStmt.equals("null")) { // null = NULL in C++ - retStmt = "NULL"; - } - println("return " + retStmt + ";"); + writeStdMethodBodyCplusStub(intDecl, methParams, methPrmTypes, method); + println("}\n"); + } + } + + + /** + * HELPER: writeStdMethodBodyCplusStub() writes the standard method body in the stub class + */ + private void writeStdMethodBodyCplusStub(InterfaceDecl intDecl, List methParams, + List methPrmTypes, String method) { + + println("int numParam = " + methParams.size() + ";"); + println("int methodId = " + intDecl.getMethodNumId(method) + ";"); + String retType = intDecl.getMethodType(method); + println("string retType = \"" + checkAndGetCplusType(retType) + "\";"); + // Generate array of parameter types + print("string paramCls[] = { "); + for (int i = 0; i < methParams.size(); i++) { + print("\"" + checkAndGetCplusType(methPrmTypes.get(i)) + "\""); + // Check if this is the last element (don't print a comma) + if (i != methParams.size() - 1) { + print(", "); } - println("}"); println(""); } + println(" };"); + // Generate array of parameter objects + print("void* paramObj[] = { "); + for (int i = 0; i < methParams.size(); i++) { + print("&" + checkAndGetCplusType(getSimpleIdentifier(methParams.get(i)))); + // Check if this is the last element (don't print a comma) + if (i != methParams.size() - 1) { + print(", "); + } + } + println(" };"); + // Check if this is "void" + if (retType.equals("void")) { + println("void* retObj = NULL;"); + println("rmiCall->remoteCall(objectId, methodId, retType, paramCls, paramObj, numParam, retObj);"); + } else { // We do have a return value + if (getParamCategory(retType) == ParamCategory.NONPRIMITIVES) + println(checkAndGetCplusType(retType) + " retVal;"); + else + println(checkAndGetCplusType(retType) + " retVal = " + generateCplusInitializer(retType) + ";"); + println("void* retObj = &retVal;"); + println("rmiCall->remoteCall(objectId, methodId, retType, paramCls, paramObj, numParam, retObj);"); + println("return retVal;"); + } + } + + + /** + * HELPER: writePropertiesCplusStub() writes the properties of the stub class + */ + private void writePropertiesCplusStub(String intface) { + + println("IoTRMICall\t\t\t*rmiCall;"); + //println("IoTRMIObject\t\t\t*rmiObj;"); + println("string\t\t\t\taddress;"); + println("vector\t\t\tports;\n"); + // Get the object Id + Integer objId = mapIntfaceObjId.get(intface); + println("const static int\tobjectId = " + objId + ";"); + mapIntfaceObjId.put(intface, objId++); + println("\n"); + } + + + /** + * HELPER: writeConstructorCplusStub() writes the constructor of the stub class + */ + private void writeConstructorCplusStub(String newStubClass) { + + println(newStubClass + + "(int _port, const char* _address, int _rev, bool* _bResult, vector _ports) {"); + println("address = _address;"); + println("ports = _ports;"); + println("rmiCall = new IoTRMICall(_port, _address, _rev, _bResult);"); + println("}\n"); + } + + + /** + * HELPER: writeDeconstructorCplusStub() writes the deconstructor of the stub class + */ + private void writeDeconstructorCplusStub(String newStubClass) { + + println("~" + newStubClass + "() {"); + println("if (rmiCall != NULL) {"); + println("delete rmiCall;"); + println("rmiCall = NULL;"); + println("}"); + println("}"); + println(""); + // Check if this is callback!!! and print "delete rmiObj and vecCBObj" } @@ -481,19 +653,25 @@ public class IoTCompiler { FileWriter fw = new FileWriter(path + "/" + newStubClass + ".hpp"); pw = new PrintWriter(new BufferedWriter(fw)); // Write file headers + println("#ifndef _" + newStubClass.toUpperCase() + "_HPP__"); + println("#define _" + newStubClass.toUpperCase() + "_HPP__"); println("#include "); println("#include \"" + newIntface + ".hpp\""); println(""); println("using namespace std;"); println(""); println("class " + newStubClass + " : public " + newIntface); println("{"); - println("public:"); println(""); + println("private:\n"); + writePropertiesCplusStub(intface); + println("public:\n"); // Add default constructor and destructor println(newStubClass + "() { }"); println(""); - println("~" + newStubClass + "() { }"); println(""); + writeConstructorCplusStub(newStubClass); + writeDeconstructorCplusStub(newStubClass); DeclarationHandler decHandler = mapIntDeclHand.get(intface); InterfaceDecl intDecl = (InterfaceDecl) decHandler.getInterfaceDecl(intface); // Write methods writeMethodCplusStub(intMeth.getValue(), intDecl); print("}"); println(";"); + println("#endif"); pw.close(); System.out.println("IoTCompiler: Generated stub class " + newIntface + ".hpp..."); } @@ -501,6 +679,36 @@ public class IoTCompiler { } + /** + * generateInitializer() generate initializer based on type + */ + public String generateCplusInitializer(String type) { + + // Generate dummy returns for now + if (type.equals("short")|| + type.equals("int") || + type.equals("long") || + type.equals("float")|| + type.equals("double")) { + + return "0"; + } else if ( type.equals("String") || + type.equals("string")) { + + return "\"\""; + } else if ( type.equals("char") || + type.equals("byte")) { + + return "\' \'"; + } else if ( type.equals("boolean")) { + + return "false"; + } else { + return "NULL"; + } + } + + /** * generateReturnStmt() generate return statement based on methType */ @@ -602,6 +810,7 @@ public class IoTCompiler { newline=false; } + /** * This function converts Java to C++ type for compilation */ @@ -722,6 +931,50 @@ public class IoTCompiler { } + // Generate a set of standard classes for import statements + private List getStandardJavaImportClasses() { + + List importClasses = new ArrayList(); + // Add the standard list first + importClasses.add("java.io.IOException"); + importClasses.add("java.util.List"); + importClasses.add("java.util.ArrayList"); + importClasses.add("iotrmi.Java.IoTRMICall"); + importClasses.add("iotrmi.Java.IoTRMIObject"); + + return importClasses; + } + + + // Generate a set of standard classes for import statements + private List getStandardCplusIncludeClasses() { + + List importClasses = new ArrayList(); + // Add the standard list first + importClasses.add(""); + importClasses.add("\"IoTRMICall.hpp\""); + importClasses.add("\"IoTRMIObject.hpp\""); + + return importClasses; + } + + + // Generate a set of standard classes for import statements + private List getAllImportClasses(Collection stdImportClasses, Collection importClasses) { + + List allImportClasses = new ArrayList(stdImportClasses); + // Iterate over the list of import classes + for (String str : importClasses) { + if (!stdImportClasses.contains(str)) { + stdImportClasses.add(str); + } + } + + return allImportClasses; + } + + + // Generate a set of classes for import statements private Set getImportClasses(Collection methods, InterfaceDecl intDecl) { @@ -766,7 +1019,7 @@ public class IoTCompiler { } - private void printImportStatements(Set importClasses) { + private void printImportStatements(Collection importClasses) { for(String cls : importClasses) { println("import " + cls + ";"); @@ -774,7 +1027,7 @@ public class IoTCompiler { } - private void printIncludeStatements(Set includeClasses) { + private void printIncludeStatements(Collection includeClasses) { for(String cls : includeClasses) { println("#include " + cls); @@ -793,6 +1046,18 @@ public class IoTCompiler { } + // This helper function strips off array declaration, e.g. D[] becomes D + private String getSimpleIdentifier(String ident) { + + // Handle [ for array declaration + String substr = ident; + if (ident.contains("[]")) { + substr = ident.split("\\[\\]")[0]; + } + return substr; + } + + private String checkAndGetCplusType(String paramType) { if (getParamCategory(paramType) == ParamCategory.PRIMITIVES) { @@ -905,7 +1170,7 @@ public class IoTCompiler { ParseNode pnReq = IoTCompiler.parseFile(args[i+1]); // Get interface name String intface = ParseTreeHandler.getOrigIntface(pnPol); - comp.setParseTree(intface, pnPol, pnReq); + comp.setDataStructures(intface, pnPol, pnReq); comp.getMethodsForIntface(intface); i = i + 2; // 1) Check if this is the last option before "-java" or "-cplus" diff --git a/iotjava/iotpolicy/parser/Parser.java b/iotjava/iotpolicy/parser/Parser.java index 14d67b7..7d6086c 100644 --- a/iotjava/iotpolicy/parser/Parser.java +++ b/iotjava/iotpolicy/parser/Parser.java @@ -16,7 +16,6 @@ import java_cup.runtime.XMLElement; import iotpolicy.tree.ParseNode; - /** CUP v0.11b 20160615 (GIT 4ac7450) generated parser. */ @SuppressWarnings({"rawtypes"}) @@ -40,20 +39,21 @@ public class Parser extends java_cup.runtime.lr_parser { /** Production table. */ protected static final short _production_table[][] = unpackFromStrings(new String[] { - "\000\054\000\002\002\003\000\002\002\004\000\002\002" + + "\000\056\000\002\002\003\000\002\002\004\000\002\002" + "\003\000\002\002\003\000\002\002\003\000\002\003\011" + "\000\002\004\004\000\002\004\002\000\002\005\011\000" + - "\002\005\011\000\002\006\004\000\002\006\002\000\002" + - "\007\005\000\002\007\004\000\002\007\005\000\002\007" + - "\004\000\002\007\007\000\002\007\007\000\002\007\010" + - "\000\002\007\010\000\002\011\004\000\002\011\002\000" + - "\002\012\007\000\002\013\004\000\002\013\002\000\002" + - "\014\006\000\002\014\006\000\002\015\004\000\002\015" + - "\002\000\002\016\012\000\002\017\003\000\002\017\005" + - "\000\002\017\002\000\002\020\007\000\002\021\004\000" + - "\002\021\002\000\002\022\004\000\002\022\003\000\002" + - "\023\007\000\002\024\004\000\002\024\002\000\002\025" + - "\005\000\002\025\005\000\002\025\010" }); + "\002\005\011\000\002\005\014\000\002\005\014\000\002" + + "\006\004\000\002\006\002\000\002\007\005\000\002\007" + + "\004\000\002\007\005\000\002\007\004\000\002\007\007" + + "\000\002\007\007\000\002\007\010\000\002\007\010\000" + + "\002\011\004\000\002\011\002\000\002\012\007\000\002" + + "\013\004\000\002\013\002\000\002\014\006\000\002\014" + + "\006\000\002\015\004\000\002\015\002\000\002\016\012" + + "\000\002\017\003\000\002\017\005\000\002\017\002\000" + + "\002\020\007\000\002\021\004\000\002\021\002\000\002" + + "\022\004\000\002\022\003\000\002\023\007\000\002\024" + + "\004\000\002\024\002\000\002\025\005\000\002\025\005" + + "\000\002\025\010" }); /** Access to production table. */ public short[][] production_table() {return _production_table;} @@ -61,64 +61,73 @@ public class Parser extends java_cup.runtime.lr_parser { /** Parse-action table. */ protected static final short[][] _action_table = unpackFromStrings(new String[] { - "\000\140\000\014\002\uffe5\015\012\022\uffe5\025\007\026" + + "\000\157\000\014\002\uffe3\015\012\022\uffe3\025\007\026" + "\011\001\002\000\004\002\001\001\002\000\004\002\ufffd" + - "\001\002\000\004\002\ufffe\001\002\000\004\030\134\001" + - "\002\000\006\002\uffff\022\120\001\002\000\004\030\100" + + "\001\002\000\004\002\ufffe\001\002\000\004\030\153\001" + + "\002\000\006\002\uffff\022\137\001\002\000\004\030\117" + "\001\002\000\004\016\015\001\002\000\004\002\014\001" + "\002\000\004\002\000\001\002\000\004\030\016\001\002" + "\000\004\012\017\001\002\000\010\013\ufffa\015\ufffa\017" + - "\ufffa\001\002\000\010\013\uffec\015\022\017\uffec\001\002" + + "\ufffa\001\002\000\010\013\uffea\015\022\017\uffea\001\002" + "\000\010\013\ufffb\015\ufffb\017\ufffb\001\002\000\006\027" + "\045\030\044\001\002\000\006\013\026\017\025\001\002" + - "\000\006\013\uffed\017\uffed\001\002\000\004\030\027\001" + + "\000\006\013\uffeb\017\uffeb\001\002\000\004\030\027\001" + "\002\000\004\002\ufffc\001\002\000\004\012\030\001\002" + - "\000\010\013\uffe9\020\uffe9\021\uffe9\001\002\000\010\013" + - "\034\020\033\021\035\001\002\000\010\013\uffea\020\uffea" + - "\021\uffea\001\002\000\004\014\041\001\002\000\006\013" + - "\uffeb\017\uffeb\001\002\000\004\014\036\001\002\000\004" + + "\000\010\013\uffe7\020\uffe7\021\uffe7\001\002\000\010\013" + + "\034\020\033\021\035\001\002\000\010\013\uffe8\020\uffe8" + + "\021\uffe8\001\002\000\004\014\041\001\002\000\006\013" + + "\uffe9\017\uffe9\001\002\000\004\014\036\001\002\000\004" + "\031\037\001\002\000\004\004\040\001\002\000\010\013" + - "\uffe7\020\uffe7\021\uffe7\001\002\000\004\031\042\001\002" + - "\000\004\004\043\001\002\000\010\013\uffe8\020\uffe8\021" + - "\uffe8\001\002\000\004\030\073\001\002\000\004\030\046" + - "\001\002\000\004\006\047\001\002\000\010\007\ufff6\027" + - "\ufff6\030\ufff6\001\002\000\010\007\052\027\054\030\051" + - "\001\002\000\006\010\060\030\061\001\002\000\004\004" + - "\057\001\002\000\010\007\ufff7\027\ufff7\030\ufff7\001\002" + - "\000\004\030\055\001\002\000\012\005\056\007\ufff4\027" + - "\ufff4\030\ufff4\001\002\000\010\007\ufff5\027\ufff5\030\ufff5" + - "\001\002\000\010\013\ufff9\015\ufff9\017\ufff9\001\002\000" + - "\006\027\064\030\063\001\002\000\012\005\062\007\ufff2" + - "\027\ufff2\030\ufff2\001\002\000\010\007\ufff3\027\ufff3\030" + - "\ufff3\001\002\000\004\011\070\001\002\000\004\011\065" + - "\001\002\000\004\030\066\001\002\000\012\005\067\007" + - "\ufff1\027\ufff1\030\ufff1\001\002\000\010\007\uffef\027\uffef" + - "\030\uffef\001\002\000\004\030\071\001\002\000\012\005" + - "\072\007\ufff0\027\ufff0\030\ufff0\001\002\000\010\007\uffee" + - "\027\uffee\030\uffee\001\002\000\004\006\074\001\002\000" + - "\010\007\ufff6\027\ufff6\030\ufff6\001\002\000\010\007\076" + - "\027\054\030\051\001\002\000\004\004\077\001\002\000" + - "\010\013\ufff8\015\ufff8\017\ufff8\001\002\000\004\012\101" + - "\001\002\000\010\013\uffd9\027\uffd9\030\uffd9\001\002\000" + - "\010\013\104\027\106\030\103\001\002\000\006\010\111" + - "\030\112\001\002\000\004\002\uffdb\001\002\000\010\013" + - "\uffda\027\uffda\030\uffda\001\002\000\004\030\107\001\002" + - "\000\004\004\110\001\002\000\010\013\uffd8\027\uffd8\030" + - "\uffd8\001\002\000\004\030\114\001\002\000\004\004\113" + - "\001\002\000\010\013\uffd7\027\uffd7\030\uffd7\001\002\000" + - "\004\011\115\001\002\000\004\030\116\001\002\000\004" + - "\004\117\001\002\000\010\013\uffd6\027\uffd6\030\uffd6\001" + - "\002\000\004\030\122\001\002\000\006\002\uffe6\022\uffe6" + - "\001\002\000\004\023\123\001\002\000\010\005\uffe1\024" + - "\uffe1\030\125\001\002\000\006\005\126\024\127\001\002" + - "\000\006\005\uffe3\024\uffe3\001\002\000\004\030\133\001" + - "\002\000\004\016\130\001\002\000\004\030\131\001\002" + - "\000\004\004\132\001\002\000\006\002\uffe4\022\uffe4\001" + - "\002\000\006\005\uffe2\024\uffe2\001\002\000\004\012\135" + - "\001\002\000\006\013\uffde\030\uffde\001\002\000\006\013" + - "\141\030\140\001\002\000\006\013\uffdf\030\uffdf\001\002" + - "\000\010\005\142\013\uffdc\030\uffdc\001\002\000\004\002" + - "\uffe0\001\002\000\006\013\uffdd\030\uffdd\001\002" }); + "\uffe5\020\uffe5\021\uffe5\001\002\000\004\031\042\001\002" + + "\000\004\004\043\001\002\000\010\013\uffe6\020\uffe6\021" + + "\uffe6\001\002\000\006\010\073\030\074\001\002\000\004" + + "\030\046\001\002\000\004\006\047\001\002\000\010\007" + + "\ufff4\027\ufff4\030\ufff4\001\002\000\010\007\052\027\054" + + "\030\051\001\002\000\006\010\060\030\061\001\002\000" + + "\004\004\057\001\002\000\010\007\ufff5\027\ufff5\030\ufff5" + + "\001\002\000\004\030\055\001\002\000\012\005\056\007" + + "\ufff2\027\ufff2\030\ufff2\001\002\000\010\007\ufff3\027\ufff3" + + "\030\ufff3\001\002\000\010\013\ufff9\015\ufff9\017\ufff9\001" + + "\002\000\006\027\064\030\063\001\002\000\012\005\062" + + "\007\ufff0\027\ufff0\030\ufff0\001\002\000\010\007\ufff1\027" + + "\ufff1\030\ufff1\001\002\000\004\011\070\001\002\000\004" + + "\011\065\001\002\000\004\030\066\001\002\000\012\005" + + "\067\007\uffef\027\uffef\030\uffef\001\002\000\010\007\uffed" + + "\027\uffed\030\uffed\001\002\000\004\030\071\001\002\000" + + "\012\005\072\007\uffee\027\uffee\030\uffee\001\002\000\010" + + "\007\uffec\027\uffec\030\uffec\001\002\000\006\027\102\030" + + "\101\001\002\000\004\006\075\001\002\000\010\007\ufff4" + + "\027\ufff4\030\ufff4\001\002\000\010\007\077\027\054\030" + + "\051\001\002\000\004\004\100\001\002\000\010\013\ufff8" + + "\015\ufff8\017\ufff8\001\002\000\004\011\111\001\002\000" + + "\004\011\103\001\002\000\004\030\104\001\002\000\004" + + "\006\105\001\002\000\010\007\ufff4\027\ufff4\030\ufff4\001" + + "\002\000\010\007\107\027\054\030\051\001\002\000\004" + + "\004\110\001\002\000\010\013\ufff7\015\ufff7\017\ufff7\001" + + "\002\000\004\030\112\001\002\000\004\006\113\001\002" + + "\000\010\007\ufff4\027\ufff4\030\ufff4\001\002\000\010\007" + + "\115\027\054\030\051\001\002\000\004\004\116\001\002" + + "\000\010\013\ufff6\015\ufff6\017\ufff6\001\002\000\004\012" + + "\120\001\002\000\010\013\uffd7\027\uffd7\030\uffd7\001\002" + + "\000\010\013\123\027\125\030\122\001\002\000\006\010" + + "\130\030\131\001\002\000\004\002\uffd9\001\002\000\010" + + "\013\uffd8\027\uffd8\030\uffd8\001\002\000\004\030\126\001" + + "\002\000\004\004\127\001\002\000\010\013\uffd6\027\uffd6" + + "\030\uffd6\001\002\000\004\030\133\001\002\000\004\004" + + "\132\001\002\000\010\013\uffd5\027\uffd5\030\uffd5\001\002" + + "\000\004\011\134\001\002\000\004\030\135\001\002\000" + + "\004\004\136\001\002\000\010\013\uffd4\027\uffd4\030\uffd4" + + "\001\002\000\004\030\141\001\002\000\006\002\uffe4\022" + + "\uffe4\001\002\000\004\023\142\001\002\000\010\005\uffdf" + + "\024\uffdf\030\144\001\002\000\006\005\145\024\146\001" + + "\002\000\006\005\uffe1\024\uffe1\001\002\000\004\030\152" + + "\001\002\000\004\016\147\001\002\000\004\030\150\001" + + "\002\000\004\004\151\001\002\000\006\002\uffe2\022\uffe2" + + "\001\002\000\006\005\uffe0\024\uffe0\001\002\000\004\012" + + "\154\001\002\000\006\013\uffdc\030\uffdc\001\002\000\006" + + "\013\160\030\157\001\002\000\006\013\uffdd\030\uffdd\001" + + "\002\000\010\005\161\013\uffda\030\uffda\001\002\000\004" + + "\002\uffde\001\002\000\006\013\uffdb\030\uffdb\001\002" }); /** Access to parse-action table. */ public short[][] action_table() {return _action_table;} @@ -126,9 +135,9 @@ public class Parser extends java_cup.runtime.lr_parser { /** reduce_goto table. */ protected static final short[][] _reduce_table = unpackFromStrings(new String[] { - "\000\140\000\014\002\012\003\003\015\007\020\005\023" + + "\000\157\000\014\002\012\003\003\015\007\020\005\023" + "\004\001\001\000\002\001\001\000\002\001\001\000\002" + - "\001\001\000\002\001\001\000\004\016\120\001\001\000" + + "\001\001\000\002\001\001\000\004\016\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\004\004" + "\017\001\001\000\006\005\020\011\022\001\001\000\002" + @@ -145,20 +154,26 @@ public class Parser extends java_cup.runtime.lr_parser { "\001\001\000\002\001\001\000\002\001\001\000\002\001" + "\001\000\002\001\001\000\002\001\001\000\002\001\001" + "\000\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" + - "\006\074\001\001\000\004\007\052\001\001\000\002\001" + - "\001\000\002\001\001\000\002\001\001\000\004\024\101" + - "\001\001\000\004\025\104\001\001\000\002\001\001\000" + "\002\001\001\000\002\001\001\000\002\001\001\000\002" + - "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\001\000\004\006\075\001\001\000\004\007\052\001" + "\001\000\002\001\001\000\002\001\001\000\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\017\123\001\001" + + "\004\006\105\001\001\000\004\007\052\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\004\006\113\001\001\000\004\007\052\001\001" + + "\000\002\001\001\000\002\001\001\000\002\001\001\000" + + "\004\024\120\001\001\000\004\025\123\001\001\000\002" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\002\001\001" + "\000\002\001\001\000\002\001\001\000\002\001\001\000" + "\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\021" + - "\135\001\001\000\004\022\136\001\001\000\002\001\001" + - "\000\002\001\001\000\002\001\001\000\002\001\001" }); + "\001\001\000\002\001\001\000\002\001\001\000\004\017" + + "\142\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001\000\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\021\154\001\001\000\004\022\155\001\001\000" + + "\002\001\001\000\002\001\001\000\002\001\001\000\002" + + "\001\001" }); /** Access to reduce_goto table. */ public short[][] reduce_table() {return _reduce_table;} @@ -416,7 +431,61 @@ class CUP$Parser$actions { return CUP$Parser$result; /*. . . . . . . . . . . . . . . . . . . .*/ - case 10: // paramlist ::= paramlist param + case 10: // meth ::= PUBLIC IDENT LANG TYPE RANG IDENT LPAR paramlist RPAR SEMICOLON + { + ParseNode RESULT =null; + int clsmethleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-8)).left; + int clsmethright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-8)).right; + Object clsmeth = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-8)).value; + int typegenleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-6)).left; + int typegenright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-6)).right; + Object typegen = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-6)).value; + int idmethleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-4)).left; + int idmethright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-4)).right; + Object idmeth = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-4)).value; + int plleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left; + int plright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).right; + ParseNode pl = (ParseNode)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-2)).value; + + ParseNode pn = new ParseNode("method"); + pn.addChild("method_class").setLiteral((String)clsmeth + "<" + typegen + ">"); + pn.addChild("method_ident").setLiteral(idmeth); + pn.addChild(pl); + RESULT = pn; + + CUP$Parser$result = parser.getSymbolFactory().newSymbol("meth",3, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-9)), ((java_cup.runtime.Symbol)CUP$Parser$stack.peek()), RESULT); + } + return CUP$Parser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 11: // meth ::= PUBLIC IDENT LANG IDENT RANG IDENT LPAR paramlist RPAR SEMICOLON + { + ParseNode RESULT =null; + int clsmethleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-8)).left; + int clsmethright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-8)).right; + Object clsmeth = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-8)).value; + int clsgenleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-6)).left; + int clsgenright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-6)).right; + Object clsgen = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-6)).value; + int idmethleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-4)).left; + int idmethright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-4)).right; + Object idmeth = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-4)).value; + int plleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left; + int plright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).right; + ParseNode pl = (ParseNode)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-2)).value; + + ParseNode pn = new ParseNode("method"); + pn.addChild("method_class").setLiteral((String)clsmeth + "<" + clsgen + ">"); + pn.addChild("method_ident").setLiteral(idmeth); + pn.addChild(pl); + RESULT = pn; + + CUP$Parser$result = parser.getSymbolFactory().newSymbol("meth",3, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-9)), ((java_cup.runtime.Symbol)CUP$Parser$stack.peek()), RESULT); + } + return CUP$Parser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 12: // paramlist ::= paramlist param { ParseNode RESULT =null; int plleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left; @@ -434,7 +503,7 @@ class CUP$Parser$actions { return CUP$Parser$result; /*. . . . . . . . . . . . . . . . . . . .*/ - case 11: // paramlist ::= + case 13: // paramlist ::= { ParseNode RESULT =null; @@ -446,7 +515,7 @@ class CUP$Parser$actions { return CUP$Parser$result; /*. . . . . . . . . . . . . . . . . . . .*/ - case 12: // param ::= TYPE IDENT COMMA + case 14: // param ::= TYPE IDENT COMMA { ParseNode RESULT =null; int typeprmleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left; @@ -466,7 +535,7 @@ class CUP$Parser$actions { return CUP$Parser$result; /*. . . . . . . . . . . . . . . . . . . .*/ - case 13: // param ::= TYPE IDENT + case 15: // param ::= TYPE IDENT { ParseNode RESULT =null; int typeprmleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left; @@ -486,7 +555,7 @@ class CUP$Parser$actions { return CUP$Parser$result; /*. . . . . . . . . . . . . . . . . . . .*/ - case 14: // param ::= IDENT IDENT COMMA + case 16: // param ::= IDENT IDENT COMMA { ParseNode RESULT =null; int clsprmleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left; @@ -506,7 +575,7 @@ class CUP$Parser$actions { return CUP$Parser$result; /*. . . . . . . . . . . . . . . . . . . .*/ - case 15: // param ::= IDENT IDENT + case 17: // param ::= IDENT IDENT { ParseNode RESULT =null; int clsprmleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left; @@ -526,7 +595,7 @@ class CUP$Parser$actions { return CUP$Parser$result; /*. . . . . . . . . . . . . . . . . . . .*/ - case 16: // param ::= IDENT LANG TYPE RANG IDENT + case 18: // param ::= IDENT LANG TYPE RANG IDENT { ParseNode RESULT =null; int clsprmleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-4)).left; @@ -549,7 +618,7 @@ class CUP$Parser$actions { return CUP$Parser$result; /*. . . . . . . . . . . . . . . . . . . .*/ - case 17: // param ::= IDENT LANG IDENT RANG IDENT + case 19: // param ::= IDENT LANG IDENT RANG IDENT { ParseNode RESULT =null; int clsprmleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-4)).left; @@ -572,7 +641,7 @@ class CUP$Parser$actions { return CUP$Parser$result; /*. . . . . . . . . . . . . . . . . . . .*/ - case 18: // param ::= IDENT LANG TYPE RANG IDENT COMMA + case 20: // param ::= IDENT LANG TYPE RANG IDENT COMMA { ParseNode RESULT =null; int clsprmleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-5)).left; @@ -595,7 +664,7 @@ class CUP$Parser$actions { return CUP$Parser$result; /*. . . . . . . . . . . . . . . . . . . .*/ - case 19: // param ::= IDENT LANG IDENT RANG IDENT COMMA + case 21: // param ::= IDENT LANG IDENT RANG IDENT COMMA { ParseNode RESULT =null; int clsprmleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-5)).left; @@ -618,7 +687,7 @@ class CUP$Parser$actions { return CUP$Parser$result; /*. . . . . . . . . . . . . . . . . . . .*/ - case 20: // capablist ::= capablist capab + case 22: // capablist ::= capablist capab { ParseNode RESULT =null; int clleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left; @@ -636,7 +705,7 @@ class CUP$Parser$actions { return CUP$Parser$result; /*. . . . . . . . . . . . . . . . . . . .*/ - case 21: // capablist ::= + case 23: // capablist ::= { ParseNode RESULT =null; @@ -648,7 +717,7 @@ class CUP$Parser$actions { return CUP$Parser$result; /*. . . . . . . . . . . . . . . . . . . .*/ - case 22: // capab ::= CAPABILITY IDENT BEGIN capabcont END + case 24: // capab ::= CAPABILITY IDENT BEGIN capabcont END { ParseNode RESULT =null; int idcapleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-3)).left; @@ -668,7 +737,7 @@ class CUP$Parser$actions { return CUP$Parser$result; /*. . . . . . . . . . . . . . . . . . . .*/ - case 23: // capabcont ::= capabcont cont + case 25: // capabcont ::= capabcont cont { ParseNode RESULT =null; int ccontleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left; @@ -686,7 +755,7 @@ class CUP$Parser$actions { return CUP$Parser$result; /*. . . . . . . . . . . . . . . . . . . .*/ - case 24: // capabcont ::= + case 26: // capabcont ::= { ParseNode RESULT =null; @@ -698,7 +767,7 @@ class CUP$Parser$actions { return CUP$Parser$result; /*. . . . . . . . . . . . . . . . . . . .*/ - case 25: // cont ::= DESCRIPTION ASSIGN STRINGCONST SEMICOLON + case 27: // cont ::= DESCRIPTION ASSIGN STRINGCONST SEMICOLON { ParseNode RESULT =null; int dscleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-3)).left; @@ -717,7 +786,7 @@ class CUP$Parser$actions { return CUP$Parser$result; /*. . . . . . . . . . . . . . . . . . . .*/ - case 26: // cont ::= METHOD ASSIGN STRINGCONST SEMICOLON + case 28: // cont ::= METHOD ASSIGN STRINGCONST SEMICOLON { ParseNode RESULT =null; int mtdleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-3)).left; @@ -736,7 +805,7 @@ class CUP$Parser$actions { return CUP$Parser$result; /*. . . . . . . . . . . . . . . . . . . .*/ - case 27: // reqlist ::= reqlist require + case 29: // reqlist ::= reqlist require { ParseNode RESULT =null; int rlleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left; @@ -754,7 +823,7 @@ class CUP$Parser$actions { return CUP$Parser$result; /*. . . . . . . . . . . . . . . . . . . .*/ - case 28: // reqlist ::= + case 30: // reqlist ::= { ParseNode RESULT =null; @@ -766,7 +835,7 @@ class CUP$Parser$actions { return CUP$Parser$result; /*. . . . . . . . . . . . . . . . . . . .*/ - case 29: // require ::= REQUIRES IDENT WITH capintlist AS INTERFACE IDENT SEMICOLON + case 31: // require ::= REQUIRES IDENT WITH capintlist AS INTERFACE IDENT SEMICOLON { ParseNode RESULT =null; int idintleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-6)).left; @@ -790,7 +859,7 @@ class CUP$Parser$actions { return CUP$Parser$result; /*. . . . . . . . . . . . . . . . . . . .*/ - case 30: // capintlist ::= IDENT + case 32: // capintlist ::= IDENT { ParseNode RESULT =null; int idcapleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.peek()).left; @@ -806,7 +875,7 @@ class CUP$Parser$actions { return CUP$Parser$result; /*. . . . . . . . . . . . . . . . . . . .*/ - case 31: // capintlist ::= capintlist COMMA IDENT + case 33: // capintlist ::= capintlist COMMA IDENT { ParseNode RESULT =null; int cilleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left; @@ -824,7 +893,7 @@ class CUP$Parser$actions { return CUP$Parser$result; /*. . . . . . . . . . . . . . . . . . . .*/ - case 32: // capintlist ::= + case 34: // capintlist ::= { ParseNode RESULT =null; @@ -836,7 +905,7 @@ class CUP$Parser$actions { return CUP$Parser$result; /*. . . . . . . . . . . . . . . . . . . .*/ - case 33: // enumdec ::= ENUM IDENT BEGIN enumlist END + case 35: // enumdec ::= ENUM IDENT BEGIN enumlist END { ParseNode RESULT =null; int idenumdecleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-3)).left; @@ -856,7 +925,7 @@ class CUP$Parser$actions { return CUP$Parser$result; /*. . . . . . . . . . . . . . . . . . . .*/ - case 34: // enumlist ::= enumlist enummem + case 36: // enumlist ::= enumlist enummem { ParseNode RESULT =null; int elleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left; @@ -874,7 +943,7 @@ class CUP$Parser$actions { return CUP$Parser$result; /*. . . . . . . . . . . . . . . . . . . .*/ - case 35: // enumlist ::= + case 37: // enumlist ::= { ParseNode RESULT =null; @@ -886,7 +955,7 @@ class CUP$Parser$actions { return CUP$Parser$result; /*. . . . . . . . . . . . . . . . . . . .*/ - case 36: // enummem ::= IDENT COMMA + case 38: // enummem ::= IDENT COMMA { ParseNode RESULT =null; int idenumleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left; @@ -902,7 +971,7 @@ class CUP$Parser$actions { return CUP$Parser$result; /*. . . . . . . . . . . . . . . . . . . .*/ - case 37: // enummem ::= IDENT + case 39: // enummem ::= IDENT { ParseNode RESULT =null; int idenumleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.peek()).left; @@ -918,7 +987,7 @@ class CUP$Parser$actions { return CUP$Parser$result; /*. . . . . . . . . . . . . . . . . . . .*/ - case 38: // structdec ::= STRUCT IDENT BEGIN structlist END + case 40: // structdec ::= STRUCT IDENT BEGIN structlist END { ParseNode RESULT =null; int idstructdecleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-3)).left; @@ -938,7 +1007,7 @@ class CUP$Parser$actions { return CUP$Parser$result; /*. . . . . . . . . . . . . . . . . . . .*/ - case 39: // structlist ::= structlist structmem + case 41: // structlist ::= structlist structmem { ParseNode RESULT =null; int slleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left; @@ -956,7 +1025,7 @@ class CUP$Parser$actions { return CUP$Parser$result; /*. . . . . . . . . . . . . . . . . . . .*/ - case 40: // structlist ::= + case 42: // structlist ::= { ParseNode RESULT =null; @@ -968,7 +1037,7 @@ class CUP$Parser$actions { return CUP$Parser$result; /*. . . . . . . . . . . . . . . . . . . .*/ - case 41: // structmem ::= TYPE IDENT SEMICOLON + case 43: // structmem ::= TYPE IDENT SEMICOLON { ParseNode RESULT =null; int typestrleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left; @@ -988,7 +1057,7 @@ class CUP$Parser$actions { return CUP$Parser$result; /*. . . . . . . . . . . . . . . . . . . .*/ - case 42: // structmem ::= IDENT IDENT SEMICOLON + case 44: // structmem ::= IDENT IDENT SEMICOLON { ParseNode RESULT =null; int clsstrleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left; @@ -1008,7 +1077,7 @@ class CUP$Parser$actions { return CUP$Parser$result; /*. . . . . . . . . . . . . . . . . . . .*/ - case 43: // structmem ::= IDENT LANG IDENT RANG IDENT SEMICOLON + case 45: // structmem ::= IDENT LANG IDENT RANG IDENT SEMICOLON { ParseNode RESULT =null; int clsstrleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-5)).left; diff --git a/iotjava/iotpolicy/tree/InterfaceDecl.java b/iotjava/iotpolicy/tree/InterfaceDecl.java index 2cd1d54..69ad796 100644 --- a/iotjava/iotpolicy/tree/InterfaceDecl.java +++ b/iotjava/iotpolicy/tree/InterfaceDecl.java @@ -99,6 +99,15 @@ public class InterfaceDecl extends Declaration { } + /** + * getMethodNumId() gets Id number for a method + */ + public int getMethodNumId(String method) { + + return listMethods.indexOf(method); + } + + /** * getMethodIds() gets method identifiers */ diff --git a/iotjava/iotrmi/C++/sample/TestClass_Stub.hpp b/iotjava/iotrmi/C++/sample/TestClass_Stub.hpp index 4f99476..660b6a7 100644 --- a/iotjava/iotrmi/C++/sample/TestClass_Stub.hpp +++ b/iotjava/iotrmi/C++/sample/TestClass_Stub.hpp @@ -38,12 +38,13 @@ class TestClass_Stub : public TestClassInterface { string stringC; //CallBackInterface cb; IoTRMICall *rmiCall; - IoTRMIObject *rmiObj; string address; vector ports; - vector vecCBObj; + const static int objectId = 0; // Default value is 0 - int objectId = 0; // Default value is 0 + // Specific for callbacks + IoTRMIObject *rmiObj; + vector vecCBObj; static int objIdCnt; }; @@ -81,6 +82,7 @@ TestClass_Stub::~TestClass_Stub() { delete rmiObj; rmiObj = NULL; } + // Special for callbacks!!! for(CallBackInterface* cb : vecCBObj) { delete cb; cb = NULL; diff --git a/iotjava/iotrmi/Java/sample/TestClass_Stub.java b/iotjava/iotrmi/Java/sample/TestClass_Stub.java index 89e6a6e..9e2006d 100644 --- a/iotjava/iotrmi/Java/sample/TestClass_Stub.java +++ b/iotjava/iotrmi/Java/sample/TestClass_Stub.java @@ -16,18 +16,24 @@ public class TestClass_Stub implements TestClassInterface { * Class Properties */ private IoTRMICall rmiCall; + private IoTRMIObject rmiObj; private String address; private int[] ports; - private List listCBObj; - private IoTRMIObject rmiObj; /** * Class Constants */ - private final static int NUM_CB_OBJ = 1; private int objectId = 0; // Default value is 0 + + + /** + * Properties and constants for Callbacks! + */ + private List listCBObj; + private final static int NUM_CB_OBJ = 1; private static int objIdCnt = 0; // Counter for callback object Ids + /** * Constructors */ @@ -36,6 +42,8 @@ public class TestClass_Stub implements TestClassInterface { address = _address; ports = _ports; rmiCall = new IoTRMICall(_port, _address, _rev); + + // Only for callbacks!!! listCBObj = new ArrayList(); ___initCallBack(); } diff --git a/others/javacup/iotparser.cup b/others/javacup/iotparser.cup index be96c46..00db795 100644 --- a/others/javacup/iotparser.cup +++ b/others/javacup/iotparser.cup @@ -121,6 +121,23 @@ meth ::= PUBLIC TYPE:typemeth IDENT:idmeth LPAR paramlist:pl RPAR SEMICOLO pn.addChild(pl); RESULT = pn; :} + /* generic/template return value with one type, e.g. set */ + | PUBLIC IDENT:clsmeth LANG TYPE:typegen RANG IDENT:idmeth LPAR paramlist:pl RPAR SEMICOLON + {: + ParseNode pn = new ParseNode("method"); + pn.addChild("method_class").setLiteral((String)clsmeth + "<" + typegen + ">"); + pn.addChild("method_ident").setLiteral(idmeth); + pn.addChild(pl); + RESULT = pn; + :} + | PUBLIC IDENT:clsmeth LANG IDENT:clsgen RANG IDENT:idmeth LPAR paramlist:pl RPAR SEMICOLON + {: + ParseNode pn = new ParseNode("method"); + pn.addChild("method_class").setLiteral((String)clsmeth + "<" + clsgen + ">"); + pn.addChild("method_ident").setLiteral(idmeth); + pn.addChild(pl); + RESULT = pn; + :} ; paramlist ::= paramlist:pl param:p {: @@ -161,7 +178,7 @@ param ::= TYPE:typeprm IDENT:idprm COMMA pn.addChild("param_ident").setLiteral(idprm); RESULT = pn; :} - /* generic/template with one type, e.g. list */ + /* generic/template with one type, e.g. set */ | IDENT:clsprm LANG TYPE:typegen RANG IDENT:idprm {: ParseNode pn = new ParseNode("param"); @@ -177,7 +194,7 @@ param ::= TYPE:typeprm IDENT:idprm COMMA RESULT = pn; :} /* Add comma at the end... */ - /* generic/template with one type, e.g. list */ + /* generic/template with one type, e.g. set */ | IDENT:clsprm LANG TYPE:typegen RANG IDENT:idprm COMMA {: ParseNode pn = new ParseNode("param");