From d114b5b9220636066eaf6dd1c2724f747b85dc78 Mon Sep 17 00:00:00 2001 From: rtrimana Date: Fri, 16 Sep 2016 19:46:38 -0700 Subject: [PATCH 1/1] First version of parser; Generates AST in XML and HTML format. --- README.md | 0 common.mk | 12 + config/iotparser/policy.pol | 30 + config/iotparser/tree-view.xsl | 123 +++ config/iotparser/tree.xsl | 63 ++ iotjava/Makefile | 20 + iotjava/iotparser/Lexer.java | 901 ++++++++++++++++++ iotjava/iotparser/Parser.java | 690 ++++++++++++++ iotjava/iotparser/sym.java | 55 ++ .../java-cup-11b-runtime.jar | Bin 0 -> 30960 bytes .../java-cup-11b.jar | Bin 0 -> 122080 bytes others/javacup/README | 8 + others/javacup/iotparser.cup | 100 ++ others/jflex/README | 8 + others/jflex/iotparser.jflex | 131 +++ 15 files changed, 2141 insertions(+) create mode 100644 README.md create mode 100644 common.mk create mode 100644 config/iotparser/policy.pol create mode 100644 config/iotparser/tree-view.xsl create mode 100644 config/iotparser/tree.xsl create mode 100644 iotjava/Makefile create mode 100644 iotjava/iotparser/Lexer.java create mode 100644 iotjava/iotparser/Parser.java create mode 100644 iotjava/iotparser/sym.java create mode 100644 jars/java-cup-bin-11b-20160615/java-cup-11b-runtime.jar create mode 100644 jars/java-cup-bin-11b-20160615/java-cup-11b.jar create mode 100644 others/javacup/README create mode 100644 others/javacup/iotparser.cup create mode 100644 others/jflex/README create mode 100644 others/jflex/iotparser.jflex diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/common.mk b/common.mk new file mode 100644 index 0000000..ed6efc9 --- /dev/null +++ b/common.mk @@ -0,0 +1,12 @@ +JAVA := java +JAR := jar +JAVADOC := javadoc +JAVAC := javac +BIN_DIR := $(BASE)/bin +DOCS_DIR := $(BASE)/doc +RUNTIMEJARS := $(BASE)/jars/asm-all-5.0.3.jar +CHECKERJARS := $(BASE)/jars/checker.jar:$(BASE)/jars/javac.jar +PHONEJARS := $(BASE)/jars/java-json.jar +ZIPJARS := $(BASE)/jars/zip4j_1.3.2.jar +BRILLOJARS := $(BASE)/jars/brillo/*:$(BASE)/jars/brillo/libs/* +PARSERJARS := $(BASE)/jars/java-cup-bin-11b-20160615/* diff --git a/config/iotparser/policy.pol b/config/iotparser/policy.pol new file mode 100644 index 0000000..7bcefcd --- /dev/null +++ b/config/iotparser/policy.pol @@ -0,0 +1,30 @@ +public interface Camera { + public void MethodA(int A, int B); + public int MethodB(int C, string D); + public string MethodC(string E, int F); + public float MethodD(int G, float H); + public boolean MethodE(Camera I, boolean J); + public void MethodF(); +} + +capability Camera.ImageCapture { + description = "The quick brown fox jumps over the smart dog"; + description = "Another description"; + method = MethodA; + method = MethodB; +} + +capability Camera.VideoRecording { + description = "The quick brown fox jumps over the cool dog"; + method = MethodC; + method = MethodD; +} + +capability Camera.BackupData { + description = "The quick brown fox jumps over the clever dog"; + method = MethodE; +} + +requires Camera with VideoRecording, ImageCapture as interface CameraWithCaptureAndData; + +requires Camera with ImageCapture, VideoRecording as interface CameraWithCaptureAndRecording; diff --git a/config/iotparser/tree-view.xsl b/config/iotparser/tree-view.xsl new file mode 100644 index 0000000..0a2e141 --- /dev/null +++ b/config/iotparser/tree-view.xsl @@ -0,0 +1,123 @@ + + + + + ' + + + + + + Parse-Tree + + + +

Parse-Tree

+ + + +
+ + + + + + + +
+ + ___ + +   +
+ + +
+ + + +    + \___ + +   + + + + = + + + + + +
+
+ + + +
+ + ___ +   + + + + + +
+
+ + + + + + + + + +   |   +   + + +      +    + + + + + +    + | + + +     + + + + + + + + + + + + + \n + + + + + + + \t + + + + + + + + +
diff --git a/config/iotparser/tree.xsl b/config/iotparser/tree.xsl new file mode 100644 index 0000000..05e1b27 --- /dev/null +++ b/config/iotparser/tree.xsl @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/iotjava/Makefile b/iotjava/Makefile new file mode 100644 index 0000000..fa16fc7 --- /dev/null +++ b/iotjava/Makefile @@ -0,0 +1,20 @@ +BASE := .. + +include $(BASE)/common.mk + +all: iotparser + +PHONY += iotparser +iotparser: + $(JAVAC) -cp .:$(PARSERJARS) -d $(BIN_DIR) iotparser/*.java + cp ../config/iotparser/* $(BIN_DIR)/iotparser/ + +PHONY += iotparse +iotparse: + cd $(BIN_DIR)/iotparser; $(JAVA) -cp .:..:../$(PARSERJARS):../$(BIN_DIR) iotparser.Parser policy.pol out.xml + +PHONY += doc +doc: iotruntime iotinstaller + $(JAVADOC) -d $(DOCS_DIR) iotparser/*.java + +.PHONY: $(PHONY) diff --git a/iotjava/iotparser/Lexer.java b/iotjava/iotparser/Lexer.java new file mode 100644 index 0000000..c527efb --- /dev/null +++ b/iotjava/iotparser/Lexer.java @@ -0,0 +1,901 @@ +package iotparser; + +/* The following code was generated by JFlex 1.6.1 */ + +// JFlex parser specification written by +// Rahmadi Trimananda +// for Sentinel system +// University of California, Irvine + +// Technische Universitaet Muenchen +// Fakultaet fuer Informatik + +import java_cup.runtime.Symbol; +import java_cup.runtime.ComplexSymbolFactory; +import java_cup.runtime.ComplexSymbolFactory.Location; + + +/** + * This class is a scanner generated by + * JFlex 1.6.1 + * from the specification file iotparser.jflex + */ +public class Lexer implements java_cup.runtime.Scanner, sym { + + /** 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 STRING = 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 + }; + + /** + * Translates characters to character classes + */ + private static final String ZZ_CMAP_PACKED = + "\11\0\1\6\1\4\1\46\1\6\1\3\22\0\1\6\1\0\1\35"+ + "\1\0\1\1\3\0\1\40\1\41\2\0\1\36\1\0\1\37\1\0"+ + "\12\2\1\0\1\5\1\0\1\44\3\0\32\1\1\0\1\45\2\0"+ + "\1\1\1\0\1\24\1\16\1\27\1\25\1\20\1\23\1\22\1\13"+ + "\1\7\2\1\1\21\1\32\1\10\1\14\1\31\1\33\1\15\1\12"+ + "\1\11\1\26\1\30\1\34\1\1\1\17\1\1\1\42\1\0\1\43"+ + "\7\0\1\46\u1fa2\0\1\46\1\46\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\udfe6\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 = + "\2\0\1\1\1\2\2\3\1\4\15\2\1\5\1\6"+ + "\1\7\1\10\1\11\1\12\1\13\1\14\1\15\1\16"+ + "\1\17\1\0\10\2\1\20\10\2\1\21\1\22\1\23"+ + "\1\24\1\25\24\2\1\26\1\27\3\2\1\30\1\2"+ + "\1\31\2\2\1\32\2\2\1\33\2\2\1\34\6\2"+ + "\1\35\2\2\1\36\2\2\1\37\1\40\2\2\1\41"+ + "\3\2\1\42\2\2\1\43\3\2\1\44\1\45"; + + private static int [] zzUnpackAction() { + int [] result = new int[120]; + 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\47\0\116\0\165\0\234\0\116\0\116\0\303"+ + "\0\352\0\u0111\0\u0138\0\u015f\0\u0186\0\u01ad\0\u01d4\0\u01fb"+ + "\0\u0222\0\u0249\0\u0270\0\u0297\0\116\0\116\0\116\0\116"+ + "\0\116\0\116\0\116\0\116\0\u02be\0\116\0\u02e5\0\u030c"+ + "\0\u0333\0\u035a\0\u0381\0\u03a8\0\u03cf\0\u03f6\0\u041d\0\u0444"+ + "\0\165\0\u046b\0\u0492\0\u04b9\0\u04e0\0\u0507\0\u052e\0\u0555"+ + "\0\u057c\0\116\0\116\0\116\0\116\0\u05a3\0\u05ca\0\u05f1"+ + "\0\u0618\0\u063f\0\u0666\0\u068d\0\u06b4\0\u06db\0\u0702\0\u0729"+ + "\0\u0750\0\u0777\0\u079e\0\u07c5\0\u07ec\0\u0813\0\u083a\0\u0861"+ + "\0\u0888\0\u08af\0\165\0\165\0\u08d6\0\u08fd\0\u0924\0\165"+ + "\0\u094b\0\165\0\u0972\0\u0999\0\165\0\u09c0\0\u09e7\0\165"+ + "\0\u0a0e\0\u0a35\0\165\0\u0a5c\0\u0a83\0\u0aaa\0\u0ad1\0\u0af8"+ + "\0\u0b1f\0\165\0\u0b46\0\u0b6d\0\165\0\u0b94\0\u0bbb\0\165"+ + "\0\165\0\u0be2\0\u0c09\0\165\0\u0c30\0\u0c57\0\u0c7e\0\165"+ + "\0\u0ca5\0\u0ccc\0\165\0\u0cf3\0\u0d1a\0\u0d41\0\165\0\165"; + + private static int [] zzUnpackRowMap() { + int [] result = new int[120]; + 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\3\1\4\1\3\1\5\1\6\1\7\1\6\1\10"+ + "\2\4\1\11\2\4\1\12\1\13\2\4\1\14\1\4"+ + "\1\15\1\16\1\17\1\4\1\20\1\21\1\22\1\23"+ + "\1\4\1\24\1\25\1\26\1\27\1\30\1\31\1\32"+ + "\1\33\1\34\1\3\1\0\3\35\1\0\1\3\30\35"+ + "\1\36\7\35\1\37\1\35\50\0\2\4\4\0\26\4"+ + "\16\0\1\40\43\0\2\4\4\0\1\4\1\41\24\4"+ + "\13\0\2\4\4\0\2\4\1\42\1\4\1\43\21\4"+ + "\13\0\2\4\4\0\11\4\1\44\14\4\13\0\2\4"+ + "\4\0\5\4\1\45\2\4\1\46\15\4\13\0\2\4"+ + "\4\0\5\4\1\47\20\4\13\0\2\4\4\0\12\4"+ + "\1\50\13\4\13\0\2\4\4\0\3\4\1\51\22\4"+ + "\13\0\2\4\4\0\5\4\1\52\3\4\1\53\14\4"+ + "\13\0\2\4\4\0\4\4\1\54\10\4\1\55\10\4"+ + "\13\0\2\4\4\0\5\4\1\56\20\4\13\0\2\4"+ + "\4\0\17\4\1\57\6\4\13\0\2\4\4\0\11\4"+ + "\1\60\14\4\13\0\2\4\4\0\1\61\25\4\12\0"+ + "\3\35\2\0\30\35\1\0\7\35\1\0\1\35\10\0"+ + "\1\62\1\63\3\0\1\64\17\0\1\65\16\0\1\6"+ + "\42\0\2\4\4\0\2\4\1\66\23\4\13\0\2\4"+ + "\4\0\6\4\1\67\17\4\13\0\2\4\4\0\5\4"+ + "\1\70\20\4\13\0\2\4\4\0\24\4\1\71\1\4"+ + "\13\0\2\4\4\0\5\4\1\72\20\4\13\0\2\4"+ + "\4\0\2\4\1\73\23\4\13\0\2\4\4\0\1\4"+ + "\1\74\24\4\13\0\2\4\4\0\5\4\1\75\20\4"+ + "\13\0\2\4\4\0\17\4\1\76\6\4\13\0\2\4"+ + "\4\0\3\4\1\77\22\4\13\0\2\4\4\0\15\4"+ + "\1\100\10\4\13\0\2\4\4\0\22\4\1\101\3\4"+ + "\13\0\2\4\4\0\1\102\25\4\13\0\2\4\4\0"+ + "\7\4\1\103\16\4\13\0\2\4\4\0\2\4\1\104"+ + "\23\4\13\0\2\4\4\0\2\4\1\105\23\4\13\0"+ + "\2\4\4\0\11\4\1\106\14\4\13\0\2\4\4\0"+ + "\1\107\25\4\13\0\2\4\4\0\6\4\1\110\17\4"+ + "\13\0\2\4\4\0\17\4\1\111\6\4\13\0\2\4"+ + "\4\0\12\4\1\112\13\4\13\0\2\4\4\0\11\4"+ + "\1\113\14\4\13\0\2\4\4\0\13\4\1\114\12\4"+ + "\13\0\2\4\4\0\15\4\1\115\10\4\13\0\2\4"+ + "\4\0\7\4\1\116\16\4\13\0\2\4\4\0\20\4"+ + "\1\117\5\4\13\0\2\4\4\0\6\4\1\120\17\4"+ + "\13\0\2\4\4\0\15\4\1\121\10\4\13\0\2\4"+ + "\4\0\16\4\1\122\7\4\13\0\2\4\4\0\12\4"+ + "\1\123\13\4\13\0\2\4\4\0\4\4\1\124\21\4"+ + "\13\0\2\4\4\0\4\4\1\125\21\4\13\0\2\4"+ + "\4\0\6\4\1\126\17\4\13\0\2\4\4\0\1\4"+ + "\1\127\24\4\13\0\2\4\4\0\2\4\1\130\23\4"+ + "\13\0\2\4\4\0\1\131\25\4\13\0\2\4\4\0"+ + "\11\4\1\132\14\4\13\0\2\4\4\0\2\4\1\133"+ + "\23\4\13\0\2\4\4\0\12\4\1\134\13\4\13\0"+ + "\2\4\4\0\6\4\1\135\17\4\13\0\2\4\4\0"+ + "\7\4\1\136\16\4\13\0\2\4\4\0\1\137\25\4"+ + "\13\0\2\4\4\0\5\4\1\140\20\4\13\0\2\4"+ + "\4\0\14\4\1\141\11\4\13\0\2\4\4\0\13\4"+ + "\1\142\12\4\13\0\2\4\4\0\6\4\1\143\17\4"+ + "\13\0\2\4\4\0\15\4\1\144\10\4\13\0\2\4"+ + "\4\0\11\4\1\145\14\4\13\0\2\4\4\0\1\146"+ + "\25\4\13\0\2\4\4\0\1\147\25\4\13\0\2\4"+ + "\4\0\20\4\1\150\5\4\13\0\2\4\4\0\16\4"+ + "\1\151\7\4\13\0\2\4\4\0\15\4\1\152\10\4"+ + "\13\0\2\4\4\0\11\4\1\153\14\4\13\0\2\4"+ + "\4\0\1\4\1\154\24\4\13\0\2\4\4\0\22\4"+ + "\1\155\3\4\13\0\2\4\4\0\12\4\1\156\13\4"+ + "\13\0\2\4\4\0\20\4\1\157\5\4\13\0\2\4"+ + "\4\0\3\4\1\160\22\4\13\0\2\4\4\0\2\4"+ + "\1\161\23\4\13\0\2\4\4\0\1\162\25\4\13\0"+ + "\2\4\4\0\11\4\1\163\14\4\13\0\2\4\4\0"+ + "\1\164\25\4\13\0\2\4\4\0\2\4\1\165\23\4"+ + "\13\0\2\4\4\0\5\4\1\166\20\4\13\0\2\4"+ + "\4\0\10\4\1\167\15\4\13\0\2\4\4\0\1\4"+ + "\1\170\24\4\12\0"; + + private static int [] zzUnpackTrans() { + int [] result = new int[3432]; + 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[] = { + "Unknown internal scanner error", + "Error: could not match input", + "Error: pushback value was too large" + }; + + /** + * ZZ_ATTRIBUTE[aState] contains the attributes of state aState + */ + private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute(); + + private static final String ZZ_ATTRIBUTE_PACKED_0 = + "\2\0\1\11\2\1\2\11\15\1\10\11\1\1\1\11"+ + "\1\1\1\0\21\1\4\11\103\1"; + + private static int [] zzUnpackAttribute() { + int [] result = new int[120]; + 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; + + /** + * The number of occupied positions in zzBuffer beyond zzEndRead. + * When a lead/high surrogate has been read from the input stream + * into the final zzBuffer position, this will have a value of 1; + * otherwise, it will have a value of 0. + */ + private int zzFinalHighSurrogate = 0; + + /* user code: */ + StringBuffer string = new StringBuffer(); + public Lexer(java.io.Reader in, ComplexSymbolFactory sf){ + this(in); + symbolFactory = sf; + } + ComplexSymbolFactory symbolFactory; + + private Symbol symbol(String name, int sym) { + return symbolFactory.newSymbol(name, sym, new Location(yyline+1,yycolumn+1,yychar), new Location(yyline+1,yycolumn+yylength(),yychar+yylength())); + } + + private Symbol symbol(String name, int sym, Object val) { + Location left = new Location(yyline+1,yycolumn+1,yychar); + Location right= new Location(yyline+1,yycolumn+yylength(), yychar+yylength()); + return symbolFactory.newSymbol(name, sym, left, right,val); + } + private Symbol symbol(String name, int sym, Object val,int buflength) { + Location left = new Location(yyline+1,yycolumn+yylength()-buflength,yychar+yylength()-buflength); + Location right= new Location(yyline+1,yycolumn+yylength(), yychar+yylength()); + return symbolFactory.newSymbol(name, sym, left, right,val); + } + private void error(String message) { + System.out.println("Error at line "+(yyline+1)+", column "+(yycolumn+1)+" : "+message); + } + + + /** + * Creates a new scanner + * + * @param in the java.io.Reader to read input from. + */ + public Lexer(java.io.Reader in) { + this.zzReader = 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[0x110000]; + int i = 0; /* index in packed string */ + int j = 0; /* index in unpacked array */ + while (i < 164) { + int count = packed.charAt(i++); + char value = packed.charAt(i++); + do map[j++] = value; while (--count > 0); + } + return map; + } + + + /** + * Refills the input buffer. + * + * @return false, 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) { + zzEndRead += zzFinalHighSurrogate; + zzFinalHighSurrogate = 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 - zzFinalHighSurrogate) { + /* if not: blow it up */ + char newBuffer[] = new char[zzBuffer.length*2]; + System.arraycopy(zzBuffer, 0, newBuffer, 0, zzBuffer.length); + zzBuffer = newBuffer; + zzEndRead += zzFinalHighSurrogate; + zzFinalHighSurrogate = 0; + } + + /* fill the buffer with new input */ + int requested = zzBuffer.length - zzEndRead; + int numRead = zzReader.read(zzBuffer, zzEndRead, requested); + + /* not supposed to occur according to specification of java.io.Reader */ + if (numRead == 0) { + throw new java.io.IOException("Reader returned 0 characters. See JFlex examples for workaround."); + } + if (numRead > 0) { + zzEndRead += numRead; + /* If numRead == requested, we might have requested to few chars to + encode a full Unicode character. We assume that a Reader would + otherwise never return half characters. */ + if (numRead == requested) { + if (Character.isHighSurrogate(zzBuffer[zzEndRead - 1])) { + --zzEndRead; + zzFinalHighSurrogate = 1; + } + } + /* potentially more input available */ + return false; + } + + /* numRead < 0 ==> end of stream */ + 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 + * cannot be reused (internal buffer is discarded and lost). + * Lexical state is set to ZZ_INITIAL. + * + * Internal scan buffer is resized down to its initial length, if it has grown. + * + * @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; + zzFinalHighSurrogate = 0; + yyline = yychar = yycolumn = 0; + zzLexicalState = YYINITIAL; + if (zzBuffer.length > ZZ_BUFFERSIZE) + zzBuffer = new char[ZZ_BUFFERSIZE]; + } + + + /** + * 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 pos 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 { + 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; + + yychar+= zzMarkedPosL-zzStartRead; + + boolean zzR = false; + int zzCh; + int zzCharCount; + for (zzCurrentPosL = zzStartRead ; + zzCurrentPosL < zzMarkedPosL ; + zzCurrentPosL += zzCharCount ) { + zzCh = Character.codePointAt(zzBufferL, zzCurrentPosL, zzMarkedPosL); + zzCharCount = Character.charCount(zzCh); + switch (zzCh) { + 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 += zzCharCount; + } + } + + 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]; + + // set up zzAction for empty match case: + int zzAttributes = zzAttrL[zzState]; + if ( (zzAttributes & 1) == 1 ) { + zzAction = zzState; + } + + + zzForAction: { + while (true) { + + if (zzCurrentPosL < zzEndReadL) { + zzInput = Character.codePointAt(zzBufferL, zzCurrentPosL, zzEndReadL); + zzCurrentPosL += Character.charCount(zzInput); + } + 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 = Character.codePointAt(zzBufferL, zzCurrentPosL, zzEndReadL); + zzCurrentPosL += Character.charCount(zzInput); + } + } + int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ]; + if (zzNext == -1) break zzForAction; + zzState = zzNext; + + zzAttributes = zzAttrL[zzState]; + if ( (zzAttributes & 1) == 1 ) { + zzAction = zzState; + zzMarkedPosL = zzCurrentPosL; + if ( (zzAttributes & 8) == 8 ) break zzForAction; + } + + } + } + + // store back cached position + zzMarkedPos = zzMarkedPosL; + + if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { + zzAtEOF = true; + zzDoEOF(); + { return symbolFactory.newSymbol("EOF", EOF, new Location(yyline+1,yycolumn+1,yychar), new Location(yyline+1,yycolumn+1,yychar+1)); + } + } + else { + switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) { + case 1: + { /* throw new Error("Illegal character <"+ yytext()+">");*/ + error("Illegal character <"+ yytext()+">"); + } + case 38: break; + case 2: + { return symbol("Identifier",IDENT, yytext()); + } + case 39: break; + case 3: + { /* ignore */ + } + case 40: break; + case 4: + { return symbol("semicolon",SEMICOLON); + } + case 41: break; + case 5: + { string.setLength(0); yybegin(STRING); + } + case 42: break; + case 6: + { return symbol("comma",COMMA); + } + case 43: break; + case 7: + { return symbol("dot",DOT); + } + case 44: break; + case 8: + { return symbol("(",LPAR); + } + case 45: break; + case 9: + { return symbol(")",RPAR); + } + case 46: break; + case 10: + { return symbol("{",BEGIN); + } + case 47: break; + case 11: + { return symbol("}",END); + } + case 48: break; + case 12: + { return symbol("=",ASSIGN); + } + case 49: break; + case 13: + { string.append( yytext() ); + } + case 50: break; + case 14: + { yybegin(YYINITIAL); + return symbol("StringConst",STRINGCONST,string.toString(),string.length()); + } + case 51: break; + case 15: + { string.append('\\'); + } + case 52: break; + case 16: + { return symbol("as",AS); + } + case 53: break; + case 17: + { string.append('\n'); + } + case 54: break; + case 18: + { string.append('\t'); + } + case 55: break; + case 19: + { string.append('\r'); + } + case 56: break; + case 20: + { string.append('\"'); + } + case 57: break; + case 21: + { return symbol("int",TYPE, "INT" ); + } + case 58: break; + case 22: + { return symbol("byte",TYPE, "BYTE" ); + } + case 59: break; + case 23: + { return symbol("long",TYPE, "LONG" ); + } + case 60: break; + case 24: + { return symbol("char",TYPE, "CHAR" ); + } + case 61: break; + case 25: + { return symbol("void",TYPE, "VOID" ); + } + case 62: break; + case 26: + { return symbol("with",WITH); + } + case 63: break; + case 27: + { return symbol("short",TYPE, "SHORT" ); + } + case 64: break; + case 28: + { return symbol("float",TYPE, "FLOAT" ); + } + case 65: break; + case 29: + { return symbol("string",TYPE, "STRING" ); + } + case 66: break; + case 30: + { return symbol("double",TYPE, "DOUBLE" ); + } + case 67: break; + case 31: + { return symbol("public",PUBLIC); + } + case 68: break; + case 32: + { return symbol("method",METHOD); + } + case 69: break; + case 33: + { return symbol("boolean",TYPE, "BOOL" ); + } + case 70: break; + case 34: + { return symbol("requires",REQUIRES); + } + case 71: break; + case 35: + { return symbol("interface",INTERFACE); + } + case 72: break; + case 36: + { return symbol("capability",CAPABILITY); + } + case 73: break; + case 37: + { return symbol("description",DESCRIPTION); + } + case 74: break; + default: + zzScanError(ZZ_NO_MATCH); + } + } + } + } + + +} diff --git a/iotjava/iotparser/Parser.java b/iotjava/iotparser/Parser.java new file mode 100644 index 0000000..99b2ae1 --- /dev/null +++ b/iotjava/iotparser/Parser.java @@ -0,0 +1,690 @@ +package iotparser; + +//---------------------------------------------------- +// The following code was generated by CUP v0.11b 20160615 (GIT 4ac7450) +//---------------------------------------------------- + +import java_cup.runtime.ComplexSymbolFactory; +import java_cup.runtime.ScannerBuffer; +import java_cup.runtime.XMLElement; +import javax.xml.stream.XMLOutputFactory; +import javax.xml.stream.XMLStreamWriter; +import java.io.*; +import javax.xml.transform.*; +import javax.xml.transform.stream.*; +import java_cup.runtime.ComplexSymbolFactory.Location; +import java_cup.runtime.XMLElement; + +/** CUP v0.11b 20160615 (GIT 4ac7450) generated parser. + */ +@SuppressWarnings({"rawtypes"}) +public class Parser extends java_cup.runtime.lr_parser { + + public final Class getSymbolContainer() { + return sym.class; +} + + /** Default constructor. */ + @Deprecated + public Parser() {super();} + + /** Constructor which sets the default scanner. */ + @Deprecated + public Parser(java_cup.runtime.Scanner s) {super(s);} + + /** Constructor which sets the default scanner. */ + public Parser(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\032\000\002\002\005\000\002\002\004\000\002\003" + + "\010\000\002\003\002\000\002\004\004\000\002\004\002" + + "\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\010\004\000\002\010\002\000\002\011" + + "\011\000\002\012\004\000\002\012\002\000\002\013\006" + + "\000\002\013\006\000\002\014\004\000\002\014\002\000" + + "\002\015\012\000\002\016\003\000\002\016\005\000\002" + + "\016\002" }); + + /** Access to production table. */ + public short[][] production_table() {return _production_table;} + + /** Parse-action table. */ + protected static final short[][] _action_table = + unpackFromStrings(new String[] { + "\000\070\000\012\002\ufffe\014\005\016\ufffe\021\ufffe\001" + + "\002\000\010\002\ufff3\016\ufff3\021\ufff3\001\002\000\004" + + "\015\010\001\002\000\004\002\007\001\002\000\004\002" + + "\000\001\002\000\004\025\011\001\002\000\004\011\012" + + "\001\002\000\006\012\ufffc\014\ufffc\001\002\000\006\012" + + "\016\014\015\001\002\000\006\012\ufffd\014\ufffd\001\002" + + "\000\004\024\017\001\002\000\010\002\uffff\016\uffff\021" + + "\uffff\001\002\000\004\025\020\001\002\000\004\007\021" + + "\001\002\000\010\010\ufff9\024\ufff9\025\ufff9\001\002\000" + + "\010\010\025\024\026\025\023\001\002\000\004\025\032" + + "\001\002\000\010\010\ufffa\024\ufffa\025\ufffa\001\002\000" + + "\004\004\031\001\002\000\004\025\027\001\002\000\012" + + "\005\030\010\ufff7\024\ufff7\025\ufff7\001\002\000\010\010" + + "\ufff8\024\ufff8\025\ufff8\001\002\000\006\012\ufffb\014\ufffb" + + "\001\002\000\012\005\033\010\ufff5\024\ufff5\025\ufff5\001" + + "\002\000\010\010\ufff6\024\ufff6\025\ufff6\001\002\000\010" + + "\002\uffec\016\037\021\uffec\001\002\000\010\002\ufff4\016" + + "\ufff4\021\ufff4\001\002\000\006\002\001\021\057\001\002" + + "\000\004\025\040\001\002\000\004\006\041\001\002\000" + + "\004\025\042\001\002\000\004\011\043\001\002\000\010" + + "\012\ufff0\017\ufff0\020\ufff0\001\002\000\010\012\047\017" + + "\046\020\050\001\002\000\010\012\ufff1\017\ufff1\020\ufff1" + + "\001\002\000\004\013\054\001\002\000\010\002\ufff2\016" + + "\ufff2\021\ufff2\001\002\000\004\013\051\001\002\000\004" + + "\025\052\001\002\000\004\004\053\001\002\000\010\012" + + "\uffee\017\uffee\020\uffee\001\002\000\004\026\055\001\002" + + "\000\004\004\056\001\002\000\010\012\uffef\017\uffef\020" + + "\uffef\001\002\000\004\025\061\001\002\000\006\002\uffed" + + "\021\uffed\001\002\000\004\022\062\001\002\000\010\005" + + "\uffe8\023\uffe8\025\063\001\002\000\006\005\uffea\023\uffea" + + "\001\002\000\006\005\065\023\066\001\002\000\004\025" + + "\072\001\002\000\004\015\067\001\002\000\004\025\070" + + "\001\002\000\004\004\071\001\002\000\006\002\uffeb\021" + + "\uffeb\001\002\000\006\005\uffe9\023\uffe9\001\002" }); + + /** Access to parse-action table. */ + public short[][] action_table() {return _action_table;} + + /** reduce_goto table. */ + protected static final short[][] _reduce_table = + unpackFromStrings(new String[] { + "\000\070\000\006\002\005\003\003\001\001\000\004\010" + + "\033\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" + + "\012\001\001\000\004\005\013\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\021\001\001\000\004\007\023" + + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + + "\001\000\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\011\034\014\035\001\001\000\002\001\001\000\004" + + "\015\057\001\001\000\002\001\001\000\002\001\001\000" + + "\002\001\001\000\002\001\001\000\004\012\043\001\001" + + "\000\004\013\044\001\001\000\002\001\001\000\002\001" + + "\001\000\002\001\001\000\002\001\001\000\002\001\001" + + "\000\002\001\001\000\002\001\001\000\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\016\063\001\001\000" + + "\002\001\001\000\002\001\001\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 reduce_goto table. */ + public short[][] reduce_table() {return _reduce_table;} + + /** Instance of action encapsulation class. */ + protected CUP$Parser$actions action_obj; + + /** Action encapsulation object initializer. */ + protected void init_actions() + { + action_obj = new CUP$Parser$actions(this); + } + + /** Invoke a user supplied parse action. */ + public java_cup.runtime.Symbol do_action( + int act_num, + java_cup.runtime.lr_parser parser, + java.util.Stack stack, + int top) + throws java.lang.Exception + { + /* call code in generated class */ + return action_obj.CUP$Parser$do_action(act_num, parser, stack, top); + } + + /** Indicates start state. */ + public int start_state() {return 0;} + /** Indicates start production. */ + public int start_production() {return 1;} + + /** EOF Symbol index. */ + public int EOF_sym() {return 0;} + + /** error Symbol index. */ + public int error_sym() {return 1;} + + + + public Parser(Lexer lex, ComplexSymbolFactory sf) { + super(lex,sf); + } + public static void main(String[] args) throws Exception { + // initialize the symbol factory + ComplexSymbolFactory csf = new ComplexSymbolFactory(); + // create a buffering scanner wrapper + ScannerBuffer lexer = new ScannerBuffer(new Lexer(new BufferedReader(new FileReader(args[0])),csf)); + // start parsing + Parser p = new Parser(lexer,csf); + XMLElement e = (XMLElement)p.parse().value; + // create XML output file + XMLOutputFactory outFactory = XMLOutputFactory.newInstance(); + XMLStreamWriter sw = outFactory.createXMLStreamWriter(new FileOutputStream(args[1]), "UTF-8"); + // dump XML output to the file + XMLElement.dump(lexer,sw,e,"expr","stmt"); + + // transform the parse tree into an AST and a rendered HTML version + Transformer transformer = TransformerFactory.newInstance() + .newTransformer(new StreamSource(new File("tree.xsl"))); + Source text = new StreamSource(new File(args[1])); + transformer.transform(text, new StreamResult(new File("output.xml"))); + transformer = TransformerFactory.newInstance() + .newTransformer(new StreamSource(new File("tree-view.xsl"))); + text = new StreamSource(new File("output.xml")); + transformer.transform(text, new StreamResult(new File("ast.html"))); + } + + +/** Cup generated class to encapsulate user supplied action code.*/ +@SuppressWarnings({"rawtypes", "unchecked", "unused"}) +class CUP$Parser$actions { + private final Parser parser; + + /** Constructor */ + CUP$Parser$actions(Parser parser) { + this.parser = parser; + } + + /** Method 0 with the actual generated action code for actions 0 to 300. */ + public final java_cup.runtime.Symbol CUP$Parser$do_action_part00000000( + int CUP$Parser$act_num, + java_cup.runtime.lr_parser CUP$Parser$parser, + java.util.Stack CUP$Parser$stack, + int CUP$Parser$top) + throws java.lang.Exception + { + /* Symbol object for return from actions */ + java_cup.runtime.Symbol CUP$Parser$result; + + /* select the action based on the action number */ + switch (CUP$Parser$act_num) + { + /*. . . . . . . . . . . . . . . . . . . .*/ + case 0: // policy ::= intface capablist reqlist + { + XMLElement RESULT; + Location inxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).xleft; + Location inxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).xright; + Object in = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-2)).value; + Location capxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).xleft; + Location capxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).xright; + Object cap = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value; + Location rlxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.peek()).xleft; + Location rlxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.peek()).xright; + Object rl = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.peek()).value; + + RESULT = new XMLElement.NonTerminal("policy",0,(XMLElement)in,(XMLElement)cap,(XMLElement)rl); + CUP$Parser$result = parser.getSymbolFactory().newSymbol("policy",0, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)), ((java_cup.runtime.Symbol)CUP$Parser$stack.peek()), RESULT); + } + return CUP$Parser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 1: // $START ::= policy EOF + { + XMLElement RESULT; + Location start_valxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).xleft; + Location start_valxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).xright; + Object start_val = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value; + Location EOF1xleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.peek()).xleft; + Location EOF1xright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.peek()).xright; + Object EOF1 = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.peek()).value; + + RESULT = new XMLElement.NonTerminal("_START",0,(XMLElement)start_val); + CUP$Parser$result = parser.getSymbolFactory().newSymbol("$START",0, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)), ((java_cup.runtime.Symbol)CUP$Parser$stack.peek()), RESULT); + } + /* ACCEPT */ + CUP$Parser$parser.done_parsing(); + return CUP$Parser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 2: // intface ::= PUBLIC INTERFACE IDENT BEGIN methlist END + { + XMLElement RESULT; + Location PUBLIC0xleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-5)).xleft; + Location PUBLIC0xright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-5)).xright; + Object PUBLIC0 = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-5)).value; + Location INTERFACE1xleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-4)).xleft; + Location INTERFACE1xright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-4)).xright; + Object INTERFACE1 = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-4)).value; + Location idintxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-3)).xleft; + Location idintxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-3)).xright; + Object idint = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-3)).value; + Location BEGIN3xleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).xleft; + Location BEGIN3xright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).xright; + Object BEGIN3 = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-2)).value; + Location mlxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).xleft; + Location mlxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).xright; + Object ml = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value; + Location END5xleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.peek()).xleft; + Location END5xright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.peek()).xright; + Object END5 = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.peek()).value; + + RESULT = new XMLElement.NonTerminal("intface",0,new XMLElement.Terminal(idintxleft,"idint",idint,idintxright),(XMLElement)ml); + CUP$Parser$result = parser.getSymbolFactory().newSymbol("intface",1, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-5)), ((java_cup.runtime.Symbol)CUP$Parser$stack.peek()), RESULT); + } + return CUP$Parser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 3: // intface ::= + { + XMLElement RESULT; + + RESULT = new XMLElement.NonTerminal("intface",1); + CUP$Parser$result = parser.getSymbolFactory().newSymbol("intface",1, ((java_cup.runtime.Symbol)CUP$Parser$stack.peek()), ((java_cup.runtime.Symbol)CUP$Parser$stack.peek()), RESULT); + } + return CUP$Parser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 4: // methlist ::= methlist meth + { + XMLElement RESULT; + Location mlxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).xleft; + Location mlxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).xright; + Object ml = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value; + Location mxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.peek()).xleft; + Location mxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.peek()).xright; + Object m = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.peek()).value; + + RESULT = new XMLElement.NonTerminal("methlist",0,(XMLElement)ml,(XMLElement)m); + CUP$Parser$result = parser.getSymbolFactory().newSymbol("methlist",2, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)), ((java_cup.runtime.Symbol)CUP$Parser$stack.peek()), RESULT); + } + return CUP$Parser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 5: // methlist ::= + { + XMLElement RESULT; + + RESULT = new XMLElement.NonTerminal("methlist",1); + CUP$Parser$result = parser.getSymbolFactory().newSymbol("methlist",2, ((java_cup.runtime.Symbol)CUP$Parser$stack.peek()), ((java_cup.runtime.Symbol)CUP$Parser$stack.peek()), RESULT); + } + return CUP$Parser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 6: // meth ::= PUBLIC TYPE IDENT LPAR paramlist RPAR SEMICOLON + { + XMLElement RESULT; + Location PUBLIC0xleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-6)).xleft; + Location PUBLIC0xright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-6)).xright; + Object PUBLIC0 = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-6)).value; + Location typemethxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-5)).xleft; + Location typemethxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-5)).xright; + Object typemeth = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-5)).value; + Location idmethxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-4)).xleft; + Location idmethxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-4)).xright; + Object idmeth = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-4)).value; + Location LPAR3xleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-3)).xleft; + Location LPAR3xright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-3)).xright; + Object LPAR3 = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-3)).value; + Location plxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).xleft; + Location plxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).xright; + Object pl = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-2)).value; + Location RPAR5xleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).xleft; + Location RPAR5xright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).xright; + Object RPAR5 = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value; + Location SEMICOLON6xleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.peek()).xleft; + Location SEMICOLON6xright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.peek()).xright; + Object SEMICOLON6 = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.peek()).value; + + RESULT = new XMLElement.NonTerminal("meth",0,new XMLElement.Terminal(typemethxleft,"typemeth",typemeth,typemethxright),new XMLElement.Terminal(idmethxleft,"idmeth",idmeth,idmethxright),(XMLElement)pl); + CUP$Parser$result = parser.getSymbolFactory().newSymbol("meth",3, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-6)), ((java_cup.runtime.Symbol)CUP$Parser$stack.peek()), RESULT); + } + return CUP$Parser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 7: // paramlist ::= paramlist param + { + XMLElement RESULT; + Location plxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).xleft; + Location plxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).xright; + Object pl = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value; + Location pxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.peek()).xleft; + Location pxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.peek()).xright; + Object p = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.peek()).value; + + RESULT = new XMLElement.NonTerminal("paramlist",0,(XMLElement)pl,(XMLElement)p); + CUP$Parser$result = parser.getSymbolFactory().newSymbol("paramlist",4, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)), ((java_cup.runtime.Symbol)CUP$Parser$stack.peek()), RESULT); + } + return CUP$Parser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 8: // paramlist ::= + { + XMLElement RESULT; + + RESULT = new XMLElement.NonTerminal("paramlist",1); + CUP$Parser$result = parser.getSymbolFactory().newSymbol("paramlist",4, ((java_cup.runtime.Symbol)CUP$Parser$stack.peek()), ((java_cup.runtime.Symbol)CUP$Parser$stack.peek()), RESULT); + } + return CUP$Parser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 9: // param ::= TYPE IDENT COMMA + { + XMLElement RESULT; + Location typeprmxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).xleft; + Location typeprmxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).xright; + Object typeprm = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-2)).value; + Location idprmxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).xleft; + Location idprmxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).xright; + Object idprm = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value; + Location COMMA2xleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.peek()).xleft; + Location COMMA2xright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.peek()).xright; + Object COMMA2 = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.peek()).value; + + RESULT = new XMLElement.NonTerminal("param",0,new XMLElement.Terminal(typeprmxleft,"typeprm",typeprm,typeprmxright),new XMLElement.Terminal(idprmxleft,"idprm",idprm,idprmxright)); + CUP$Parser$result = parser.getSymbolFactory().newSymbol("param",5, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)), ((java_cup.runtime.Symbol)CUP$Parser$stack.peek()), RESULT); + } + return CUP$Parser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 10: // param ::= TYPE IDENT + { + XMLElement RESULT; + Location typeprmxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).xleft; + Location typeprmxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).xright; + Object typeprm = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value; + Location idprmxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.peek()).xleft; + Location idprmxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.peek()).xright; + Object idprm = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.peek()).value; + + RESULT = new XMLElement.NonTerminal("param",1,new XMLElement.Terminal(typeprmxleft,"typeprm",typeprm,typeprmxright),new XMLElement.Terminal(idprmxleft,"idprm",idprm,idprmxright)); + CUP$Parser$result = parser.getSymbolFactory().newSymbol("param",5, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)), ((java_cup.runtime.Symbol)CUP$Parser$stack.peek()), RESULT); + } + return CUP$Parser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 11: // param ::= IDENT IDENT COMMA + { + XMLElement RESULT; + Location clsprmxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).xleft; + Location clsprmxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).xright; + Object clsprm = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-2)).value; + Location idprmxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).xleft; + Location idprmxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).xright; + Object idprm = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value; + Location COMMA2xleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.peek()).xleft; + Location COMMA2xright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.peek()).xright; + Object COMMA2 = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.peek()).value; + + RESULT = new XMLElement.NonTerminal("param",2,new XMLElement.Terminal(clsprmxleft,"clsprm",clsprm,clsprmxright),new XMLElement.Terminal(idprmxleft,"idprm",idprm,idprmxright)); + CUP$Parser$result = parser.getSymbolFactory().newSymbol("param",5, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)), ((java_cup.runtime.Symbol)CUP$Parser$stack.peek()), RESULT); + } + return CUP$Parser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 12: // param ::= IDENT IDENT + { + XMLElement RESULT; + Location clsprmxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).xleft; + Location clsprmxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).xright; + Object clsprm = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value; + Location idprmxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.peek()).xleft; + Location idprmxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.peek()).xright; + Object idprm = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.peek()).value; + + RESULT = new XMLElement.NonTerminal("param",3,new XMLElement.Terminal(clsprmxleft,"clsprm",clsprm,clsprmxright),new XMLElement.Terminal(idprmxleft,"idprm",idprm,idprmxright)); + CUP$Parser$result = parser.getSymbolFactory().newSymbol("param",5, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)), ((java_cup.runtime.Symbol)CUP$Parser$stack.peek()), RESULT); + } + return CUP$Parser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 13: // capablist ::= capablist capab + { + XMLElement RESULT; + Location clistxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).xleft; + Location clistxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).xright; + Object clist = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value; + Location capxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.peek()).xleft; + Location capxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.peek()).xright; + Object cap = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.peek()).value; + + RESULT = new XMLElement.NonTerminal("capablist",0,(XMLElement)clist,(XMLElement)cap); + CUP$Parser$result = parser.getSymbolFactory().newSymbol("capablist",6, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)), ((java_cup.runtime.Symbol)CUP$Parser$stack.peek()), RESULT); + } + return CUP$Parser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 14: // capablist ::= + { + XMLElement RESULT; + + RESULT = new XMLElement.NonTerminal("capablist",1); + CUP$Parser$result = parser.getSymbolFactory().newSymbol("capablist",6, ((java_cup.runtime.Symbol)CUP$Parser$stack.peek()), ((java_cup.runtime.Symbol)CUP$Parser$stack.peek()), RESULT); + } + return CUP$Parser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 15: // capab ::= CAPABILITY IDENT DOT IDENT BEGIN capabcont END + { + XMLElement RESULT; + Location CAPABILITY0xleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-6)).xleft; + Location CAPABILITY0xright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-6)).xright; + Object CAPABILITY0 = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-6)).value; + Location idintxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-5)).xleft; + Location idintxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-5)).xright; + Object idint = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-5)).value; + Location DOT2xleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-4)).xleft; + Location DOT2xright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-4)).xright; + Object DOT2 = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-4)).value; + Location idcapxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-3)).xleft; + Location idcapxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-3)).xright; + Object idcap = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-3)).value; + Location BEGIN4xleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).xleft; + Location BEGIN4xright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).xright; + Object BEGIN4 = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-2)).value; + Location ccontxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).xleft; + Location ccontxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).xright; + Object ccont = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value; + Location END6xleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.peek()).xleft; + Location END6xright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.peek()).xright; + Object END6 = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.peek()).value; + + RESULT = new XMLElement.NonTerminal("capab",0,new XMLElement.Terminal(idintxleft,"idint",idint,idintxright),new XMLElement.Terminal(idcapxleft,"idcap",idcap,idcapxright),(XMLElement)ccont); + CUP$Parser$result = parser.getSymbolFactory().newSymbol("capab",7, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-6)), ((java_cup.runtime.Symbol)CUP$Parser$stack.peek()), RESULT); + } + return CUP$Parser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 16: // capabcont ::= capabcont cont + { + XMLElement RESULT; + Location ccontxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).xleft; + Location ccontxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).xright; + Object ccont = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value; + Location cntxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.peek()).xleft; + Location cntxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.peek()).xright; + Object cnt = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.peek()).value; + + RESULT = new XMLElement.NonTerminal("capabcont",0,(XMLElement)ccont,(XMLElement)cnt); + CUP$Parser$result = parser.getSymbolFactory().newSymbol("capabcont",8, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)), ((java_cup.runtime.Symbol)CUP$Parser$stack.peek()), RESULT); + } + return CUP$Parser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 17: // capabcont ::= + { + XMLElement RESULT; + + RESULT = new XMLElement.NonTerminal("capabcont",1); + CUP$Parser$result = parser.getSymbolFactory().newSymbol("capabcont",8, ((java_cup.runtime.Symbol)CUP$Parser$stack.peek()), ((java_cup.runtime.Symbol)CUP$Parser$stack.peek()), RESULT); + } + return CUP$Parser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 18: // cont ::= DESCRIPTION ASSIGN STRINGCONST SEMICOLON + { + XMLElement RESULT; + Location dscxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-3)).xleft; + Location dscxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-3)).xright; + Object dsc = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-3)).value; + Location ASSIGN1xleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).xleft; + Location ASSIGN1xright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).xright; + Object ASSIGN1 = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-2)).value; + Location STRINGCONST2xleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).xleft; + Location STRINGCONST2xright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).xright; + Object STRINGCONST2 = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value; + Location SEMICOLON3xleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.peek()).xleft; + Location SEMICOLON3xright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.peek()).xright; + Object SEMICOLON3 = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.peek()).value; + + RESULT = new XMLElement.NonTerminal("cont",0,new XMLElement.Terminal(dscxleft,"dsc",dsc,dscxright)); + CUP$Parser$result = parser.getSymbolFactory().newSymbol("cont",9, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-3)), ((java_cup.runtime.Symbol)CUP$Parser$stack.peek()), RESULT); + } + return CUP$Parser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 19: // cont ::= METHOD ASSIGN IDENT SEMICOLON + { + XMLElement RESULT; + Location mtdxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-3)).xleft; + Location mtdxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-3)).xright; + Object mtd = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-3)).value; + Location ASSIGN1xleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).xleft; + Location ASSIGN1xright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).xright; + Object ASSIGN1 = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-2)).value; + Location idmethxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).xleft; + Location idmethxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).xright; + Object idmeth = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value; + Location SEMICOLON3xleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.peek()).xleft; + Location SEMICOLON3xright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.peek()).xright; + Object SEMICOLON3 = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.peek()).value; + + RESULT = new XMLElement.NonTerminal("cont",1,new XMLElement.Terminal(mtdxleft,"mtd",mtd,mtdxright),new XMLElement.Terminal(idmethxleft,"idmeth",idmeth,idmethxright)); + CUP$Parser$result = parser.getSymbolFactory().newSymbol("cont",9, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-3)), ((java_cup.runtime.Symbol)CUP$Parser$stack.peek()), RESULT); + } + return CUP$Parser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 20: // reqlist ::= reqlist require + { + XMLElement RESULT; + Location rlxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).xleft; + Location rlxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).xright; + Object rl = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value; + Location reqxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.peek()).xleft; + Location reqxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.peek()).xright; + Object req = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.peek()).value; + + RESULT = new XMLElement.NonTerminal("reqlist",0,(XMLElement)rl,(XMLElement)req); + CUP$Parser$result = parser.getSymbolFactory().newSymbol("reqlist",10, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)), ((java_cup.runtime.Symbol)CUP$Parser$stack.peek()), RESULT); + } + return CUP$Parser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 21: // reqlist ::= + { + XMLElement RESULT; + + RESULT = new XMLElement.NonTerminal("reqlist",1); + CUP$Parser$result = parser.getSymbolFactory().newSymbol("reqlist",10, ((java_cup.runtime.Symbol)CUP$Parser$stack.peek()), ((java_cup.runtime.Symbol)CUP$Parser$stack.peek()), RESULT); + } + return CUP$Parser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 22: // require ::= REQUIRES IDENT WITH capintlist AS INTERFACE IDENT SEMICOLON + { + XMLElement RESULT; + Location REQUIRES0xleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-7)).xleft; + Location REQUIRES0xright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-7)).xright; + Object REQUIRES0 = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-7)).value; + Location idintxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-6)).xleft; + Location idintxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-6)).xright; + Object idint = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-6)).value; + Location WITH2xleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-5)).xleft; + Location WITH2xright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-5)).xright; + Object WITH2 = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-5)).value; + Location cilxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-4)).xleft; + Location cilxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-4)).xright; + Object cil = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-4)).value; + Location AS4xleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-3)).xleft; + Location AS4xright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-3)).xright; + Object AS4 = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-3)).value; + Location INTERFACE5xleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).xleft; + Location INTERFACE5xright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).xright; + Object INTERFACE5 = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-2)).value; + Location idnewintxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).xleft; + Location idnewintxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).xright; + Object idnewint = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value; + Location SEMICOLON7xleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.peek()).xleft; + Location SEMICOLON7xright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.peek()).xright; + Object SEMICOLON7 = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.peek()).value; + + RESULT = new XMLElement.NonTerminal("require",0,new XMLElement.Terminal(idintxleft,"idint",idint,idintxright),(XMLElement)cil,new XMLElement.Terminal(idnewintxleft,"idnewint",idnewint,idnewintxright)); + CUP$Parser$result = parser.getSymbolFactory().newSymbol("require",11, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-7)), ((java_cup.runtime.Symbol)CUP$Parser$stack.peek()), RESULT); + } + return CUP$Parser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 23: // capintlist ::= IDENT + { + XMLElement RESULT; + Location idcapxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.peek()).xleft; + Location idcapxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.peek()).xright; + Object idcap = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.peek()).value; + + RESULT = new XMLElement.NonTerminal("capintlist",0,new XMLElement.Terminal(idcapxleft,"idcap",idcap,idcapxright)); + CUP$Parser$result = parser.getSymbolFactory().newSymbol("capintlist",12, ((java_cup.runtime.Symbol)CUP$Parser$stack.peek()), ((java_cup.runtime.Symbol)CUP$Parser$stack.peek()), RESULT); + } + return CUP$Parser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 24: // capintlist ::= capintlist COMMA IDENT + { + XMLElement RESULT; + Location cilxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).xleft; + Location cilxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).xright; + Object cil = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-2)).value; + Location COMMA1xleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).xleft; + Location COMMA1xright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).xright; + Object COMMA1 = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value; + Location idcapxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.peek()).xleft; + Location idcapxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$Parser$stack.peek()).xright; + Object idcap = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.peek()).value; + + RESULT = new XMLElement.NonTerminal("capintlist",1,(XMLElement)cil,new XMLElement.Terminal(idcapxleft,"idcap",idcap,idcapxright)); + CUP$Parser$result = parser.getSymbolFactory().newSymbol("capintlist",12, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)), ((java_cup.runtime.Symbol)CUP$Parser$stack.peek()), RESULT); + } + return CUP$Parser$result; + + /*. . . . . . . . . . . . . . . . . . . .*/ + case 25: // capintlist ::= + { + XMLElement RESULT; + + RESULT = new XMLElement.NonTerminal("capintlist",2); + CUP$Parser$result = parser.getSymbolFactory().newSymbol("capintlist",12, ((java_cup.runtime.Symbol)CUP$Parser$stack.peek()), ((java_cup.runtime.Symbol)CUP$Parser$stack.peek()), RESULT); + } + return CUP$Parser$result; + + /* . . . . . .*/ + default: + throw new Exception( + "Invalid action number "+CUP$Parser$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$Parser$do_action( + int CUP$Parser$act_num, + java_cup.runtime.lr_parser CUP$Parser$parser, + java.util.Stack CUP$Parser$stack, + int CUP$Parser$top) + throws java.lang.Exception + { + return CUP$Parser$do_action_part00000000( + CUP$Parser$act_num, + CUP$Parser$parser, + CUP$Parser$stack, + CUP$Parser$top); + } +} + +} diff --git a/iotjava/iotparser/sym.java b/iotjava/iotparser/sym.java new file mode 100644 index 0000000..d34e748 --- /dev/null +++ b/iotjava/iotparser/sym.java @@ -0,0 +1,55 @@ +package iotparser; + +//---------------------------------------------------- +// The following code was generated by CUP v0.11b 20160615 (GIT 4ac7450) +//---------------------------------------------------- + +/** CUP generated interface containing symbol constants. */ +public interface sym { + /* terminals */ + public static final int IDENT = 19; + public static final int SEMICOLON = 2; + public static final int STRINGCONST = 20; + public static final int REQUIRES = 15; + public static final int END = 8; + public static final int CAPABILITY = 12; + public static final int AS = 17; + public static final int WITH = 16; + public static final int PUBLIC = 10; + public static final int BEGIN = 7; + public static final int TYPE = 18; + public static final int DESCRIPTION = 13; + public static final int COMMA = 3; + public static final int EOF = 0; + public static final int METHOD = 14; + public static final int error = 1; + public static final int DOT = 4; + public static final int INTERFACE = 11; + public static final int ASSIGN = 9; + public static final int RPAR = 6; + public static final int LPAR = 5; + public static final String[] terminalNames = new String[] { + "EOF", + "error", + "SEMICOLON", + "COMMA", + "DOT", + "LPAR", + "RPAR", + "BEGIN", + "END", + "ASSIGN", + "PUBLIC", + "INTERFACE", + "CAPABILITY", + "DESCRIPTION", + "METHOD", + "REQUIRES", + "WITH", + "AS", + "TYPE", + "IDENT", + "STRINGCONST" + }; +} + diff --git a/jars/java-cup-bin-11b-20160615/java-cup-11b-runtime.jar b/jars/java-cup-bin-11b-20160615/java-cup-11b-runtime.jar new file mode 100644 index 0000000000000000000000000000000000000000..6f02157dbb3c456fffaa67fb08d621acf52b2a36 GIT binary patch literal 30960 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�bT&Ok>L08*t!JKCn38FV@78Wk#LI6tAprwRut^ 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 z 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 literal 0 HcmV?d00001 diff --git a/others/javacup/README b/others/javacup/README new file mode 100644 index 0000000..0ff3129 --- /dev/null +++ b/others/javacup/README @@ -0,0 +1,8 @@ +Compiling JavaCUP source code into a parser java file: + +1) Read the manual to get the JavaCUP up and running on our system here: http://www2.cs.tum.edu/projects/cup/ +2) Download the JavaCUP library +3) Compile the JavaCUP (.cup) file using this command: + + java -jar /java-cup-xxb.jar -interface -parser Parser [-xmlactions] iotparser.cup +4) A file, Parser.java, will be generated and it can be compiled with the Lexer.java from Jflex diff --git a/others/javacup/iotparser.cup b/others/javacup/iotparser.cup new file mode 100644 index 0000000..ca44aae --- /dev/null +++ b/others/javacup/iotparser.cup @@ -0,0 +1,100 @@ +/* Minijava Grammar */ +import java_cup.runtime.ComplexSymbolFactory; +import java_cup.runtime.ScannerBuffer; +import java_cup.runtime.XMLElement; +import javax.xml.stream.XMLOutputFactory; +import javax.xml.stream.XMLStreamWriter; +import java.io.*; + +import javax.xml.transform.*; +import javax.xml.transform.stream.*; +parser code {: + public Parser(Lexer lex, ComplexSymbolFactory sf) { + super(lex,sf); + } + public static void main(String[] args) throws Exception { + // initialize the symbol factory + ComplexSymbolFactory csf = new ComplexSymbolFactory(); + // create a buffering scanner wrapper + ScannerBuffer lexer = new ScannerBuffer(new Lexer(new BufferedReader(new FileReader(args[0])),csf)); + // start parsing + Parser p = new Parser(lexer,csf); + XMLElement e = (XMLElement)p.parse().value; + // create XML output file + XMLOutputFactory outFactory = XMLOutputFactory.newInstance(); + XMLStreamWriter sw = outFactory.createXMLStreamWriter(new FileOutputStream(args[1]), "UTF-8"); + // dump XML output to the file + XMLElement.dump(lexer,sw,e,"expr","stmt"); + + // transform the parse tree into an AST and a rendered HTML version + Transformer transformer = TransformerFactory.newInstance() + .newTransformer(new StreamSource(new File("tree.xsl"))); + Source text = new StreamSource(new File(args[1])); + transformer.transform(text, new StreamResult(new File("output.xml"))); + transformer = TransformerFactory.newInstance() + .newTransformer(new StreamSource(new File("tree-view.xsl"))); + text = new StreamSource(new File("output.xml")); + transformer.transform(text, new StreamResult(new File("ast.html"))); + } +:}; + +terminal SEMICOLON, COMMA, DOT, LPAR, RPAR, BEGIN, END, ASSIGN; +terminal PUBLIC, INTERFACE, CAPABILITY, DESCRIPTION, METHOD, REQUIRES, WITH, AS; +terminal TYPE; +terminal IDENT, STRINGCONST; + +non terminal policy, intface, methlist, meth, paramlist, param; +non terminal capablist, capab, capabcont, cont; +non terminal reqlist, require, capintlist; + +/** + * A policy file normally consists of 3 parts: + * 1) Interface (in Java syntax) + * 2) List of capabilities and their contents + * 3) List of interface generation definitions + */ +policy ::= intface:in capablist:cap reqlist:rl + ; + +// Interface class definition +intface ::= PUBLIC INTERFACE IDENT:idint BEGIN methlist:ml END + | /* empty */ + ; +methlist ::= methlist:ml meth:m + | /* empty */ + ; +meth ::= PUBLIC TYPE:typemeth IDENT:idmeth LPAR paramlist:pl RPAR SEMICOLON + ; +paramlist ::= paramlist:pl param:p + | /* empty */ + ; +param ::= TYPE:typeprm IDENT:idprm COMMA + | TYPE:typeprm IDENT:idprm + | IDENT:clsprm IDENT:idprm COMMA + | IDENT:clsprm IDENT:idprm + ; + +// List of capabilities and their respective contents, i.e. description, method, etc. +capablist ::= capablist:clist capab:cap + | /* empty */ + ; +capab ::= CAPABILITY IDENT:idint DOT IDENT:idcap BEGIN capabcont:ccont END + ; +capabcont ::= capabcont:ccont cont:cnt + | /* empty */ + ; +cont ::= DESCRIPTION:dsc ASSIGN STRINGCONST SEMICOLON + | METHOD:mtd ASSIGN IDENT:idmeth SEMICOLON + ; + +// List of interface generation definitions +reqlist ::= reqlist:rl require:req + | /* empty */ + ; +require ::= REQUIRES IDENT:idint WITH capintlist:cil AS INTERFACE IDENT:idnewint SEMICOLON + ; +capintlist ::= IDENT:idcap + | capintlist:cil COMMA IDENT:idcap + | /* empty */ + ; + diff --git a/others/jflex/README b/others/jflex/README new file mode 100644 index 0000000..af42080 --- /dev/null +++ b/others/jflex/README @@ -0,0 +1,8 @@ +Compiling Jflex source code into a lexer java file: + +1) Read the manual to install Jflex on our system here: http://jflex.de/manual.html +2) Don't forget to compile the JavaCUP (.cup) file first if we want to connect the Jflex lexer with a JavaCUP parser +3) Compile the Jflex (.jflex) file using this command: + + jflex .jflex +4) A file, Lexer.java, will be generated and it can be compiled together with the Parser.java and sym.java from JavaCUP diff --git a/others/jflex/iotparser.jflex b/others/jflex/iotparser.jflex new file mode 100644 index 0000000..bad298e --- /dev/null +++ b/others/jflex/iotparser.jflex @@ -0,0 +1,131 @@ +// JFlex parser specification written by +// Rahmadi Trimananda +// for Sentinel system +// University of California, Irvine + +// Technische Universitaet Muenchen +// Fakultaet fuer Informatik + +import java_cup.runtime.Symbol; +import java_cup.runtime.ComplexSymbolFactory; +import java_cup.runtime.ComplexSymbolFactory.Location; + +%% + +%public +%class Lexer +%cup +%implements sym +%char +%line +%column + +%{ + StringBuffer string = new StringBuffer(); + public Lexer(java.io.Reader in, ComplexSymbolFactory sf){ + this(in); + symbolFactory = sf; + } + ComplexSymbolFactory symbolFactory; + + private Symbol symbol(String name, int sym) { + return symbolFactory.newSymbol(name, sym, new Location(yyline+1,yycolumn+1,yychar), new Location(yyline+1,yycolumn+yylength(),yychar+yylength())); + } + + private Symbol symbol(String name, int sym, Object val) { + Location left = new Location(yyline+1,yycolumn+1,yychar); + Location right= new Location(yyline+1,yycolumn+yylength(), yychar+yylength()); + return symbolFactory.newSymbol(name, sym, left, right,val); + } + private Symbol symbol(String name, int sym, Object val,int buflength) { + Location left = new Location(yyline+1,yycolumn+yylength()-buflength,yychar+yylength()-buflength); + Location right= new Location(yyline+1,yycolumn+yylength(), yychar+yylength()); + return symbolFactory.newSymbol(name, sym, left, right,val); + } + private void error(String message) { + System.out.println("Error at line "+(yyline+1)+", column "+(yycolumn+1)+" : "+message); + } +%} + +%eofval{ + return symbolFactory.newSymbol("EOF", EOF, new Location(yyline+1,yycolumn+1,yychar), new Location(yyline+1,yycolumn+1,yychar+1)); +%eofval} + + +Ident = [a-zA-Z$_] [a-zA-Z0-9$_]* + +new_line = \r|\n|\r\n; + +white_space = {new_line} | [ \t\f] + +%state STRING + +%% + +{ +/* keywords */ +"int" { return symbol("int",TYPE, "INT" ); } +"short" { return symbol("short",TYPE, "SHORT" ); } +"byte" { return symbol("byte",TYPE, "BYTE" ); } +"long" { return symbol("long",TYPE, "LONG" ); } +"float" { return symbol("float",TYPE, "FLOAT" ); } +"double" { return symbol("double",TYPE, "DOUBLE" ); } +"char" { return symbol("char",TYPE, "CHAR" ); } +"string" { return symbol("string",TYPE, "STRING" ); } +"boolean" { return symbol("boolean",TYPE, "BOOL" ); } +"void" { return symbol("void",TYPE, "VOID" ); } +"public" { return symbol("public",PUBLIC); } +"interface" { return symbol("interface",INTERFACE); } +"capability" { return symbol("capability",CAPABILITY); } +"description" { return symbol("description",DESCRIPTION); } +"method" { return symbol("method",METHOD); } +"requires" { return symbol("requires",REQUIRES); } +"with" { return symbol("with",WITH); } +"as" { return symbol("as",AS); } + +/* names */ +{Ident} { return symbol("Identifier",IDENT, yytext()); } + + +/* string literals */ + +/* char literal */ + +/* bool literal */ + +/* literals */ + + + +/* separators */ + \" { string.setLength(0); yybegin(STRING); } +";" { return symbol("semicolon",SEMICOLON); } +"," { return symbol("comma",COMMA); } +"." { return symbol("dot",DOT); } +"(" { return symbol("(",LPAR); } +")" { return symbol(")",RPAR); } +"{" { return symbol("{",BEGIN); } +"}" { return symbol("}",END); } +"=" { return symbol("=",ASSIGN); } + +{white_space} { /* ignore */ } + +} + + { + \" { yybegin(YYINITIAL); + return symbol("StringConst",STRINGCONST,string.toString(),string.length()); } + [^\n\r\"\\]+ { string.append( yytext() ); } + \\t { string.append('\t'); } + \\n { string.append('\n'); } + + \\r { string.append('\r'); } + \\\" { string.append('\"'); } + \\ { string.append('\\'); } +} + + +/* error fallback */ +.|\n { /* throw new Error("Illegal character <"+ yytext()+">");*/ + error("Illegal character <"+ yytext()+">"); + } -- 2.34.1