[09 - LL(I) AST] Re-init project as project with modules
This commit is contained in:
17
.gitignore
vendored
17
.gitignore
vendored
@@ -1,2 +1,19 @@
|
||||
# IntelliJ folders
|
||||
**/.idea/
|
||||
|
||||
# IntelliJ files
|
||||
**/*.iml
|
||||
|
||||
# Java Compiler output
|
||||
**/bin/
|
||||
|
||||
# Eclipse files
|
||||
**/.classpath
|
||||
**/.project
|
||||
|
||||
# Eclipse folders
|
||||
**/.externalToolBuilders/
|
||||
**/.settings/
|
||||
|
||||
# macOS files
|
||||
.DS_Store
|
||||
|
||||
BIN
ÜB-Praxis-LL1-Parser für X-Leer/lib/jflex-1.6.1.jar
Normal file
BIN
ÜB-Praxis-LL1-Parser für X-Leer/lib/jflex-1.6.1.jar
Normal file
Binary file not shown.
13
ÜB-Praxis-LL1-Parser für X-Leer/lib/jflexant.xml
Normal file
13
ÜB-Praxis-LL1-Parser für X-Leer/lib/jflexant.xml
Normal file
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project name="JFlex" default="scanner" basedir=".">
|
||||
<description>
|
||||
Generate Scanner from lex-files
|
||||
</description>
|
||||
|
||||
<taskdef classname="jflex.anttask.JFlexTask" name="jflex" classpath="lib/jflex-1.6.1.jar"/>
|
||||
|
||||
<target name="scanner">
|
||||
<jflex file="src/de/dhbw/compiler/XParser/JFlexXScanner.lex" />
|
||||
</target>
|
||||
|
||||
</project>
|
||||
@@ -0,0 +1,28 @@
|
||||
/* **********************************************
|
||||
* Duale Hochschule Baden-Württemberg Karlsruhe
|
||||
* Prof. Dr. Jörn Eisenbiegler
|
||||
*
|
||||
* Vorlesung Übersetzerbau
|
||||
* Praxis LL(1)-Parser für X
|
||||
* - Token-Definition floatConst
|
||||
*
|
||||
* **********************************************
|
||||
*/
|
||||
|
||||
package de.dhbw.compiler.xparser;
|
||||
|
||||
public class FloatConstToken extends Token {
|
||||
|
||||
private double value=0.0;
|
||||
|
||||
public FloatConstToken(int type, String text, int line, int column, double value) {
|
||||
super(type,text,line,column);
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public double getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
/* **********************************************
|
||||
* Duale Hochschule Baden-Württemberg Karlsruhe
|
||||
* Prof. Dr. Jörn Eisenbiegler
|
||||
*
|
||||
* Vorlesung Übersetzerbau
|
||||
* Praxis LL(1)-Parser für X
|
||||
* - Token-Definition intConst
|
||||
*
|
||||
* **********************************************
|
||||
*/
|
||||
|
||||
package de.dhbw.compiler.xparser;
|
||||
|
||||
public class IntConstToken extends Token {
|
||||
|
||||
private int value=0;
|
||||
|
||||
public IntConstToken(int type, String text, int line, int column, int value) {
|
||||
super(type,text,line,column);
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public int getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,991 @@
|
||||
/* The following code was generated by JFlex 1.6.1 */
|
||||
|
||||
/* **********************************************
|
||||
* Duale Hochschule Baden-Württemberg Karlsruhe
|
||||
* Prof. Dr. Jörn Eisenbiegler
|
||||
*
|
||||
* Vorlesung Übersetzerbau
|
||||
* Praxis X Abstiegsparser
|
||||
* - Scanner-Definition
|
||||
*
|
||||
* **********************************************
|
||||
*/
|
||||
|
||||
|
||||
package de.dhbw.compiler.xparser;
|
||||
|
||||
|
||||
/**
|
||||
* This class is a scanner generated by
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.6.1
|
||||
* from the specification file <tt>C:/Users/eisenbiegler/Dropbox/workspace_<65>b/<2F>B-Praxis-LL1-Parser für X-Leer/src/de/dhbw/compiler/XParser/JFlexXScanner.lex</tt>
|
||||
*/
|
||||
public final class JFlexXScanner {
|
||||
|
||||
/** 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 INT = 2;
|
||||
public static final int FRACTION = 4;
|
||||
public static final int EXPVZ = 6;
|
||||
public static final int EXP = 8;
|
||||
public static final int STRING = 10;
|
||||
|
||||
/**
|
||||
* ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l
|
||||
* ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l
|
||||
* at the beginning of a line
|
||||
* l is of the form l = 2*k, k a non negative integer
|
||||
*/
|
||||
private static final int ZZ_LEXSTATE[] = {
|
||||
0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5
|
||||
};
|
||||
|
||||
/**
|
||||
* Translates characters to character classes
|
||||
*/
|
||||
private static final String ZZ_CMAP_PACKED =
|
||||
"\10\0\3\42\1\0\2\42\22\0\1\43\1\0\1\41\5\0\1\24"+
|
||||
"\1\25\1\20\1\16\1\0\1\17\1\35\1\21\1\40\11\37\1\22"+
|
||||
"\1\32\1\26\1\23\1\27\2\0\4\36\1\45\25\36\1\0\1\44"+
|
||||
"\4\0\1\3\1\33\1\36\1\4\1\2\1\11\1\15\1\30\1\6"+
|
||||
"\2\36\1\12\1\34\1\7\1\13\1\5\1\36\1\1\1\14\1\10"+
|
||||
"\2\36\1\31\3\36\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\uff95\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 =
|
||||
"\6\0\1\1\10\2\1\3\1\4\1\5\1\6\1\7"+
|
||||
"\1\10\1\11\1\12\1\13\1\14\1\2\1\15\1\2"+
|
||||
"\1\16\1\17\1\20\1\21\1\22\2\23\1\24\1\25"+
|
||||
"\2\26\1\27\2\30\1\31\1\32\1\33\1\34\1\35"+
|
||||
"\1\36\1\37\1\35\5\2\1\40\4\2\1\0\1\41"+
|
||||
"\2\2\1\42\1\0\1\43\1\0\1\44\1\45\1\46"+
|
||||
"\1\2\1\47\3\2\1\50\2\2\1\51\1\2\1\0"+
|
||||
"\2\2\1\52\1\53\2\2\1\54\2\2\1\55\2\2"+
|
||||
"\1\56\1\2\1\57\1\2\1\60\1\61\1\2\1\62"+
|
||||
"\1\63";
|
||||
|
||||
private static int [] zzUnpackAction() {
|
||||
int [] result = new int[103];
|
||||
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\46\0\114\0\162\0\230\0\276\0\344\0\u010a"+
|
||||
"\0\u0130\0\u0156\0\u017c\0\u01a2\0\u01c8\0\u01ee\0\u0214\0\344"+
|
||||
"\0\344\0\344\0\u023a\0\u0260\0\344\0\344\0\344\0\344"+
|
||||
"\0\344\0\u0286\0\344\0\u02ac\0\344\0\344\0\u02d2\0\344"+
|
||||
"\0\u02f8\0\344\0\u031e\0\344\0\344\0\344\0\u0344\0\344"+
|
||||
"\0\344\0\u036a\0\344\0\344\0\344\0\344\0\344\0\344"+
|
||||
"\0\344\0\u0390\0\u03b6\0\u03dc\0\u0402\0\u0428\0\u044e\0\u0156"+
|
||||
"\0\u0474\0\u049a\0\u04c0\0\u04e6\0\u050c\0\344\0\u0532\0\u0558"+
|
||||
"\0\344\0\u057e\0\344\0\u05a4\0\344\0\344\0\344\0\u05ca"+
|
||||
"\0\u0156\0\u05f0\0\u0616\0\u063c\0\u0156\0\u0662\0\u0688\0\u0156"+
|
||||
"\0\u06ae\0\u06d4\0\u06fa\0\u0720\0\u0156\0\u0156\0\u0746\0\u076c"+
|
||||
"\0\u0156\0\u0792\0\u07b8\0\344\0\u07de\0\u0804\0\u0156\0\u082a"+
|
||||
"\0\u0156\0\u0850\0\u0156\0\u0156\0\u0876\0\u0156\0\u0156";
|
||||
|
||||
private static int [] zzUnpackRowMap() {
|
||||
int [] result = new int[103];
|
||||
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\7\1\10\1\11\2\12\1\13\1\14\1\12\1\15"+
|
||||
"\1\16\2\12\1\17\1\12\1\20\1\21\1\22\1\23"+
|
||||
"\1\24\1\25\1\26\1\27\1\30\1\31\1\12\1\32"+
|
||||
"\1\33\1\34\1\12\1\35\1\12\1\36\1\37\1\40"+
|
||||
"\2\41\1\7\1\12\2\42\1\43\32\42\1\44\1\42"+
|
||||
"\2\45\4\42\1\43\2\46\1\47\34\46\2\50\4\46"+
|
||||
"\1\47\17\51\1\52\17\51\1\53\1\54\5\51\37\55"+
|
||||
"\2\56\5\55\1\57\15\60\4\57\1\60\5\57\2\60"+
|
||||
"\1\57\4\60\2\57\1\61\1\57\1\60\1\62\1\60"+
|
||||
"\47\0\1\12\1\63\13\12\12\0\2\12\1\0\2\12"+
|
||||
"\1\0\3\12\4\0\1\12\1\0\6\12\1\64\2\12"+
|
||||
"\1\65\3\12\12\0\2\12\1\0\2\12\1\0\3\12"+
|
||||
"\4\0\1\12\1\0\15\12\12\0\2\12\1\0\2\12"+
|
||||
"\1\0\3\12\4\0\1\12\1\0\1\66\14\12\12\0"+
|
||||
"\2\12\1\0\2\12\1\0\3\12\4\0\1\12\1\0"+
|
||||
"\6\12\1\67\1\12\1\70\4\12\12\0\2\12\1\0"+
|
||||
"\2\12\1\0\3\12\4\0\1\12\1\0\15\12\12\0"+
|
||||
"\1\71\1\12\1\0\2\12\1\0\3\12\4\0\1\12"+
|
||||
"\1\0\11\12\1\72\1\73\2\12\12\0\2\12\1\0"+
|
||||
"\2\12\1\0\3\12\4\0\1\12\1\0\7\12\1\74"+
|
||||
"\5\12\12\0\2\12\1\0\2\12\1\0\3\12\4\0"+
|
||||
"\1\12\20\0\1\75\50\0\1\76\23\0\15\12\12\0"+
|
||||
"\1\77\1\12\1\0\2\12\1\0\3\12\4\0\1\12"+
|
||||
"\1\0\1\12\1\100\13\12\12\0\2\12\1\0\2\12"+
|
||||
"\1\0\3\12\4\0\1\12\35\0\1\101\52\0\2\41"+
|
||||
"\21\0\1\102\17\0\2\103\24\0\1\104\17\0\2\105"+
|
||||
"\44\0\1\106\1\54\46\0\1\107\5\0\2\12\1\110"+
|
||||
"\12\12\12\0\2\12\1\0\2\12\1\0\3\12\4\0"+
|
||||
"\1\12\1\0\3\12\1\111\11\12\12\0\2\12\1\0"+
|
||||
"\2\12\1\0\3\12\4\0\1\12\1\0\13\12\1\112"+
|
||||
"\1\12\12\0\2\12\1\0\2\12\1\0\3\12\4\0"+
|
||||
"\1\12\1\0\5\12\1\113\4\12\1\114\2\12\12\0"+
|
||||
"\2\12\1\0\2\12\1\0\3\12\4\0\1\12\1\0"+
|
||||
"\7\12\1\115\5\12\12\0\2\12\1\0\2\12\1\0"+
|
||||
"\3\12\4\0\1\12\1\0\1\12\1\116\13\12\12\0"+
|
||||
"\2\12\1\0\2\12\1\0\3\12\4\0\1\12\1\0"+
|
||||
"\12\12\1\117\2\12\12\0\2\12\1\0\2\12\1\0"+
|
||||
"\3\12\4\0\1\12\1\0\1\120\14\12\12\0\2\12"+
|
||||
"\1\0\2\12\1\0\3\12\4\0\1\12\1\0\1\121"+
|
||||
"\14\12\12\0\2\12\1\0\2\12\1\0\3\12\4\0"+
|
||||
"\1\12\20\75\1\122\25\75\1\0\5\12\1\123\7\12"+
|
||||
"\12\0\2\12\1\0\2\12\1\0\3\12\4\0\1\12"+
|
||||
"\1\0\14\12\1\124\12\0\2\12\1\0\2\12\1\0"+
|
||||
"\3\12\4\0\1\12\37\0\2\103\44\0\2\105\6\0"+
|
||||
"\3\12\1\125\11\12\12\0\2\12\1\0\2\12\1\0"+
|
||||
"\3\12\4\0\1\12\1\0\1\12\1\126\13\12\12\0"+
|
||||
"\2\12\1\0\2\12\1\0\3\12\4\0\1\12\1\0"+
|
||||
"\6\12\1\127\6\12\12\0\2\12\1\0\2\12\1\0"+
|
||||
"\3\12\4\0\1\12\1\0\14\12\1\130\12\0\2\12"+
|
||||
"\1\0\2\12\1\0\3\12\4\0\1\12\1\0\6\12"+
|
||||
"\1\131\6\12\12\0\2\12\1\0\2\12\1\0\3\12"+
|
||||
"\4\0\1\12\1\0\2\12\1\132\12\12\12\0\2\12"+
|
||||
"\1\0\2\12\1\0\3\12\4\0\1\12\1\0\5\12"+
|
||||
"\1\133\7\12\12\0\2\12\1\0\2\12\1\0\3\12"+
|
||||
"\4\0\1\12\20\75\1\122\1\134\24\75\1\0\11\12"+
|
||||
"\1\135\3\12\12\0\2\12\1\0\2\12\1\0\3\12"+
|
||||
"\4\0\1\12\1\0\5\12\1\136\7\12\12\0\2\12"+
|
||||
"\1\0\2\12\1\0\3\12\4\0\1\12\1\0\7\12"+
|
||||
"\1\137\5\12\12\0\2\12\1\0\2\12\1\0\3\12"+
|
||||
"\4\0\1\12\1\0\1\140\14\12\12\0\2\12\1\0"+
|
||||
"\2\12\1\0\3\12\4\0\1\12\1\0\7\12\1\141"+
|
||||
"\5\12\12\0\2\12\1\0\2\12\1\0\3\12\4\0"+
|
||||
"\1\12\1\0\6\12\1\142\6\12\12\0\2\12\1\0"+
|
||||
"\2\12\1\0\3\12\4\0\1\12\1\0\1\12\1\143"+
|
||||
"\13\12\12\0\2\12\1\0\2\12\1\0\3\12\4\0"+
|
||||
"\1\12\1\0\6\12\1\144\6\12\12\0\2\12\1\0"+
|
||||
"\2\12\1\0\3\12\4\0\1\12\1\0\2\12\1\145"+
|
||||
"\12\12\12\0\2\12\1\0\2\12\1\0\3\12\4\0"+
|
||||
"\1\12\1\0\14\12\1\146\12\0\2\12\1\0\2\12"+
|
||||
"\1\0\3\12\4\0\1\12\1\0\15\12\12\0\2\12"+
|
||||
"\1\0\1\12\1\147\1\0\3\12\4\0\1\12";
|
||||
|
||||
private static int [] zzUnpackTrans() {
|
||||
int [] result = new int[2204];
|
||||
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 <code>aState</code>
|
||||
*/
|
||||
private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
|
||||
|
||||
private static final String ZZ_ATTRIBUTE_PACKED_0 =
|
||||
"\6\0\1\11\10\1\3\11\2\1\5\11\1\1\1\11"+
|
||||
"\1\1\2\11\1\1\1\11\1\1\1\11\1\1\3\11"+
|
||||
"\1\1\2\11\1\1\7\11\13\1\1\0\1\11\2\1"+
|
||||
"\1\11\1\0\1\11\1\0\3\11\12\1\1\0\11\1"+
|
||||
"\1\11\13\1";
|
||||
|
||||
private static int [] zzUnpackAttribute() {
|
||||
int [] result = new int[103];
|
||||
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: */
|
||||
private int intvalue=0;
|
||||
private String textvalue ="";
|
||||
private int fracvalue=0;
|
||||
private int fraclength=0;
|
||||
private int expvalue=0;
|
||||
private int expsign=1;
|
||||
private int startline =0;
|
||||
private int startcolumn =0;
|
||||
private String stringvalue="";
|
||||
|
||||
|
||||
/**
|
||||
* Creates a new scanner
|
||||
*
|
||||
* @param in the java.io.Reader to read input from.
|
||||
*/
|
||||
public JFlexXScanner(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 < 140) {
|
||||
int count = packed.charAt(i++);
|
||||
char value = packed.charAt(i++);
|
||||
do map[j++] = value; while (--count > 0);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>false</code>, iff there was new input.
|
||||
*
|
||||
* @exception java.io.IOException if any I/O-Error occurs
|
||||
*/
|
||||
private boolean zzRefill() throws java.io.IOException {
|
||||
|
||||
/* first: make room (if you can) */
|
||||
if (zzStartRead > 0) {
|
||||
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
|
||||
* <b>cannot</b> be reused (internal buffer is discarded and lost).
|
||||
* Lexical state is set to <tt>ZZ_INITIAL</tt>.
|
||||
*
|
||||
* 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 <tt>pos</tt> 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;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 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 Token nextToken() 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;
|
||||
|
||||
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;
|
||||
switch (zzLexicalState) {
|
||||
case INT: {
|
||||
yybegin(YYINITIAL);
|
||||
yypushback(1);
|
||||
return new IntConstToken(Token.INTCONST, textvalue, startline, startcolumn, intvalue);
|
||||
}
|
||||
case 104: break;
|
||||
case FRACTION: {
|
||||
yybegin(YYINITIAL);
|
||||
yypushback(1);
|
||||
return new FloatConstToken(Token.FLOATCONST, textvalue, startline, startcolumn,intvalue+fracvalue/Math.pow(10,fraclength));
|
||||
}
|
||||
case 105: break;
|
||||
case EXPVZ: {
|
||||
yybegin(YYINITIAL);
|
||||
yypushback(1);
|
||||
return new Token(Token.INVALID, textvalue, startline, startcolumn);
|
||||
}
|
||||
case 106: break;
|
||||
case EXP: {
|
||||
yybegin(YYINITIAL);
|
||||
yypushback(1);
|
||||
return new FloatConstToken(Token.FLOATCONST, textvalue, startline, startcolumn, (intvalue+fracvalue/Math.pow(10,fraclength))*Math.pow(10,expvalue*expsign));
|
||||
}
|
||||
case 107: break;
|
||||
case STRING: {
|
||||
yybegin(YYINITIAL); return new Token(Token.INVALID, textvalue, startline, startcolumn);
|
||||
}
|
||||
case 108: break;
|
||||
default:
|
||||
{
|
||||
return new Token(Token.EOF, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
|
||||
case 1:
|
||||
{ return new Token(Token.INVALID, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 52: break;
|
||||
case 2:
|
||||
{ return new Token(Token.ID, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 53: break;
|
||||
case 3:
|
||||
{ return new Token(Token.PLUS, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 54: break;
|
||||
case 4:
|
||||
{ return new Token(Token.MINUS, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 55: break;
|
||||
case 5:
|
||||
{ return new Token(Token.MULT, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 56: break;
|
||||
case 6:
|
||||
{ return new Token(Token.DIV, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 57: break;
|
||||
case 7:
|
||||
{ return new Token(Token.COLON, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 58: break;
|
||||
case 8:
|
||||
{ return new Token(Token.EQUALS, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 59: break;
|
||||
case 9:
|
||||
{ return new Token(Token.LBR, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 60: break;
|
||||
case 10:
|
||||
{ return new Token(Token.RBR, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 61: break;
|
||||
case 11:
|
||||
{ return new Token(Token.LESS, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 62: break;
|
||||
case 12:
|
||||
{ return new Token(Token.MORE, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 63: break;
|
||||
case 13:
|
||||
{ return new Token(Token.SEMICOLON, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 64: break;
|
||||
case 14:
|
||||
{ return new Token(Token.DOT, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 65: break;
|
||||
case 15:
|
||||
{ yybegin(INT); textvalue=yytext(); startline=yyline+1; startcolumn=yycolumn+1;
|
||||
intvalue=yytext().charAt(0)-'0'; fracvalue=0; fraclength=0; expvalue=0;
|
||||
}
|
||||
case 66: break;
|
||||
case 16:
|
||||
{ return new IntConstToken(Token.INTCONST, yytext(), yyline+1, yycolumn+1, 0);
|
||||
}
|
||||
case 67: break;
|
||||
case 17:
|
||||
{ yybegin(STRING); textvalue="\""; stringvalue=""; startline=yyline+1; startcolumn=yycolumn+1;
|
||||
}
|
||||
case 68: break;
|
||||
case 18:
|
||||
{ /* eat whitespace */
|
||||
}
|
||||
case 69: break;
|
||||
case 19:
|
||||
{ yybegin(YYINITIAL);
|
||||
yypushback(1);
|
||||
return new IntConstToken(Token.INTCONST, textvalue, startline, startcolumn, intvalue);
|
||||
}
|
||||
case 70: break;
|
||||
case 20:
|
||||
{ yybegin(FRACTION);
|
||||
textvalue+=yytext();
|
||||
}
|
||||
case 71: break;
|
||||
case 21:
|
||||
{ intvalue = 10*intvalue + yytext().charAt(0)-'0';
|
||||
textvalue+=yytext();
|
||||
}
|
||||
case 72: break;
|
||||
case 22:
|
||||
{ yybegin(YYINITIAL);
|
||||
yypushback(1);
|
||||
return new FloatConstToken(Token.FLOATCONST, textvalue, startline, startcolumn,intvalue+fracvalue/Math.pow(10,fraclength));
|
||||
}
|
||||
case 73: break;
|
||||
case 23:
|
||||
{ fracvalue= 10*fracvalue+ yytext().charAt(0)-'0';
|
||||
fraclength++;
|
||||
textvalue+=yytext();
|
||||
}
|
||||
case 74: break;
|
||||
case 24:
|
||||
{ yybegin(YYINITIAL);
|
||||
yypushback(1);
|
||||
return new Token(Token.INVALID, textvalue, startline, startcolumn);
|
||||
}
|
||||
case 75: break;
|
||||
case 25:
|
||||
{ yybegin(EXP); expvalue=yytext().charAt(0)-'0'; expsign=1; textvalue+=yytext();
|
||||
}
|
||||
case 76: break;
|
||||
case 26:
|
||||
{ yybegin(YYINITIAL);
|
||||
return new FloatConstToken(Token.FLOATCONST, textvalue+yytext(), startline, startcolumn,intvalue+fracvalue/Math.pow(10,fraclength));
|
||||
}
|
||||
case 77: break;
|
||||
case 27:
|
||||
{ yybegin(YYINITIAL);
|
||||
yypushback(1);
|
||||
return new FloatConstToken(Token.FLOATCONST, textvalue, startline, startcolumn, (intvalue+fracvalue/Math.pow(10,fraclength))*Math.pow(10,expvalue*expsign));
|
||||
}
|
||||
case 78: break;
|
||||
case 28:
|
||||
{ expvalue = 10* expvalue + yytext().charAt(0)-'0'; textvalue+=yytext();
|
||||
}
|
||||
case 79: break;
|
||||
case 29:
|
||||
{ yybegin(YYINITIAL); return new Token(Token.INVALID, textvalue+yytext(), startline, startcolumn);
|
||||
}
|
||||
case 80: break;
|
||||
case 30:
|
||||
{ textvalue+=yytext(); stringvalue+=yytext();
|
||||
}
|
||||
case 81: break;
|
||||
case 31:
|
||||
{ yybegin(YYINITIAL); return new StringConstToken(Token.STRINGCONST, textvalue+"\"", startline, startcolumn, stringvalue);
|
||||
}
|
||||
case 82: break;
|
||||
case 32:
|
||||
{ return new Token(Token.IF, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 83: break;
|
||||
case 33:
|
||||
{ return new Token(Token.ASSIGN, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 84: break;
|
||||
case 34:
|
||||
// lookahead expression with fixed base length
|
||||
zzMarkedPos = Character.offsetByCodePoints
|
||||
(zzBufferL, zzStartRead, zzEndRead - zzStartRead, zzStartRead, 1);
|
||||
{ yybegin(INT); textvalue=yytext(); startline=yyline+1; startcolumn=yycolumn+1;
|
||||
intvalue=yytext().charAt(0)-'0'; fracvalue=0; fraclength=0; expvalue=0;
|
||||
}
|
||||
case 85: break;
|
||||
case 35:
|
||||
// lookahead expression with fixed base length
|
||||
zzMarkedPos = Character.offsetByCodePoints
|
||||
(zzBufferL, zzStartRead, zzEndRead - zzStartRead, zzStartRead, 1);
|
||||
{ yybegin(EXPVZ); textvalue += yytext();
|
||||
}
|
||||
case 86: break;
|
||||
case 36:
|
||||
// lookahead expression with fixed base length
|
||||
zzMarkedPos = Character.offsetByCodePoints
|
||||
(zzBufferL, zzStartRead, zzEndRead - zzStartRead, zzStartRead, 1);
|
||||
{ yybegin(EXPVZ);
|
||||
textvalue+=yytext();
|
||||
}
|
||||
case 87: break;
|
||||
case 37:
|
||||
{ yybegin(EXP); expvalue=yytext().charAt(1)-'0'; expsign=-1; textvalue+=yytext();
|
||||
}
|
||||
case 88: break;
|
||||
case 38:
|
||||
{ textvalue+="\\\""; stringvalue+="\"";
|
||||
}
|
||||
case 89: break;
|
||||
case 39:
|
||||
{ return new Token(Token.END, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 90: break;
|
||||
case 40:
|
||||
{ return new Token(Token.INT, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 91: break;
|
||||
case 41:
|
||||
{ return new Token(Token.FOR, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 92: break;
|
||||
case 42:
|
||||
{ return new Token(Token.READ, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 93: break;
|
||||
case 43:
|
||||
{ return new Token(Token.ELSE, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 94: break;
|
||||
case 44:
|
||||
{ return new Token(Token.THEN, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 95: break;
|
||||
case 45:
|
||||
{ /* eat comments */
|
||||
}
|
||||
case 96: break;
|
||||
case 46:
|
||||
{ return new Token(Token.PRINT, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 97: break;
|
||||
case 47:
|
||||
{ return new Token(Token.FLOAT, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 98: break;
|
||||
case 48:
|
||||
{ return new Token(Token.WHILE, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 99: break;
|
||||
case 49:
|
||||
{ return new Token(Token.BEGIN, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 100: break;
|
||||
case 50:
|
||||
{ return new Token(Token.STRING, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 101: break;
|
||||
case 51:
|
||||
{ return new Token(Token.PROGRAM, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 102: break;
|
||||
default:
|
||||
zzScanError(ZZ_NO_MATCH);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,985 @@
|
||||
/* The following code was generated by JFlex 1.6.1 */
|
||||
|
||||
/* **********************************************
|
||||
* Duale Hochschule Baden-W<>rttemberg Karlsruhe
|
||||
* Prof. Dr. J<>rn Eisenbiegler
|
||||
*
|
||||
* Vorlesung <20>bersetzerbau
|
||||
* Praxis LL(1)-Parser f<>r X
|
||||
* - Scanner-Definition
|
||||
*
|
||||
* **********************************************
|
||||
*/
|
||||
|
||||
|
||||
package de.dhbw.compiler.xparser;
|
||||
|
||||
|
||||
/**
|
||||
* This class is a scanner generated by
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.6.1
|
||||
* from the specification file <tt>C:/Users/eisenbiegler/Dropbox/workspace_<65>b/<2F>B-Praxis-LL1-Parser f<>r X-Leer/src/de/dhbw/compiler/XParser/JFlexXScanner.lex</tt>
|
||||
*/
|
||||
public final class JFlexXScanner {
|
||||
|
||||
/** 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 INT = 2;
|
||||
public static final int FRACTION = 4;
|
||||
public static final int EXPVZ = 6;
|
||||
public static final int EXP = 8;
|
||||
public static final int STRING = 10;
|
||||
|
||||
/**
|
||||
* ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l
|
||||
* ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l
|
||||
* at the beginning of a line
|
||||
* l is of the form l = 2*k, k a non negative integer
|
||||
*/
|
||||
private static final int ZZ_LEXSTATE[] = {
|
||||
0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5
|
||||
};
|
||||
|
||||
/**
|
||||
* Translates characters to character classes
|
||||
*/
|
||||
private static final String ZZ_CMAP_PACKED =
|
||||
"\10\0\3\42\1\0\2\42\22\0\1\43\1\0\1\41\5\0\1\24"+
|
||||
"\1\25\1\20\1\16\1\0\1\17\1\35\1\21\1\40\11\37\1\22"+
|
||||
"\1\32\1\26\1\23\1\27\2\0\4\36\1\45\25\36\1\0\1\44"+
|
||||
"\4\0\1\3\1\33\1\36\1\4\1\2\1\11\1\15\1\30\1\6"+
|
||||
"\2\36\1\12\1\34\1\7\1\13\1\5\1\36\1\1\1\14\1\10"+
|
||||
"\2\36\1\31\3\36\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\uff95\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 =
|
||||
"\6\0\1\1\10\2\1\3\1\4\1\5\1\6\1\7"+
|
||||
"\1\10\1\11\1\12\1\13\1\14\1\2\1\15\1\2"+
|
||||
"\1\16\1\17\1\20\1\21\1\22\2\23\1\24\1\25"+
|
||||
"\1\26\1\27\1\30\2\31\1\32\1\33\1\34\1\35"+
|
||||
"\1\36\1\37\1\40\1\36\5\2\1\41\4\2\1\0"+
|
||||
"\1\42\2\2\1\43\1\44\1\45\1\46\1\2\1\47"+
|
||||
"\3\2\1\50\2\2\1\51\1\2\1\0\2\2\1\52"+
|
||||
"\1\53\2\2\1\54\2\2\1\55\2\2\1\56\1\2"+
|
||||
"\1\57\1\2\1\60\1\61\1\2\1\62\1\63";
|
||||
|
||||
private static int [] zzUnpackAction() {
|
||||
int [] result = new int[100];
|
||||
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\46\0\114\0\162\0\230\0\276\0\344\0\u010a"+
|
||||
"\0\u0130\0\u0156\0\u017c\0\u01a2\0\u01c8\0\u01ee\0\u0214\0\344"+
|
||||
"\0\344\0\344\0\u023a\0\u0260\0\344\0\344\0\344\0\344"+
|
||||
"\0\344\0\u0286\0\344\0\u02ac\0\344\0\344\0\u02d2\0\344"+
|
||||
"\0\u02f8\0\344\0\u031e\0\344\0\344\0\344\0\344\0\344"+
|
||||
"\0\344\0\u0344\0\344\0\344\0\344\0\344\0\344\0\344"+
|
||||
"\0\344\0\u036a\0\u0390\0\u03b6\0\u03dc\0\u0402\0\u0428\0\u0156"+
|
||||
"\0\u044e\0\u0474\0\u049a\0\u04c0\0\u04e6\0\344\0\u050c\0\u0532"+
|
||||
"\0\344\0\344\0\344\0\344\0\u0558\0\u0156\0\u057e\0\u05a4"+
|
||||
"\0\u05ca\0\u0156\0\u05f0\0\u0616\0\u0156\0\u063c\0\u0662\0\u0688"+
|
||||
"\0\u06ae\0\u0156\0\u0156\0\u06d4\0\u06fa\0\u0156\0\u0720\0\u0746"+
|
||||
"\0\344\0\u076c\0\u0792\0\u0156\0\u07b8\0\u0156\0\u07de\0\u0156"+
|
||||
"\0\u0156\0\u0804\0\u0156\0\u0156";
|
||||
|
||||
private static int [] zzUnpackRowMap() {
|
||||
int [] result = new int[100];
|
||||
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\7\1\10\1\11\2\12\1\13\1\14\1\12\1\15"+
|
||||
"\1\16\2\12\1\17\1\12\1\20\1\21\1\22\1\23"+
|
||||
"\1\24\1\25\1\26\1\27\1\30\1\31\1\12\1\32"+
|
||||
"\1\33\1\34\1\12\1\35\1\12\1\36\1\37\1\40"+
|
||||
"\2\41\1\7\1\12\2\42\1\43\32\42\1\44\1\42"+
|
||||
"\2\45\4\42\1\43\2\46\1\47\34\46\2\50\4\46"+
|
||||
"\1\47\17\51\1\52\17\51\1\53\1\54\5\51\37\55"+
|
||||
"\2\56\5\55\1\57\15\60\4\57\1\60\5\57\2\60"+
|
||||
"\1\57\4\60\2\57\1\61\1\57\1\60\1\62\1\60"+
|
||||
"\47\0\1\12\1\63\13\12\12\0\2\12\1\0\2\12"+
|
||||
"\1\0\3\12\4\0\1\12\1\0\6\12\1\64\2\12"+
|
||||
"\1\65\3\12\12\0\2\12\1\0\2\12\1\0\3\12"+
|
||||
"\4\0\1\12\1\0\15\12\12\0\2\12\1\0\2\12"+
|
||||
"\1\0\3\12\4\0\1\12\1\0\1\66\14\12\12\0"+
|
||||
"\2\12\1\0\2\12\1\0\3\12\4\0\1\12\1\0"+
|
||||
"\6\12\1\67\1\12\1\70\4\12\12\0\2\12\1\0"+
|
||||
"\2\12\1\0\3\12\4\0\1\12\1\0\15\12\12\0"+
|
||||
"\1\71\1\12\1\0\2\12\1\0\3\12\4\0\1\12"+
|
||||
"\1\0\11\12\1\72\1\73\2\12\12\0\2\12\1\0"+
|
||||
"\2\12\1\0\3\12\4\0\1\12\1\0\7\12\1\74"+
|
||||
"\5\12\12\0\2\12\1\0\2\12\1\0\3\12\4\0"+
|
||||
"\1\12\20\0\1\75\50\0\1\76\23\0\15\12\12\0"+
|
||||
"\1\77\1\12\1\0\2\12\1\0\3\12\4\0\1\12"+
|
||||
"\1\0\1\12\1\100\13\12\12\0\2\12\1\0\2\12"+
|
||||
"\1\0\3\12\4\0\1\12\35\0\1\101\52\0\2\41"+
|
||||
"\21\0\1\102\17\0\2\102\44\0\1\103\1\54\46\0"+
|
||||
"\1\104\5\0\2\12\1\105\12\12\12\0\2\12\1\0"+
|
||||
"\2\12\1\0\3\12\4\0\1\12\1\0\3\12\1\106"+
|
||||
"\11\12\12\0\2\12\1\0\2\12\1\0\3\12\4\0"+
|
||||
"\1\12\1\0\13\12\1\107\1\12\12\0\2\12\1\0"+
|
||||
"\2\12\1\0\3\12\4\0\1\12\1\0\5\12\1\110"+
|
||||
"\4\12\1\111\2\12\12\0\2\12\1\0\2\12\1\0"+
|
||||
"\3\12\4\0\1\12\1\0\7\12\1\112\5\12\12\0"+
|
||||
"\2\12\1\0\2\12\1\0\3\12\4\0\1\12\1\0"+
|
||||
"\1\12\1\113\13\12\12\0\2\12\1\0\2\12\1\0"+
|
||||
"\3\12\4\0\1\12\1\0\12\12\1\114\2\12\12\0"+
|
||||
"\2\12\1\0\2\12\1\0\3\12\4\0\1\12\1\0"+
|
||||
"\1\115\14\12\12\0\2\12\1\0\2\12\1\0\3\12"+
|
||||
"\4\0\1\12\1\0\1\116\14\12\12\0\2\12\1\0"+
|
||||
"\2\12\1\0\3\12\4\0\1\12\20\75\1\117\25\75"+
|
||||
"\1\0\5\12\1\120\7\12\12\0\2\12\1\0\2\12"+
|
||||
"\1\0\3\12\4\0\1\12\1\0\14\12\1\121\12\0"+
|
||||
"\2\12\1\0\2\12\1\0\3\12\4\0\1\12\1\0"+
|
||||
"\3\12\1\122\11\12\12\0\2\12\1\0\2\12\1\0"+
|
||||
"\3\12\4\0\1\12\1\0\1\12\1\123\13\12\12\0"+
|
||||
"\2\12\1\0\2\12\1\0\3\12\4\0\1\12\1\0"+
|
||||
"\6\12\1\124\6\12\12\0\2\12\1\0\2\12\1\0"+
|
||||
"\3\12\4\0\1\12\1\0\14\12\1\125\12\0\2\12"+
|
||||
"\1\0\2\12\1\0\3\12\4\0\1\12\1\0\6\12"+
|
||||
"\1\126\6\12\12\0\2\12\1\0\2\12\1\0\3\12"+
|
||||
"\4\0\1\12\1\0\2\12\1\127\12\12\12\0\2\12"+
|
||||
"\1\0\2\12\1\0\3\12\4\0\1\12\1\0\5\12"+
|
||||
"\1\130\7\12\12\0\2\12\1\0\2\12\1\0\3\12"+
|
||||
"\4\0\1\12\20\75\1\117\1\131\24\75\1\0\11\12"+
|
||||
"\1\132\3\12\12\0\2\12\1\0\2\12\1\0\3\12"+
|
||||
"\4\0\1\12\1\0\5\12\1\133\7\12\12\0\2\12"+
|
||||
"\1\0\2\12\1\0\3\12\4\0\1\12\1\0\7\12"+
|
||||
"\1\134\5\12\12\0\2\12\1\0\2\12\1\0\3\12"+
|
||||
"\4\0\1\12\1\0\1\135\14\12\12\0\2\12\1\0"+
|
||||
"\2\12\1\0\3\12\4\0\1\12\1\0\7\12\1\136"+
|
||||
"\5\12\12\0\2\12\1\0\2\12\1\0\3\12\4\0"+
|
||||
"\1\12\1\0\6\12\1\137\6\12\12\0\2\12\1\0"+
|
||||
"\2\12\1\0\3\12\4\0\1\12\1\0\1\12\1\140"+
|
||||
"\13\12\12\0\2\12\1\0\2\12\1\0\3\12\4\0"+
|
||||
"\1\12\1\0\6\12\1\141\6\12\12\0\2\12\1\0"+
|
||||
"\2\12\1\0\3\12\4\0\1\12\1\0\2\12\1\142"+
|
||||
"\12\12\12\0\2\12\1\0\2\12\1\0\3\12\4\0"+
|
||||
"\1\12\1\0\14\12\1\143\12\0\2\12\1\0\2\12"+
|
||||
"\1\0\3\12\4\0\1\12\1\0\15\12\12\0\2\12"+
|
||||
"\1\0\1\12\1\144\1\0\3\12\4\0\1\12";
|
||||
|
||||
private static int [] zzUnpackTrans() {
|
||||
int [] result = new int[2090];
|
||||
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 <code>aState</code>
|
||||
*/
|
||||
private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
|
||||
|
||||
private static final String ZZ_ATTRIBUTE_PACKED_0 =
|
||||
"\6\0\1\11\10\1\3\11\2\1\5\11\1\1\1\11"+
|
||||
"\1\1\2\11\1\1\1\11\1\1\1\11\1\1\6\11"+
|
||||
"\1\1\7\11\13\1\1\0\1\11\2\1\4\11\12\1"+
|
||||
"\1\0\11\1\1\11\13\1";
|
||||
|
||||
private static int [] zzUnpackAttribute() {
|
||||
int [] result = new int[100];
|
||||
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: */
|
||||
private int intvalue=0;
|
||||
private String textvalue ="";
|
||||
private int fracvalue=0;
|
||||
private int fraclength=0;
|
||||
private int expvalue=0;
|
||||
private int expsign=1;
|
||||
private int startline =0;
|
||||
private int startcolumn =0;
|
||||
private String stringvalue="";
|
||||
|
||||
|
||||
/**
|
||||
* Creates a new scanner
|
||||
*
|
||||
* @param in the java.io.Reader to read input from.
|
||||
*/
|
||||
public JFlexXScanner(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 < 140) {
|
||||
int count = packed.charAt(i++);
|
||||
char value = packed.charAt(i++);
|
||||
do map[j++] = value; while (--count > 0);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>false</code>, iff there was new input.
|
||||
*
|
||||
* @exception java.io.IOException if any I/O-Error occurs
|
||||
*/
|
||||
private boolean zzRefill() throws java.io.IOException {
|
||||
|
||||
/* first: make room (if you can) */
|
||||
if (zzStartRead > 0) {
|
||||
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
|
||||
* <b>cannot</b> be reused (internal buffer is discarded and lost).
|
||||
* Lexical state is set to <tt>ZZ_INITIAL</tt>.
|
||||
*
|
||||
* 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 <tt>pos</tt> 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;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 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 Token nextToken() 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;
|
||||
|
||||
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;
|
||||
switch (zzLexicalState) {
|
||||
case INT: {
|
||||
yybegin(YYINITIAL);
|
||||
yypushback(1);
|
||||
return new IntConstToken(Token.INTCONST, textvalue, startline, startcolumn, intvalue);
|
||||
}
|
||||
case 101: break;
|
||||
case FRACTION: {
|
||||
yybegin(YYINITIAL);
|
||||
yypushback(1);
|
||||
return new FloatConstToken(Token.FLOATCONST, textvalue, startline, startcolumn,intvalue+fracvalue/Math.pow(10,fraclength));
|
||||
}
|
||||
case 102: break;
|
||||
case EXPVZ: {
|
||||
yybegin(YYINITIAL);
|
||||
yypushback(1);
|
||||
return new Token(Token.INVALID, textvalue, startline, startcolumn);
|
||||
}
|
||||
case 103: break;
|
||||
case EXP: {
|
||||
yybegin(YYINITIAL);
|
||||
yypushback(1);
|
||||
return new FloatConstToken(Token.FLOATCONST, textvalue, startline, startcolumn, (intvalue+fracvalue/Math.pow(10,fraclength))*Math.pow(10,expvalue*expsign));
|
||||
}
|
||||
case 104: break;
|
||||
case STRING: {
|
||||
yybegin(YYINITIAL); return new Token(Token.INVALID, textvalue, startline, startcolumn);
|
||||
}
|
||||
case 105: break;
|
||||
default:
|
||||
{
|
||||
return new Token(Token.EOF, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
|
||||
case 1:
|
||||
{ return new Token(Token.INVALID, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 52: break;
|
||||
case 2:
|
||||
{ return new Token(Token.ID, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 53: break;
|
||||
case 3:
|
||||
{ return new Token(Token.PLUS, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 54: break;
|
||||
case 4:
|
||||
{ return new Token(Token.MINUS, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 55: break;
|
||||
case 5:
|
||||
{ return new Token(Token.MULT, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 56: break;
|
||||
case 6:
|
||||
{ return new Token(Token.DIV, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 57: break;
|
||||
case 7:
|
||||
{ return new Token(Token.COLON, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 58: break;
|
||||
case 8:
|
||||
{ return new Token(Token.EQUALS, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 59: break;
|
||||
case 9:
|
||||
{ return new Token(Token.LBR, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 60: break;
|
||||
case 10:
|
||||
{ return new Token(Token.RBR, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 61: break;
|
||||
case 11:
|
||||
{ return new Token(Token.LESS, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 62: break;
|
||||
case 12:
|
||||
{ return new Token(Token.MORE, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 63: break;
|
||||
case 13:
|
||||
{ return new Token(Token.SEMICOLON, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 64: break;
|
||||
case 14:
|
||||
{ return new Token(Token.DOT, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 65: break;
|
||||
case 15:
|
||||
{ yybegin(INT); textvalue=yytext(); startline=yyline+1; startcolumn=yycolumn+1;
|
||||
intvalue=yytext().charAt(0)-'0'; fracvalue=0; fraclength=0; expvalue=0;
|
||||
}
|
||||
case 66: break;
|
||||
case 16:
|
||||
{ return new IntConstToken(Token.INTCONST, yytext(), yyline+1, yycolumn+1, 0);
|
||||
}
|
||||
case 67: break;
|
||||
case 17:
|
||||
{ yybegin(STRING); textvalue="\""; stringvalue=""; startline=yyline+1; startcolumn=yycolumn+1;
|
||||
}
|
||||
case 68: break;
|
||||
case 18:
|
||||
{ /* eat whitespace */
|
||||
}
|
||||
case 69: break;
|
||||
case 19:
|
||||
{ yybegin(YYINITIAL);
|
||||
yypushback(1);
|
||||
return new IntConstToken(Token.INTCONST, textvalue, startline, startcolumn, intvalue);
|
||||
}
|
||||
case 70: break;
|
||||
case 20:
|
||||
{ yybegin(FRACTION);
|
||||
textvalue+=yytext();
|
||||
}
|
||||
case 71: break;
|
||||
case 21:
|
||||
{ intvalue = 10*intvalue + yytext().charAt(0)-'0';
|
||||
textvalue+=yytext();
|
||||
}
|
||||
case 72: break;
|
||||
case 22:
|
||||
{ yybegin(YYINITIAL);
|
||||
yypushback(1);
|
||||
return new FloatConstToken(Token.FLOATCONST, textvalue, startline, startcolumn,intvalue+fracvalue/Math.pow(10,fraclength));
|
||||
}
|
||||
case 73: break;
|
||||
case 23:
|
||||
{ yybegin(EXPVZ);
|
||||
textvalue+=yytext();
|
||||
}
|
||||
case 74: break;
|
||||
case 24:
|
||||
{ fracvalue= 10*fracvalue+ yytext().charAt(0)-'0';
|
||||
fraclength++;
|
||||
textvalue+=yytext();
|
||||
}
|
||||
case 75: break;
|
||||
case 25:
|
||||
{ yybegin(YYINITIAL);
|
||||
yypushback(1);
|
||||
return new Token(Token.INVALID, textvalue, startline, startcolumn);
|
||||
}
|
||||
case 76: break;
|
||||
case 26:
|
||||
{ yybegin(EXP); expvalue=yytext().charAt(0)-'0'; expsign=1; textvalue+=yytext();
|
||||
}
|
||||
case 77: break;
|
||||
case 27:
|
||||
{ yybegin(YYINITIAL);
|
||||
return new FloatConstToken(Token.FLOATCONST, textvalue+yytext(), startline, startcolumn,intvalue+fracvalue/Math.pow(10,fraclength));
|
||||
}
|
||||
case 78: break;
|
||||
case 28:
|
||||
{ yybegin(YYINITIAL);
|
||||
yypushback(1);
|
||||
return new FloatConstToken(Token.FLOATCONST, textvalue, startline, startcolumn, (intvalue+fracvalue/Math.pow(10,fraclength))*Math.pow(10,expvalue*expsign));
|
||||
}
|
||||
case 79: break;
|
||||
case 29:
|
||||
{ expvalue = 10* expvalue + yytext().charAt(0)-'0'; textvalue+=yytext();
|
||||
}
|
||||
case 80: break;
|
||||
case 30:
|
||||
{ yybegin(YYINITIAL); return new Token(Token.INVALID, textvalue+yytext(), startline, startcolumn);
|
||||
}
|
||||
case 81: break;
|
||||
case 31:
|
||||
{ textvalue+=yytext(); stringvalue+=yytext();
|
||||
}
|
||||
case 82: break;
|
||||
case 32:
|
||||
{ yybegin(YYINITIAL); return new StringConstToken(Token.STRINGCONST, textvalue+"\"", startline, startcolumn, stringvalue);
|
||||
}
|
||||
case 83: break;
|
||||
case 33:
|
||||
{ return new Token(Token.IF, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 84: break;
|
||||
case 34:
|
||||
{ return new Token(Token.ASSIGN, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 85: break;
|
||||
case 35:
|
||||
// lookahead expression with fixed base length
|
||||
zzMarkedPos = Character.offsetByCodePoints
|
||||
(zzBufferL, zzStartRead, zzEndRead - zzStartRead, zzStartRead, 1);
|
||||
{ yybegin(INT); textvalue=yytext(); startline=yyline+1; startcolumn=yycolumn+1;
|
||||
intvalue=yytext().charAt(0)-'0'; fracvalue=0; fraclength=0; expvalue=0;
|
||||
}
|
||||
case 86: break;
|
||||
case 36:
|
||||
// lookahead expression with fixed base length
|
||||
zzMarkedPos = Character.offsetByCodePoints
|
||||
(zzBufferL, zzStartRead, zzEndRead - zzStartRead, zzStartRead, 1);
|
||||
{ yybegin(EXPVZ); textvalue += yytext();
|
||||
}
|
||||
case 87: break;
|
||||
case 37:
|
||||
{ yybegin(EXP); expvalue=yytext().charAt(1)-'0'; expsign=-1; textvalue+=yytext();
|
||||
}
|
||||
case 88: break;
|
||||
case 38:
|
||||
{ textvalue+="\\\""; stringvalue+="\"";
|
||||
}
|
||||
case 89: break;
|
||||
case 39:
|
||||
{ return new Token(Token.END, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 90: break;
|
||||
case 40:
|
||||
{ return new Token(Token.INT, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 91: break;
|
||||
case 41:
|
||||
{ return new Token(Token.FOR, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 92: break;
|
||||
case 42:
|
||||
{ return new Token(Token.READ, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 93: break;
|
||||
case 43:
|
||||
{ return new Token(Token.ELSE, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 94: break;
|
||||
case 44:
|
||||
{ return new Token(Token.THEN, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 95: break;
|
||||
case 45:
|
||||
{ /* eat comments */
|
||||
}
|
||||
case 96: break;
|
||||
case 46:
|
||||
{ return new Token(Token.PRINT, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 97: break;
|
||||
case 47:
|
||||
{ return new Token(Token.FLOAT, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 98: break;
|
||||
case 48:
|
||||
{ return new Token(Token.WHILE, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 99: break;
|
||||
case 49:
|
||||
{ return new Token(Token.BEGIN, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 100: break;
|
||||
case 50:
|
||||
{ return new Token(Token.STRING, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 101: break;
|
||||
case 51:
|
||||
{ return new Token(Token.PROGRAM, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 102: break;
|
||||
default:
|
||||
zzScanError(ZZ_NO_MATCH);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,148 @@
|
||||
/* **********************************************
|
||||
* Duale Hochschule Baden-Württemberg Karlsruhe
|
||||
* Prof. Dr. Jörn Eisenbiegler
|
||||
*
|
||||
* Vorlesung Übersetzerbau
|
||||
* Praxis X Abstiegsparser
|
||||
* - Scanner-Definition
|
||||
*
|
||||
* **********************************************
|
||||
*/
|
||||
|
||||
|
||||
package de.dhbw.compiler.xparser;
|
||||
|
||||
%%
|
||||
|
||||
%class JFlexXScanner
|
||||
%type Token
|
||||
%function nextToken
|
||||
|
||||
|
||||
%unicode
|
||||
%line
|
||||
%column
|
||||
|
||||
%public
|
||||
%final
|
||||
|
||||
%xstate INT, FRACTION, EXPVZ, EXP, STRING
|
||||
|
||||
%{
|
||||
private int intvalue=0;
|
||||
private String textvalue ="";
|
||||
private int fracvalue=0;
|
||||
private int fraclength=0;
|
||||
private int expvalue=0;
|
||||
private int expsign=1;
|
||||
private int startline =0;
|
||||
private int startcolumn =0;
|
||||
private String stringvalue="";
|
||||
%}
|
||||
|
||||
|
||||
|
||||
%%
|
||||
|
||||
read { return new Token(Token.READ, yytext(), yyline+1, yycolumn+1); }
|
||||
print { return new Token(Token.PRINT, yytext(), yyline+1, yycolumn+1); }
|
||||
int { return new Token(Token.INT, yytext(), yyline+1, yycolumn+1); }
|
||||
float { return new Token(Token.FLOAT, yytext(), yyline+1, yycolumn+1); }
|
||||
string { return new Token(Token.STRING, yytext(), yyline+1, yycolumn+1); }
|
||||
\+ { return new Token(Token.PLUS, yytext(), yyline+1, yycolumn+1); }
|
||||
\- { return new Token(Token.MINUS, yytext(), yyline+1, yycolumn+1); }
|
||||
\* { return new Token(Token.MULT, yytext(), yyline+1, yycolumn+1); }
|
||||
\/ { return new Token(Token.DIV, yytext(), yyline+1, yycolumn+1); }
|
||||
:= { return new Token(Token.ASSIGN, yytext(), yyline+1, yycolumn+1); }
|
||||
\( { return new Token(Token.LBR, yytext(), yyline+1, yycolumn+1); }
|
||||
\) { return new Token(Token.RBR, yytext(), yyline+1, yycolumn+1); }
|
||||
\< { return new Token(Token.LESS, yytext(), yyline+1, yycolumn+1); }
|
||||
> { return new Token(Token.MORE, yytext(), yyline+1, yycolumn+1); }
|
||||
= { return new Token(Token.EQUALS, yytext(), yyline+1, yycolumn+1); }
|
||||
if { return new Token(Token.IF, yytext(), yyline+1, yycolumn+1); }
|
||||
then { return new Token(Token.THEN, yytext(), yyline+1, yycolumn+1); }
|
||||
else { return new Token(Token.ELSE, yytext(), yyline+1, yycolumn+1); }
|
||||
while { return new Token(Token.WHILE, yytext(), yyline+1, yycolumn+1); }
|
||||
for { return new Token(Token.FOR, yytext(), yyline+1, yycolumn+1); }
|
||||
; { return new Token(Token.SEMICOLON, yytext(), yyline+1, yycolumn+1); }
|
||||
begin { return new Token(Token.BEGIN, yytext(), yyline+1, yycolumn+1); }
|
||||
end { return new Token(Token.END, yytext(), yyline+1, yycolumn+1); }
|
||||
program { return new Token(Token.PROGRAM, yytext(), yyline+1, yycolumn+1); }
|
||||
\. { return new Token(Token.DOT, yytext(), yyline+1, yycolumn+1); }
|
||||
: { return new Token(Token.COLON, yytext(), yyline+1, yycolumn+1); }
|
||||
|
||||
|
||||
[a-zA-Z][a-zA-Z0-9]* { return new Token(Token.ID, yytext(), yyline+1, yycolumn+1); }
|
||||
|
||||
0 { return new IntConstToken(Token.INTCONST, yytext(), yyline+1, yycolumn+1, 0); }
|
||||
0/\. { yybegin(INT); textvalue=yytext(); startline=yyline+1; startcolumn=yycolumn+1;
|
||||
intvalue=yytext().charAt(0)-'0'; fracvalue=0; fraclength=0; expvalue=0; }
|
||||
[1-9] { yybegin(INT); textvalue=yytext(); startline=yyline+1; startcolumn=yycolumn+1;
|
||||
intvalue=yytext().charAt(0)-'0'; fracvalue=0; fraclength=0; expvalue=0; }
|
||||
|
||||
\" { yybegin(STRING); textvalue="\""; stringvalue=""; startline=yyline+1; startcolumn=yycolumn+1; }
|
||||
|
||||
(\/\*)~(\*\/) { /* eat comments */ }
|
||||
[\ \t\b\f\r\n]+ { /* eat whitespace */ }
|
||||
<<EOF>> { return new Token(Token.EOF, yytext(), yyline+1, yycolumn+1); }
|
||||
[^] { return new Token(Token.INVALID, yytext(), yyline+1, yycolumn+1); }
|
||||
|
||||
<STRING> {
|
||||
[a-zA-Z \.:] { textvalue+=yytext(); stringvalue+=yytext(); }
|
||||
\\\" { textvalue+="\\\""; stringvalue+="\""; }
|
||||
\" { yybegin(YYINITIAL); return new StringConstToken(Token.STRINGCONST, textvalue+"\"", startline, startcolumn, stringvalue); }
|
||||
[^] { yybegin(YYINITIAL); return new Token(Token.INVALID, textvalue+yytext(), startline, startcolumn); }
|
||||
<<EOF>> { yybegin(YYINITIAL); return new Token(Token.INVALID, textvalue, startline, startcolumn); }
|
||||
}
|
||||
|
||||
<INT> {
|
||||
[0-9] { intvalue = 10*intvalue + yytext().charAt(0)-'0';
|
||||
textvalue+=yytext();}
|
||||
\. { yybegin(FRACTION);
|
||||
textvalue+=yytext();}
|
||||
[eE]/-?[0-9] { yybegin(EXPVZ); textvalue += yytext(); }
|
||||
[^] { yybegin(YYINITIAL);
|
||||
yypushback(1);
|
||||
return new IntConstToken(Token.INTCONST, textvalue, startline, startcolumn, intvalue); }
|
||||
<<EOF>> { yybegin(YYINITIAL);
|
||||
yypushback(1);
|
||||
return new IntConstToken(Token.INTCONST, textvalue, startline, startcolumn, intvalue);}
|
||||
}
|
||||
|
||||
<FRACTION> {
|
||||
[0-9] { fracvalue= 10*fracvalue+ yytext().charAt(0)-'0';
|
||||
fraclength++;
|
||||
textvalue+=yytext();}
|
||||
[eE]/-?[0-9] { yybegin(EXPVZ);
|
||||
textvalue+=yytext();}
|
||||
[^] { yybegin(YYINITIAL);
|
||||
yypushback(1);
|
||||
return new FloatConstToken(Token.FLOATCONST, textvalue, startline, startcolumn,intvalue+fracvalue/Math.pow(10,fraclength)); }
|
||||
<<EOF>> { yybegin(YYINITIAL);
|
||||
yypushback(1);
|
||||
return new FloatConstToken(Token.FLOATCONST, textvalue, startline, startcolumn,intvalue+fracvalue/Math.pow(10,fraclength)); }
|
||||
}
|
||||
|
||||
<EXPVZ> {
|
||||
-0|0 { yybegin(YYINITIAL);
|
||||
return new FloatConstToken(Token.FLOATCONST, textvalue+yytext(), startline, startcolumn,intvalue+fracvalue/Math.pow(10,fraclength)); }
|
||||
-[1-9] { yybegin(EXP); expvalue=yytext().charAt(1)-'0'; expsign=-1; textvalue+=yytext(); }
|
||||
[1-9] { yybegin(EXP); expvalue=yytext().charAt(0)-'0'; expsign=1; textvalue+=yytext(); }
|
||||
[^] { yybegin(YYINITIAL);
|
||||
yypushback(1);
|
||||
return new Token(Token.INVALID, textvalue, startline, startcolumn); }
|
||||
<<EOF>> { yybegin(YYINITIAL);
|
||||
yypushback(1);
|
||||
return new Token(Token.INVALID, textvalue, startline, startcolumn); }
|
||||
}
|
||||
|
||||
<EXP> {
|
||||
[0-9] { expvalue = 10* expvalue + yytext().charAt(0)-'0'; textvalue+=yytext(); }
|
||||
[^] { yybegin(YYINITIAL);
|
||||
yypushback(1);
|
||||
return new FloatConstToken(Token.FLOATCONST, textvalue, startline, startcolumn, (intvalue+fracvalue/Math.pow(10,fraclength))*Math.pow(10,expvalue*expsign)); }
|
||||
<<EOF>> { yybegin(YYINITIAL);
|
||||
yypushback(1);
|
||||
return new FloatConstToken(Token.FLOATCONST, textvalue, startline, startcolumn, (intvalue+fracvalue/Math.pow(10,fraclength))*Math.pow(10,expvalue*expsign)); }
|
||||
}
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
/* **********************************************
|
||||
* Duale Hochschule Baden-Württemberg Karlsruhe
|
||||
* Prof. Dr. Jörn Eisenbiegler
|
||||
*
|
||||
* Vorlesung Übersetzerbau
|
||||
* Praxis LL(1)-Parser für X
|
||||
* - Token-Definition stringConst
|
||||
*
|
||||
* **********************************************
|
||||
*/
|
||||
|
||||
package de.dhbw.compiler.xparser;
|
||||
|
||||
public class StringConstToken extends Token {
|
||||
|
||||
private String value="";
|
||||
|
||||
public StringConstToken(int type, String text, int line, int column, String value) {
|
||||
super(type,text,line,column);
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public String getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,167 @@
|
||||
/* **********************************************
|
||||
* Duale Hochschule Baden-Württemberg Karlsruhe
|
||||
* Prof. Dr. Jörn Eisenbiegler
|
||||
*
|
||||
* Vorlesung Übersetzerbau
|
||||
* Praxis LL(1)-Parser für X
|
||||
* - Token-Definition
|
||||
*
|
||||
* **********************************************
|
||||
*/
|
||||
|
||||
package de.dhbw.compiler.xparser;
|
||||
|
||||
public class Token {
|
||||
|
||||
public static final int EOF = -1;
|
||||
public static final int INVALID = 0;
|
||||
public static final int ID = 1;
|
||||
public static final int INTCONST = 2;
|
||||
public static final int FLOATCONST = 3;
|
||||
public static final int STRINGCONST = 4;
|
||||
public static final int LBR = 5;
|
||||
public static final int RBR = 6;
|
||||
public static final int MULT = 7;
|
||||
public static final int PLUS = 8;
|
||||
public static final int MINUS = 9;
|
||||
public static final int DOT = 10;
|
||||
public static final int DIV = 11;
|
||||
public static final int COLON = 12;
|
||||
public static final int ASSIGN = 13;
|
||||
public static final int SEMICOLON = 14;
|
||||
public static final int LESS = 15;
|
||||
public static final int EQUALS = 16;
|
||||
public static final int MORE = 17;
|
||||
public static final int BEGIN = 18;
|
||||
public static final int ELSE = 19;
|
||||
public static final int END = 20;
|
||||
public static final int FLOAT = 21;
|
||||
public static final int FOR = 22;
|
||||
public static final int IF = 23;
|
||||
public static final int INT = 24;
|
||||
public static final int PRINT = 25;
|
||||
public static final int PROGRAM = 26;
|
||||
public static final int READ = 27;
|
||||
public static final int STRING = 28;
|
||||
public static final int THEN = 29;
|
||||
public static final int WHILE = 30;
|
||||
|
||||
// Token für innere Knoten des Ableitungsbaumes
|
||||
public static final int TYPE = 101;
|
||||
public static final int MODIFIER = 102;
|
||||
public static final int DECL = 103;
|
||||
public static final int EXPR = 104;
|
||||
public static final int EXPR2 = 105;
|
||||
public static final int EXPR3 = 106;
|
||||
public static final int ASSIGNSTAT = 107;
|
||||
public static final int FORSTAT = 108;
|
||||
public static final int WHILESTAT = 109;
|
||||
public static final int CONDSTAT = 110;
|
||||
public static final int COND = 111;
|
||||
public static final int STAT = 112;
|
||||
public static final int BLOCK = 113;
|
||||
public static final int STATLIST = 114;
|
||||
public static final int STATWITHSEMI = 115;
|
||||
public static final int DECLLIST = 116;
|
||||
public static final int APROGRAM = 117;
|
||||
public static final int UMINUS = 118;
|
||||
|
||||
private int type;
|
||||
private String text;
|
||||
private int line;
|
||||
private int columnm;
|
||||
|
||||
public Token(int type, String text, int line, int column) {
|
||||
this.type = type;
|
||||
this.text = text;
|
||||
this.line = line;
|
||||
this.columnm = column;
|
||||
}
|
||||
|
||||
public Token(int type, String text) {
|
||||
this(type,text,0,0);
|
||||
}
|
||||
|
||||
public Token(int type) {
|
||||
this(type, getTypeName(type));
|
||||
}
|
||||
|
||||
public int getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public String getText() {
|
||||
return text;
|
||||
}
|
||||
|
||||
public int getLine() {
|
||||
return line;
|
||||
}
|
||||
|
||||
public int getColumn() {
|
||||
return columnm;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "(" + getTypeName(type) + "," + text + "," + line + "," + columnm + ")";
|
||||
}
|
||||
|
||||
public static String getTypeName(int tokenType) {
|
||||
switch (tokenType) {
|
||||
case EOF: return "EOF";
|
||||
case INVALID: return "INVALID";
|
||||
case ID: return "ID";
|
||||
case INTCONST: return "INTCONST";
|
||||
case FLOATCONST: return "FLOATCONST";
|
||||
case STRINGCONST: return "STRINGCONST";
|
||||
case LBR: return "LBR";
|
||||
case RBR: return "RBR";
|
||||
case MULT: return "MULT";
|
||||
case PLUS: return "PLUS";
|
||||
case MINUS: return "MINUS";
|
||||
case DOT: return "DOT";
|
||||
case DIV: return "DIV";
|
||||
case COLON: return "COLON";
|
||||
case ASSIGN: return "ASSIGN";
|
||||
case SEMICOLON: return "SEMICOLON";
|
||||
case LESS: return "LESS";
|
||||
case EQUALS: return "EQUALS";
|
||||
case MORE: return "MORE";
|
||||
case BEGIN: return "BEGIN";
|
||||
case ELSE: return "ELSE";
|
||||
case END: return "END";
|
||||
case FLOAT: return "FLOAT";
|
||||
case FOR: return "FOR";
|
||||
case IF: return "IF";
|
||||
case INT: return "INT";
|
||||
case PRINT: return "PRINT";
|
||||
case PROGRAM: return "PROGRAM";
|
||||
case READ: return "READ";
|
||||
case STRING: return "STRING";
|
||||
case THEN: return "THEN";
|
||||
case WHILE: return "WHILE";
|
||||
// Token für innere Knoten des Ableitungsbaumes
|
||||
case TYPE: return "TYPE";
|
||||
case MODIFIER: return "MODIFIER";
|
||||
case DECL: return "DECL";
|
||||
case EXPR: return "EXPR";
|
||||
case EXPR2: return "EXPR2";
|
||||
case EXPR3: return "EXPR3";
|
||||
case ASSIGNSTAT: return "ASSIGNSTAT";
|
||||
case FORSTAT: return "FORSTAT";
|
||||
case WHILESTAT: return "WHILESTAT";
|
||||
case CONDSTAT: return "CONDSTAT";
|
||||
case COND: return "COND";
|
||||
case STAT: return "STAT";
|
||||
case BLOCK: return "BLOCK";
|
||||
case STATLIST: return "STATLIST";
|
||||
case STATWITHSEMI: return "STATWITHSEMI";
|
||||
case DECLLIST: return "DECLLIST";
|
||||
case APROGRAM: return "APROGRAM";
|
||||
case UMINUS: return "UMNInUS";
|
||||
default: return "Unknown token type!";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
/* **********************************************
|
||||
* Duale Hochschule Baden-Württemberg Karlsruhe
|
||||
* Prof. Dr. Jörn Eisenbiegler
|
||||
*
|
||||
* Vorlesung Übersetzerbau
|
||||
* Praxis LL(1)-Parser für X
|
||||
* - Token-Puffer
|
||||
*
|
||||
* **********************************************
|
||||
*/
|
||||
|
||||
package de.dhbw.compiler.xparser;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
public class TokenBuffer {
|
||||
|
||||
private JFlexXScanner scanner;
|
||||
private int count = 0;
|
||||
private Token token = null;
|
||||
|
||||
public TokenBuffer(JFlexXScanner scanner) throws IOException {
|
||||
this.scanner = scanner;
|
||||
token = scanner.nextToken();
|
||||
count++;
|
||||
}
|
||||
|
||||
public Token nextToken() throws IOException {
|
||||
Token help = token;
|
||||
if (help.getType()!=Token.EOF) {
|
||||
token = scanner.nextToken();
|
||||
count++;
|
||||
}
|
||||
return help;
|
||||
}
|
||||
|
||||
public Token lookaheadToken() {
|
||||
return token;
|
||||
}
|
||||
|
||||
public int getTokenCount() {
|
||||
return count;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,97 @@
|
||||
/* **********************************************
|
||||
* Duale Hochschule Baden-Württemberg Karlsruhe
|
||||
* Prof. Dr. Jörn Eisenbiegler
|
||||
*
|
||||
* Vorlesung Übersetzerbau
|
||||
* Praxis LL(1)-Parser für X
|
||||
* - Syntaxbaum
|
||||
*
|
||||
* **********************************************
|
||||
*/
|
||||
|
||||
package de.dhbw.compiler.xparser;
|
||||
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
public class Tree {
|
||||
|
||||
private Token token = null;
|
||||
private LinkedList<Tree> children = null;
|
||||
|
||||
public Tree(Token token) {
|
||||
this.token=token;
|
||||
this.children= new LinkedList<Tree>();
|
||||
}
|
||||
|
||||
public Token getToken() {
|
||||
return token;
|
||||
}
|
||||
|
||||
public void addLastChild(Tree child) {
|
||||
this.children.addLast(child);
|
||||
}
|
||||
|
||||
public void addFirstChild(Tree child) {
|
||||
this.children.addFirst(child);
|
||||
}
|
||||
|
||||
public Tree removeChild(int n) {
|
||||
return this.children.remove(n);
|
||||
}
|
||||
|
||||
public Tree getChild(int n) {
|
||||
return this.children.get(n);
|
||||
}
|
||||
|
||||
public int getChildCount() {
|
||||
return this.children.size();
|
||||
}
|
||||
|
||||
public List<Tree> getChildren() {
|
||||
return children;
|
||||
}
|
||||
|
||||
public String toGraphvizDot() {
|
||||
StringBuffer dot = new StringBuffer();
|
||||
dot.append("digraph{ \n");
|
||||
this.appendNode(dot);
|
||||
this.appendEdges(dot);
|
||||
dot.append("}");
|
||||
return dot.toString();
|
||||
}
|
||||
|
||||
private void appendNode(StringBuffer dot) {
|
||||
dot.append("n"+this.hashCode());
|
||||
dot.append(" [label=\""+token.getText().replace("\\", "\\\\").replace("\"","\\\"")+"\"]\n");
|
||||
for (Tree c: children) {
|
||||
c.appendNode(dot);
|
||||
}
|
||||
}
|
||||
|
||||
private void appendEdges(StringBuffer dot) {
|
||||
for (Tree c: children) {
|
||||
dot.append("n"+this.hashCode()+" -> n"+c.hashCode()+"\n");
|
||||
}
|
||||
for (Tree c: children) {
|
||||
c.appendEdges(dot);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
StringBuffer res = new StringBuffer();
|
||||
if (children.isEmpty()) {
|
||||
res.append(token.getText());
|
||||
} else {
|
||||
res.append("("+this.token.getText());
|
||||
for (Tree c: children) {
|
||||
res.append(" "+c.toString());
|
||||
}
|
||||
res.append(")");
|
||||
}
|
||||
return res.toString();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
/* **********************************************
|
||||
* Duale Hochschule Baden-Württemberg Karlsruhe
|
||||
* Prof. Dr. Jörn Eisenbiegler
|
||||
*
|
||||
* Vorlesung Übersetzerbau
|
||||
* Praxis LL(1)-Parser für X
|
||||
* - LL1-Parser
|
||||
*
|
||||
* **********************************************
|
||||
*/
|
||||
|
||||
package de.dhbw.compiler.xparser;
|
||||
|
||||
public class XParser {
|
||||
|
||||
public XParser(TokenBuffer in) {
|
||||
//TODO Initialization
|
||||
}
|
||||
|
||||
public Tree parseProgram() {
|
||||
//TODO Parser
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
/* **********************************************
|
||||
* Duale Hochschule Baden-Württemberg Karlsruhe
|
||||
* Prof. Dr. Jörn Eisenbiegler
|
||||
*
|
||||
* Vorlesung Übersetzerbau
|
||||
* Praxis LL(1)-Parser für X
|
||||
*
|
||||
* **********************************************
|
||||
*/
|
||||
|
||||
package de.dhbw.compiler.xparser;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
import java.io.StringReader;
|
||||
|
||||
|
||||
|
||||
public class XParserMain {
|
||||
|
||||
private static final String TEST =
|
||||
"program test2;\n"+
|
||||
" x : int;\n"+
|
||||
" y : float;\n"+
|
||||
" z : string;\n"+
|
||||
"begin\n"+
|
||||
" x := 4+5+6.2;\n"+
|
||||
" y := 3.56+1.2e3+45.e-67+4e34+3E-1;\n"+
|
||||
" z := \"Hello \\\"World\\\"\" + \":\";\n"+
|
||||
" z := \"Peter\" + 4;\n"+
|
||||
" if 2<3 then abc := 5 else abc := 7;\n"+
|
||||
" while (x>y) y := y+1;\n"+
|
||||
" begin\n"+
|
||||
" for (x:=1; x<6; x:=x+1) y:=y+2;\n"+
|
||||
" end;\n"+
|
||||
"end.";
|
||||
|
||||
private static final String TESTXmin1 =
|
||||
"program xmin1;\n"+
|
||||
" read x : int;\n"+
|
||||
" print y : int;\n"+
|
||||
"begin\n"+
|
||||
" y := 25+2*x-6*x;\n"+
|
||||
" if x<y then \n"+
|
||||
" begin\n" +
|
||||
" x:= -3/6*(y+2);\n"+
|
||||
" if y<x then y:=y+3 else y:=y+4;\n"+
|
||||
" end\n" +
|
||||
" else\n" +
|
||||
" begin\n" +
|
||||
" if y<x then y:=y+3;\n"+
|
||||
" x:= y*(y-x)/y;\n"+
|
||||
" end;\n" +
|
||||
" y := x*y;\n"+
|
||||
"end.";
|
||||
|
||||
private static final String TEST2 =
|
||||
"program test2;\n"+
|
||||
"begin\n"+
|
||||
" x := 4-5*6*7+8/9;\n"+
|
||||
"end.";
|
||||
|
||||
private static final String BEISPIELFOLIEN =
|
||||
"program test5;\n"+
|
||||
" read x : int;\n"+
|
||||
" print y : float;\n"+
|
||||
" z : int;\n"+
|
||||
"begin\n"+
|
||||
" while (x<4) begin\n"+
|
||||
" for (z:=0; z<4; z:=z+1) x:=x+2;\n"+
|
||||
" if x=4 then begin\n"+
|
||||
" x:=z*(x+2);\n"+
|
||||
" x:=x+10;\n"+
|
||||
" end else y:=100.e-3;\n"+
|
||||
" end;\n"+
|
||||
"end.\n";
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
|
||||
//TODO Initialize scanner and parser
|
||||
//TODO Call parser
|
||||
//TODO Output: Tree, count of tokens and comparisons
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
/* **********************************************
|
||||
* Duale Hochschule Baden-Württemberg Karlsruhe
|
||||
* Prof. Dr. Jörn Eisenbiegler
|
||||
*
|
||||
* Vorlesung Übersetzerbau
|
||||
* Praxis LL(1)-Parser für X
|
||||
* - Testfall-Utility für Scanner
|
||||
*
|
||||
* **********************************************
|
||||
*/
|
||||
|
||||
|
||||
package de.dhbw.compiler.xparser.test;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
import java.io.StringReader;
|
||||
|
||||
import de.dhbw.compiler.xparser.JFlexXScanner;
|
||||
import de.dhbw.compiler.xparser.TokenBuffer;
|
||||
import de.dhbw.compiler.xparser.Tree;
|
||||
import de.dhbw.compiler.xparser.XParser;
|
||||
|
||||
public abstract class ParseTreeTest {
|
||||
|
||||
protected void testParseTree(String in, String expected) throws Exception {
|
||||
JFlexXScanner scanner = new JFlexXScanner(new StringReader(in));
|
||||
TokenBuffer buffer = new TokenBuffer(scanner);
|
||||
XParser parser = new XParser(buffer);
|
||||
|
||||
Tree out = parser.parseProgram();
|
||||
|
||||
if (out==null) {
|
||||
assertEquals(expected, out);
|
||||
} else {
|
||||
assertEquals(expected, out.toString());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
/* **********************************************
|
||||
* Duale Hochschule Baden-Württemberg Karlsruhe
|
||||
* Prof. Dr. Jörn Eisenbiegler
|
||||
*
|
||||
* Vorlesung Übersetzerbau
|
||||
* Praxis AST für X
|
||||
* - Testsuite für Scanner
|
||||
*
|
||||
* **********************************************
|
||||
*/
|
||||
package de.dhbw.compiler.xparser.test;
|
||||
|
||||
import org.junit.runner.RunWith;
|
||||
import org.junit.runners.Suite;
|
||||
import org.junit.runners.Suite.SuiteClasses;
|
||||
|
||||
@RunWith(Suite.class)
|
||||
@SuiteClasses({ TestXScanner1.class, TestXScanner2.class, TestXScanner3.class, TestXLL1Parser1.class, TestXLL1Parser2.class })
|
||||
public class TestXLL1Parser {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,256 @@
|
||||
/* **********************************************
|
||||
* Duale Hochschule Baden-Württemberg Karlsruhe
|
||||
* Prof. Dr. Jörn Eisenbiegler
|
||||
*
|
||||
* Vorlesung Übersetzerbau
|
||||
* Praxis LL(1)-Parser für X
|
||||
* - Testklasse Token
|
||||
*
|
||||
* **********************************************
|
||||
*/
|
||||
|
||||
package de.dhbw.compiler.xparser.test;
|
||||
|
||||
import org.junit.FixMethodOrder;
|
||||
import org.junit.Test;
|
||||
import org.junit.runners.MethodSorters;
|
||||
|
||||
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||
public class TestXLL1Parser1 extends ParseTreeTest {
|
||||
|
||||
@Test
|
||||
public void program00BeginEnd() throws Exception {
|
||||
String test = "program beginEnd;\n"+
|
||||
"begin\n"+
|
||||
"end.";
|
||||
String expected = "(program beginEnd DECLLIST STATLIST)";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void program01BeginEndMore() throws Exception {
|
||||
String test = "program beginEndMore;\n"+
|
||||
"begin\n"+
|
||||
"end. falsch";
|
||||
String expected = null;
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void program02BeginEnd2() throws Exception {
|
||||
String test = "program beginEnd2;\n"+
|
||||
"begin\n"+
|
||||
" begin\n"+
|
||||
" end;"+
|
||||
"end.";
|
||||
String expected = "(program beginEnd2 DECLLIST (STATLIST STATLIST))";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void program10Assign() throws Exception {
|
||||
String test = "program assign;\n"+
|
||||
" x: int;"+
|
||||
"begin\n"+
|
||||
" x :=0;"+
|
||||
"end.";
|
||||
String expected = "(program assign (DECLLIST (DECL x int)) (STATLIST (:= x 0)))";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void program11ExprPlus() throws Exception {
|
||||
String test = "program exprPlus;\n"+
|
||||
" x: int;"+
|
||||
"begin\n"+
|
||||
" x :=0+1;"+
|
||||
"end.";
|
||||
String expected = "(program exprPlus (DECLLIST (DECL x int)) (STATLIST (:= x (+ 0 1))))";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void program12ExprMinus() throws Exception {
|
||||
String test = "program exprMinus;\n"+
|
||||
" x: int;"+
|
||||
"begin\n"+
|
||||
" x :=0-1;"+
|
||||
"end.";
|
||||
String expected = "(program exprMinus (DECLLIST (DECL x int)) (STATLIST (:= x (- 0 1))))";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void program13ExprMul() throws Exception {
|
||||
String test = "program exprMul;\n"+
|
||||
" x: int;"+
|
||||
"begin\n"+
|
||||
" x :=0*1;"+
|
||||
"end.";
|
||||
String expected = "(program exprMul (DECLLIST (DECL x int)) (STATLIST (:= x (* 0 1))))";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void program14ExprDiv() throws Exception {
|
||||
String test = "program exprDiv;\n"+
|
||||
" x: int;"+
|
||||
"begin\n"+
|
||||
" x :=0/1;"+
|
||||
"end.";
|
||||
String expected = "(program exprDiv (DECLLIST (DECL x int)) (STATLIST (:= x (/ 0 1))))";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void program15ExprUMinus() throws Exception {
|
||||
String test = "program exprUMinus;\n"+
|
||||
" x: int;"+
|
||||
"begin\n"+
|
||||
" x :=0--1;"+
|
||||
"end.";
|
||||
String expected = "(program exprUMinus (DECLLIST (DECL x int)) (STATLIST (:= x (- 0 (- 1)))))";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void program16ExprPlusMinus() throws Exception {
|
||||
String test = "program exprPlus;\n"+
|
||||
" x: int;"+
|
||||
"begin\n"+
|
||||
" x :=0+1+-2-3+4;"+
|
||||
"end.";
|
||||
String expected = "(program exprPlus (DECLLIST (DECL x int)) "
|
||||
+ "(STATLIST (:= x (+ (- (+ (+ 0 1) (- 2)) 3) 4))))";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void program17ExprMulDiv() throws Exception {
|
||||
String test = "program exprMul;\n"+
|
||||
" x: int;"+
|
||||
"begin\n"+
|
||||
" x :=0*1/2*-3*4;"+
|
||||
"end.";
|
||||
String expected = "(program exprMul (DECLLIST (DECL x int)) "
|
||||
+ "(STATLIST (:= x (* (* (/ (* 0 1) 2) (- 3)) 4))))";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void program18ExprAll() throws Exception {
|
||||
String test = "program exprAll;\n"+
|
||||
" x: int;"+
|
||||
"begin\n"+
|
||||
" x :=0*1+2/-3*(4-5+6)*7;"+
|
||||
"end.";
|
||||
String expected = "(program exprAll (DECLLIST (DECL x int)) "
|
||||
+ "(STATLIST (:= x (+ (* 0 1) (* (* (/ 2 (- 3)) (+ (- 4 5) 6)) 7)))))";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void program19ExprVar() throws Exception {
|
||||
String test = "program exprAll;\n"+
|
||||
" x: int;"+
|
||||
" y: int;"+
|
||||
" z: int;"+
|
||||
"begin\n"+
|
||||
" x :=0*x+y;"+
|
||||
"end.";
|
||||
String expected = "(program exprAll (DECLLIST (DECL x int) (DECL y int) (DECL z int)) "
|
||||
+ "(STATLIST (:= x (+ (* 0 x) y))))";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void program20Cond() throws Exception {
|
||||
String test = "program cond;\n"+
|
||||
" x: int;"+
|
||||
"begin\n"+
|
||||
" if 2<3 then x:=1;"+
|
||||
"end.";
|
||||
String expected = "(program cond (DECLLIST (DECL x int)) (STATLIST (if (< 2 3) (:= x 1))))";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void program21CondElse() throws Exception {
|
||||
String test = "program condElse;\n"+
|
||||
" x: int;"+
|
||||
"begin\n"+
|
||||
" if 2>3 then x:=1 else x:=2;"+
|
||||
"end.";
|
||||
String expected = "(program condElse (DECLLIST (DECL x int)) (STATLIST (if (> 2 3) (:= x 1) (:= x 2))))";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void program22CondElse2() throws Exception {
|
||||
String test = "program condelse2;\n"+
|
||||
" x: int;"+
|
||||
"begin\n"+
|
||||
" if 2=3 then if 4<5 then x:=1 else x:=2 else x:=3;"+
|
||||
"end.";
|
||||
String expected = "(program condelse2 (DECLLIST (DECL x int)) "
|
||||
+ "(STATLIST (if (= 2 3) (if (< 4 5) (:= x 1) (:= x 2)) (:= x 3))))";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void program23CondElse3() throws Exception {
|
||||
String test = "program condelse3;\n"+
|
||||
" x: int;"+
|
||||
"begin\n"+
|
||||
" if 2<3 then if 4>5 then x:=1 else if 6=7 then x:=2 else x:=3;"+
|
||||
"end.";
|
||||
String expected = "(program condelse3 (DECLLIST (DECL x int)) "
|
||||
+ "(STATLIST (if (< 2 3) (if (> 4 5) (:= x 1) (if (= 6 7) (:= x 2) (:= x 3))))))";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void program24CondElse4() throws Exception {
|
||||
String test = "program condelse4;\n"+
|
||||
" x: int;"+
|
||||
"begin\n"+
|
||||
" if 2<3 then if 4>5 then x:=1 else x:=2 else if 6=7 then x:=3 else x:=4;"+
|
||||
"end.";
|
||||
String expected = "(program condelse4 (DECLLIST (DECL x int)) "
|
||||
+ "(STATLIST (if (< 2 3) (if (> 4 5) (:= x 1) (:= x 2)) (if (= 6 7) (:= x 3) (:= x 4)))))";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void program90Xmin1() throws Exception {
|
||||
String test = "program xmin1;\n"+
|
||||
" read x : int;\n"+
|
||||
" print y : int;\n"+
|
||||
"begin\n"+
|
||||
" y := 25+2*x-6*x;\n"+
|
||||
" if x<y then \n"+
|
||||
" begin\n" +
|
||||
" x:= -3/6*(y+2);\n"+
|
||||
" if y<x then y:=y+3 else y:=y+4;\n"+
|
||||
" end\n" +
|
||||
" else\n" +
|
||||
" begin\n" +
|
||||
" if y<x then y:=y+3;\n"+
|
||||
" x:= y*(y-x)/y;\n"+
|
||||
" end;\n" +
|
||||
" y := x*y;\n"+
|
||||
"end.";
|
||||
String expected = "(program xmin1 (DECLLIST (DECL x int read) (DECL y int print)) "
|
||||
+ "(STATLIST (:= y (- (+ 25 (* 2 x)) (* 6 x))) (if (< x y) "
|
||||
+ "(STATLIST (:= x (* (/ (- 3) 6) (+ y 2))) (if (< y x) (:= y (+ y 3)) (:= y (+ y 4)))) "
|
||||
+ "(STATLIST (if (< y x) (:= y (+ y 3))) (:= x (/ (* y (- y x)) y)))) (:= y (* x y))))";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,258 @@
|
||||
/* **********************************************
|
||||
* Duale Hochschule Baden-Württemberg Karlsruhe
|
||||
* Prof. Dr. Jörn Eisenbiegler
|
||||
*
|
||||
* Vorlesung Übersetzerbau
|
||||
* Praxis LL(1)-Parser für X
|
||||
* - Testklasse Token
|
||||
*
|
||||
* **********************************************
|
||||
*/
|
||||
|
||||
package de.dhbw.compiler.xparser.test;
|
||||
|
||||
import org.junit.FixMethodOrder;
|
||||
import org.junit.Test;
|
||||
import org.junit.runners.MethodSorters;
|
||||
|
||||
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||
public class TestXLL1Parser2 extends ParseTreeTest {
|
||||
|
||||
@Test
|
||||
public void program30Decl() throws Exception {
|
||||
String test = "program decl;\n"+
|
||||
" x: int;"+
|
||||
"begin\n"+
|
||||
"end.";
|
||||
String expected = "(program decl (DECLLIST (DECL x int)) STATLIST)";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void program31DeclRead() throws Exception {
|
||||
String test = "program declRead;\n"+
|
||||
" read x: int;"+
|
||||
"begin\n"+
|
||||
"end.";
|
||||
String expected = "(program declRead (DECLLIST (DECL x int read)) STATLIST)";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void program32DeclPrint() throws Exception {
|
||||
String test = "program declPrint;\n"+
|
||||
" print x: int;"+
|
||||
"begin\n"+
|
||||
"end.";
|
||||
String expected = "(program declPrint (DECLLIST (DECL x int print)) STATLIST)";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void program33DeclReadPrint() throws Exception {
|
||||
String test = "program declReadPrint;\n"+
|
||||
" read print x: int;"+
|
||||
"begin\n"+
|
||||
"end.";
|
||||
String expected = "(program declReadPrint (DECLLIST (DECL x int read print)) STATLIST)";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void program34DeclMult() throws Exception {
|
||||
String test = "program declMult;\n"+
|
||||
" read print a: int;"+
|
||||
" b: int;"+
|
||||
" read c: int;"+
|
||||
" print d: int;"+
|
||||
"begin\n"+
|
||||
"end.";
|
||||
String expected = "(program declMult (DECLLIST (DECL a int read print) (DECL b int) (DECL c int read) (DECL d int print)) "
|
||||
+ "STATLIST)";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void program35DeclFloatString() throws Exception {
|
||||
String test = "program decl;\n"+
|
||||
" x: float;"+
|
||||
" y: string;"+
|
||||
"begin\n"+
|
||||
"end.";
|
||||
String expected = "(program decl (DECLLIST (DECL x float) (DECL y string)) STATLIST)";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void program36DeclReadFloatString() throws Exception {
|
||||
String test = "program declRead;\n"+
|
||||
" read x: float;"+
|
||||
" read y: string;"+
|
||||
"begin\n"+
|
||||
"end.";
|
||||
String expected = "(program declRead (DECLLIST (DECL x float read) (DECL y string read)) STATLIST)";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void program37DeclPrintFloatString() throws Exception {
|
||||
String test = "program declRead;\n"+
|
||||
" print x: float;"+
|
||||
" print y: string;"+
|
||||
"begin\n"+
|
||||
"end.";
|
||||
String expected = "(program declRead (DECLLIST (DECL x float print) (DECL y string print)) STATLIST)";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void program38DeclReadPrintFloatString() throws Exception {
|
||||
String test = "program declRead;\n"+
|
||||
" read print x: float;"+
|
||||
" read print y: string;"+
|
||||
"begin\n"+
|
||||
"end.";
|
||||
String expected = "(program declRead (DECLLIST (DECL x float read print) (DECL y string read print)) STATLIST)";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void program40FloatAssign() throws Exception {
|
||||
String test = "program exprAll;\n"+
|
||||
" x: float;"+
|
||||
"begin\n"+
|
||||
" x :=1.23e-45;"+
|
||||
"end.";
|
||||
String expected = "(program exprAll (DECLLIST (DECL x float)) (STATLIST (:= x 1.23e-45)))";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void program41FloatExpr1() throws Exception {
|
||||
String test = "program exprAll;\n"+
|
||||
" x: float;"+
|
||||
"begin\n"+
|
||||
" x :=0.0*1.1+2/-3.4e-6*(4.4-5+6.5)*7.4;"+
|
||||
"end.";
|
||||
String expected = "(program exprAll (DECLLIST (DECL x float)) "
|
||||
+ "(STATLIST (:= x (+ (* 0.0 1.1) (* (* (/ 2 (- 3.4e-6)) (+ (- 4.4 5) 6.5)) 7.4)))))";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void program42FloatExpr2() throws Exception {
|
||||
String test = "program exprAll;\n"+
|
||||
" x: float;"+
|
||||
"begin\n"+
|
||||
" x :=0.0+-1.2--2.3*-4.5/-6.7;"+
|
||||
"end.";
|
||||
String expected = "(program exprAll (DECLLIST (DECL x float)) "
|
||||
+ "(STATLIST (:= x (- (+ 0.0 (- 1.2)) (/ (* (- 2.3) (- 4.5)) (- 6.7))))))";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void program43StringAssign() throws Exception {
|
||||
String test = "program exprAll;\n"+
|
||||
" x: string;"+
|
||||
"begin\n"+
|
||||
" x :=\"Hello\";"+
|
||||
"end.";
|
||||
String expected = "(program exprAll (DECLLIST (DECL x string)) (STATLIST (:= x \"Hello\")))";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void program44StringExpr1() throws Exception {
|
||||
String test = "program exprAll;\n"+
|
||||
" x: string;"+
|
||||
"begin\n"+
|
||||
" x := x + \"Hello\";"+
|
||||
"end.";
|
||||
String expected = "(program exprAll (DECLLIST (DECL x string)) (STATLIST (:= x (+ x \"Hello\"))))";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void program50LoopWhile1() throws Exception {
|
||||
String test = "program exprAll;\n"+
|
||||
" x: string;"+
|
||||
"begin\n"+
|
||||
" while (2<x) x:= x+1;"+
|
||||
"end.";
|
||||
String expected = "(program exprAll (DECLLIST (DECL x string)) (STATLIST (while (< 2 x) (:= x (+ x 1)))))";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void program51LoopWhile2() throws Exception {
|
||||
String test = "program exprAll;\n"+
|
||||
" x: string;"+
|
||||
"begin\n"+
|
||||
" while (2<x) begin "+
|
||||
" x:= x+1;"+
|
||||
" x:= x+1;"+
|
||||
" end;"+
|
||||
"end.";
|
||||
String expected = "(program exprAll (DECLLIST (DECL x string)) "
|
||||
+ "(STATLIST (while (< 2 x) (STATLIST (:= x (+ x 1)) (:= x (+ x 1))))))";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void program52LoopFor1() throws Exception {
|
||||
String test = "program exprAll;\n"+
|
||||
" x: string;"+
|
||||
" y: string;"+
|
||||
"begin\n"+
|
||||
" for (x:=1; x<10; x:=x+1) y:= y+1;"+
|
||||
"end.";
|
||||
String expected = "(program exprAll (DECLLIST (DECL x string) (DECL y string)) "
|
||||
+ "(STATLIST (for (:= x 1) (< x 10) (:= x (+ x 1)) (:= y (+ y 1)))))";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void program53LoopFor2() throws Exception {
|
||||
String test = "program exprAll;\n"+
|
||||
" x: string;"+
|
||||
" y: string;"+
|
||||
"begin\n"+
|
||||
" for (x:=1; x<10; x:=x+1) begin y:= y+1; end;"+
|
||||
"end.";
|
||||
String expected = "(program exprAll (DECLLIST (DECL x string) (DECL y string)) "
|
||||
+ "(STATLIST (for (:= x 1) (< x 10) (:= x (+ x 1)) (STATLIST (:= y (+ y 1))))))";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void program91BeispielFolien() throws Exception {
|
||||
String test = "program test5;\n"+
|
||||
" read x : int;\n"+
|
||||
" print y : float;\n"+
|
||||
" z : int;\n"+
|
||||
"begin\n"+
|
||||
" while (x<4) begin\n"+
|
||||
" for (z:=0; z<4; z:=z+1) x:=x+2;\n"+
|
||||
" if x=4 then begin\n"+
|
||||
" x:=z*(x+2);\n"+
|
||||
" x:=x+10;\n"+
|
||||
" end else y:=100.e-3;\n"+
|
||||
" end;\n"+
|
||||
"end.\n";
|
||||
String expected = "(program test5 (DECLLIST (DECL x int read) (DECL y float print) (DECL z int)) "
|
||||
+ "(STATLIST (while (< x 4) (STATLIST (for (:= z 0) (< z 4) (:= z (+ z 1)) (:= x (+ x 2))) (if (= x 4) "
|
||||
+ "(STATLIST (:= x (* z (+ x 2))) (:= x (+ x 10))) (:= y 100.e-3))))))";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,278 @@
|
||||
/* **********************************************
|
||||
* Duale Hochschule Baden-Württemberg Karlsruhe
|
||||
* Prof. Dr. Jörn Eisenbiegler
|
||||
*
|
||||
* Vorlesung Übersetzerbau
|
||||
* Praxis Xmin Abstiegsparser
|
||||
* - Testklasse Token
|
||||
*
|
||||
* **********************************************
|
||||
*/
|
||||
|
||||
package de.dhbw.compiler.xparser.test;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import de.dhbw.compiler.xparser.Token;
|
||||
|
||||
public class TestXScanner1 extends TokenStreamTest {
|
||||
|
||||
@Test
|
||||
public void tokenID() throws Exception {
|
||||
testTokenList(" a ", false, new Token(Token.ID,"a",1,3));
|
||||
testTokenList(" A ", false, new Token(Token.ID,"A",1,3));
|
||||
testTokenList(" x ", false, new Token(Token.ID,"x",1,3));
|
||||
testTokenList(" X ", false, new Token(Token.ID,"X",1,3));
|
||||
testTokenList(" X0 ", false, new Token(Token.ID,"X0",1,3));
|
||||
testTokenList(" a1 ", false, new Token(Token.ID,"a1",1,3));
|
||||
testTokenList(" abcdefghijklmnopqrstuvwxyz ", false, new Token(Token.ID,"abcdefghijklmnopqrstuvwxyz",1,3));
|
||||
testTokenList(" ABCDEFGHIJKLMNOPQRSTUVWXYZ ", false, new Token(Token.ID,"ABCDEFGHIJKLMNOPQRSTUVWXYZ",1,3));
|
||||
testTokenList(" NULL ", false, new Token(Token.ID,"NULL",1,3));
|
||||
testTokenList(" NulL ", false, new Token(Token.ID,"NulL",1,3));
|
||||
testTokenList(" null ", false, new Token(Token.ID,"null",1,3));
|
||||
testTokenList(" elsethen ", false, new Token(Token.ID,"elsethen",1,3));
|
||||
testTokenList(" beginner ", false, new Token(Token.ID,"beginner",1,3));
|
||||
testTokenList(" 0a1 ", false, new Token(Token.INTCONST,"0",1,3), new Token(Token.ID,"a1",1,4));
|
||||
testTokenList(" 9a8 ", false, new Token(Token.INTCONST,"9",1,3), new Token(Token.ID,"a8",1,4));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tokenIntConst1() throws Exception {
|
||||
testTokenList(" 0 ", false, new Token(Token.INTCONST,"0",1,3));
|
||||
testTokenList(" 9 ", false, new Token(Token.INTCONST,"9",1,3));
|
||||
testTokenList(" 1234567890 ", false, new Token(Token.INTCONST,"1234567890",1,3));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tokenIntConst2() throws Exception {
|
||||
testTokenList(" 00 ", true, new Token(Token.INTCONST,"0",1,3),
|
||||
new Token(Token.INTCONST,"0",1,4));
|
||||
testTokenList(" 004500 ", true, new Token(Token.INTCONST,"0",1,3),
|
||||
new Token(Token.INTCONST,"0",1,4),
|
||||
new Token(Token.INTCONST,"4500",1,5));
|
||||
testTokenList(" 078 ", true, new Token(Token.INTCONST,"0",1,3),
|
||||
new Token(Token.INTCONST,"78",1,4));
|
||||
testTokenList(" -0 ", true, new Token(Token.MINUS, "-", 1,3),
|
||||
new Token(Token.INTCONST,"0",1,4));
|
||||
testTokenList(" -1 ", true, new Token(Token.MINUS, "-", 1,3),
|
||||
new Token(Token.INTCONST,"1",1,4));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tokenFloatConst1() throws Exception {
|
||||
testTokenList(" 0. ", false, new Token(Token.FLOATCONST,"0.",1,3));
|
||||
testTokenList(" 1. ", false, new Token(Token.FLOATCONST,"1.",1,3));
|
||||
testTokenList(" 1.2 ", false, new Token(Token.FLOATCONST,"1.2",1,3));
|
||||
testTokenList(" 1.23 ", false, new Token(Token.FLOATCONST,"1.23",1,3));
|
||||
testTokenList(" 3.4e5 ", false, new Token(Token.FLOATCONST,"3.4e5",1,3));
|
||||
testTokenList(" 3.4e567 ", false, new Token(Token.FLOATCONST,"3.4e567",1,3));
|
||||
testTokenList(" 3.4e-5 ", false, new Token(Token.FLOATCONST,"3.4e-5",1,3));
|
||||
testTokenList(" 3.4e-567 ", false, new Token(Token.FLOATCONST,"3.4e-567",1,3));
|
||||
testTokenList(" 6.7E8 ", false, new Token(Token.FLOATCONST,"6.7E8",1,3));
|
||||
testTokenList(" 6.7E-8 ", false, new Token(Token.FLOATCONST,"6.7E-8",1,3));
|
||||
testTokenList(" 6.7E-890 ", false, new Token(Token.FLOATCONST,"6.7E-890",1,3));
|
||||
testTokenList(" 0.0e ", false,
|
||||
new Token(Token.FLOATCONST,"0.0",1,3),
|
||||
new Token(Token.ID,"e",1,6));
|
||||
testTokenList(" 0.0E ", false,
|
||||
new Token(Token.FLOATCONST,"0.0",1,3),
|
||||
new Token(Token.ID,"E",1,6));
|
||||
testTokenList(" 0.0e- ", false,
|
||||
new Token(Token.FLOATCONST,"0.0",1,3),
|
||||
new Token(Token.ID,"e",1,6),
|
||||
new Token(Token.MINUS,"-",1,7));
|
||||
testTokenList(" 0.0E- ", false,
|
||||
new Token(Token.FLOATCONST,"0.0",1,3),
|
||||
new Token(Token.ID,"E",1,6),
|
||||
new Token(Token.MINUS,"-",1,7));
|
||||
testTokenList(" 0.0-e ", false, new Token(Token.FLOATCONST,"0.0",1,3),
|
||||
new Token(Token.MINUS,"-",1,6),
|
||||
new Token(Token.ID,"e",1,7));
|
||||
testTokenList(" 0.03 ", false, new Token(Token.FLOATCONST,"0.03",1,3));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tokenFloatConst2() throws Exception {
|
||||
testTokenList(" -1. ", false, new Token(Token.MINUS, "-", 1,3),
|
||||
new Token(Token.FLOATCONST,"1.",1,4));
|
||||
testTokenList(" -1.2 ", false, new Token(Token.MINUS, "-", 1,3),
|
||||
new Token(Token.FLOATCONST,"1.2",1,4));
|
||||
testTokenList(" 3.4e05 ", false, new Token(Token.FLOATCONST,"3.4e0",1,3),
|
||||
new Token(Token.INTCONST,"5",1,8));
|
||||
testTokenList(" 06.7e8 ", false, new Token(Token.INTCONST,"0",1,3),
|
||||
new Token(Token.FLOATCONST,"6.7e8",1,4));
|
||||
testTokenList(" 9.01e-05. ", false, new Token(Token.FLOATCONST,"9.01e-0",1,3),
|
||||
new Token(Token.FLOATCONST,"5.",1,10));
|
||||
testTokenList(" 6.07E089 ", false, new Token(Token.FLOATCONST,"6.07E0",1,3),
|
||||
new Token(Token.INTCONST,"89",1,9));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tokenStringConst() throws Exception {
|
||||
testTokenList(" \"a\" ", false, new Token(Token.STRINGCONST,"\"a\"",1,3));
|
||||
testTokenList(" \"\" ", false, new Token(Token.STRINGCONST,"\"\"",1,3));
|
||||
testTokenList(" \"abcdefghijklmnopqrstuvwxyz\" ", false,
|
||||
new Token(Token.STRINGCONST,"\"abcdefghijklmnopqrstuvwxyz\"",1,3));
|
||||
testTokenList(" \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\" ", false,
|
||||
new Token(Token.STRINGCONST,"\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"",1,3));
|
||||
testTokenList(" \"\\\".: abcd\"", false,
|
||||
new Token(Token.STRINGCONST,"\"\\\".: abcd\"",1,3));
|
||||
testTokenList(" \"+\" ", false, new Token(Token.INVALID,"\"+",1,3),
|
||||
new Token(Token.INVALID,"\" ",1,5));
|
||||
testTokenList(" \";\" ", false, new Token(Token.INVALID,"\";",1,3),
|
||||
new Token(Token.INVALID,"\" ",1,5));
|
||||
testTokenList(" \"?\" ", false, new Token(Token.INVALID,"\"?",1,3),
|
||||
new Token(Token.INVALID,"\" ",1,5));
|
||||
testTokenList(" \"\\\" ", false, new Token(Token.INVALID,"\"\\\" ",1,3));
|
||||
testTokenList(" \"abcd ", false, new Token(Token.INVALID,"\"abcd ",1,3));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tokenLBR() throws Exception {
|
||||
testTokenList(" ( ", false, new Token(Token.LBR,"(",1,3));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tokenRBR() throws Exception {
|
||||
testTokenList(" ) ", false, new Token(Token.RBR,")",1,3));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tokenMULT() throws Exception {
|
||||
testTokenList(" * ", false, new Token(Token.MULT,"*",1,3));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tokenPLUS() throws Exception {
|
||||
testTokenList(" + ", false, new Token(Token.PLUS,"+",1,3));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tokenMINUS() throws Exception {
|
||||
testTokenList(" - ", false, new Token(Token.MINUS,"-",1,3));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tokenDOT() throws Exception {
|
||||
testTokenList(" . ", false, new Token(Token.DOT,".",1,3));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tokenDIV() throws Exception {
|
||||
testTokenList(" / ", false, new Token(Token.DIV,"/",1,3));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tokenCOLON() throws Exception {
|
||||
testTokenList(" : ", false, new Token(Token.COLON,":",1,3));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tokenASSIGN() throws Exception {
|
||||
testTokenList(" := ", false, new Token(Token.ASSIGN,":=",1,3));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tokenSEMICOLON() throws Exception {
|
||||
testTokenList(" ; ", false, new Token(Token.SEMICOLON,";",1,3));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tokenLESS() throws Exception {
|
||||
testTokenList(" < ", false, new Token(Token.LESS,"<",1,3));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tokenEQUALS() throws Exception {
|
||||
testTokenList(" = ", false, new Token(Token.EQUALS,"=",1,3));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tokenMORE() throws Exception {
|
||||
testTokenList(" > ", false, new Token(Token.MORE,">",1,3));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tokenBEGIN() throws Exception {
|
||||
testTokenList(" begin ", false, new Token(Token.BEGIN,"begin",1,3));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tokenELS() throws Exception {
|
||||
testTokenList(" else ", false, new Token(Token.ELSE,"else",1,3));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tokenEND() throws Exception {
|
||||
testTokenList(" end ", false, new Token(Token.END,"end",1,3));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tokenFLOAT() throws Exception {
|
||||
testTokenList(" float ", false, new Token(Token.FLOAT,"float",1,3));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tokenFOR() throws Exception {
|
||||
testTokenList(" for ", false, new Token(Token.FOR,"for",1,3));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tokenIF() throws Exception {
|
||||
testTokenList(" if ", false, new Token(Token.IF,"if",1,3));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tokenINT() throws Exception {
|
||||
testTokenList(" int ", false, new Token(Token.INT,"int",1,3));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tokenPRINT() throws Exception {
|
||||
testTokenList(" print ", false, new Token(Token.PRINT,"print",1,3));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tokenPROGRAM() throws Exception {
|
||||
testTokenList(" program ", false, new Token(Token.PROGRAM,"program",1,3));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tokenREAD() throws Exception {
|
||||
testTokenList(" read ", false, new Token(Token.READ,"read",1,3));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tokenSTRING() throws Exception {
|
||||
testTokenList(" string ", false, new Token(Token.STRING,"string",1,3));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tokenTHEN() throws Exception {
|
||||
testTokenList(" then ", false, new Token(Token.THEN,"then",1,3));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tokenWHILE() throws Exception {
|
||||
testTokenList(" while ", false, new Token(Token.WHILE,"while",1,3));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tokenEOF() throws Exception {
|
||||
testTokenList(" ", false);
|
||||
testTokenList(" ", false, new Token(Token.EOF,"",1,2));
|
||||
testTokenList("", false, new Token(Token.EOF,"",1,1));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void invalidÄ() throws Exception {
|
||||
testTokenList(" ä ", false, new Token(Token.INVALID,"ä",1,2));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void invalidGatter() throws Exception {
|
||||
testTokenList(" # ", false, new Token(Token.INVALID,"#",1,2));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
/* **********************************************
|
||||
* Duale Hochschule Baden-Württemberg Karlsruhe
|
||||
* Prof. Dr. Jörn Eisenbiegler
|
||||
*
|
||||
* Vorlesung Übersetzerbau
|
||||
* Praxis LL(1)-Parser für X
|
||||
* - Testklasse Typkonvertierung
|
||||
*
|
||||
* **********************************************
|
||||
*/
|
||||
|
||||
package de.dhbw.compiler.xparser.test;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import de.dhbw.compiler.xparser.Token;
|
||||
|
||||
public class TestXScanner2 extends TokenStreamTest {
|
||||
|
||||
@Test
|
||||
public void tokenIntConst() throws Exception {
|
||||
testTokenList(" 0 ", true, new Token(Token.INTCONST,"0",1,3));
|
||||
testTokenList(" 1 ", true, new Token(Token.INTCONST,"1",1,3));
|
||||
testTokenList(" 12 ", true, new Token(Token.INTCONST,"12",1,3));
|
||||
testTokenList(" 123 ", true, new Token(Token.INTCONST,"123",1,3));
|
||||
testTokenList(" 1234567890 ", true, new Token(Token.INTCONST,"1234567890",1,3));
|
||||
testTokenList(" 78 ", true, new Token(Token.INTCONST,"78",1,3));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tokenFloatConst0() throws Exception {
|
||||
testTokenList(" 0. ", true, new Token(Token.FLOATCONST,"0.",1,3));
|
||||
testTokenList(" 0.0 ", true, new Token(Token.FLOATCONST,"0.0",1,3));
|
||||
testTokenList(" 0.0e0 ", true, new Token(Token.FLOATCONST,"0.0e0",1,3));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tokenFloatConst1() throws Exception {
|
||||
testTokenList(" 1. ", true, new Token(Token.FLOATCONST,"1.",1,3));
|
||||
testTokenList(" 1.1 ", true, new Token(Token.FLOATCONST,"1.1",1,3));
|
||||
testTokenList(" 1.1e1 ", true, new Token(Token.FLOATCONST,"1.1e1",1,3));
|
||||
testTokenList(" 1e1 ", true, new Token(Token.FLOATCONST,"1e1",1,3));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tokenFloatConst123() throws Exception {
|
||||
testTokenList(" 0.12e34 ", true, new Token(Token.FLOATCONST,"0.12e34",1,3));
|
||||
testTokenList(" 0.045e23 ", true, new Token(Token.FLOATCONST,"0.045e23",1,3));
|
||||
testTokenList(" 123.4560e7890 ", true, new Token(Token.FLOATCONST,"123.4560e7890",1,3));
|
||||
testTokenList(" 0.12E34 ", true, new Token(Token.FLOATCONST,"0.12E34",1,3));
|
||||
testTokenList(" 0.045E23 ", true, new Token(Token.FLOATCONST,"0.045E23",1,3));
|
||||
testTokenList(" 123.4560E7890 ", true, new Token(Token.FLOATCONST,"123.4560E7890",1,3));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tokenStringConst() throws Exception {
|
||||
testTokenList(" \"hallo .: \" ", true, new Token(Token.STRINGCONST,"\"hallo .: \"",1,3));
|
||||
testTokenList(" \" \\\" \" ", true, new Token(Token.STRINGCONST,"\" \\\" \"",1,3));
|
||||
testTokenList(" \"hallo , \" ", true,
|
||||
new Token(Token.INVALID,"\"hallo ,",1,3),
|
||||
new Token(Token.INVALID,"\" ",1,12));
|
||||
testTokenList(" \",\"", true,
|
||||
new Token(Token.INVALID,"\",",1,3),
|
||||
new Token(Token.INVALID,"\"",1,5));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,112 @@
|
||||
/* **********************************************
|
||||
* Duale Hochschule Baden-Württemberg Karlsruhe
|
||||
* Prof. Dr. Jörn Eisenbiegler
|
||||
*
|
||||
* Vorlesung Übersetzerbau
|
||||
* Praxis LL(1)-Parser für X
|
||||
* - Testklasse Programme
|
||||
*
|
||||
* **********************************************
|
||||
*/
|
||||
|
||||
package de.dhbw.compiler.xparser.test;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import de.dhbw.compiler.xparser.Token;
|
||||
|
||||
public class TestXScanner3 extends TokenStreamTest {
|
||||
|
||||
@Test
|
||||
public void program1() throws Exception {
|
||||
testTokenList("program test1;\nbegin\nend.",false,
|
||||
new Token(Token.PROGRAM,"program",1,1),
|
||||
new Token(Token.ID,"test1",1,9),
|
||||
new Token(Token.SEMICOLON,";",1,14),
|
||||
new Token(Token.BEGIN,"begin",2,1),
|
||||
new Token(Token.END,"end",3,1),
|
||||
new Token(Token.DOT,".",3,4));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void program2() throws Exception {
|
||||
testTokenList( "program test2;\n"+
|
||||
" x : int;\n"+
|
||||
" y : float;\n"+
|
||||
" z : string;\n"+
|
||||
"begin\n"+
|
||||
" x := 4+5+6.2;\n"+
|
||||
" y := 3.56+1.2e3+45.e-67+4e34+3E-1;\n"+
|
||||
" z := \"Hello \\\"World\\\"\" + \":\";\n"+
|
||||
" z := \"Peter\" + 4;\n"+
|
||||
" a := 3+4;\n"+
|
||||
"end.", false,
|
||||
// program test2;
|
||||
new Token(Token.PROGRAM,"program",1,1),
|
||||
new Token(Token.ID,"test2",1,9),
|
||||
new Token(Token.SEMICOLON,";",1,14),
|
||||
// x : int;
|
||||
new Token(Token.ID,"x",2,2),
|
||||
new Token(Token.COLON,":",2,4),
|
||||
new Token(Token.INT,"int",2,6),
|
||||
new Token(Token.SEMICOLON,";",2,9),
|
||||
// y : float;
|
||||
new Token(Token.ID,"y",3,2),
|
||||
new Token(Token.COLON,":",3,4),
|
||||
new Token(Token.FLOAT,"float",3,6),
|
||||
new Token(Token.SEMICOLON,";",3,11),
|
||||
// z : string;
|
||||
new Token(Token.ID,"z",4,2),
|
||||
new Token(Token.COLON,":",4,4),
|
||||
new Token(Token.STRING,"string",4,6),
|
||||
new Token(Token.SEMICOLON,";",4,12),
|
||||
// begin
|
||||
new Token(Token.BEGIN,"begin",5,1),
|
||||
// x := 4+5+6.2;
|
||||
new Token(Token.ID,"x",6,2),
|
||||
new Token(Token.ASSIGN,":=",6,4),
|
||||
new Token(Token.INTCONST,"4",6,7),
|
||||
new Token(Token.PLUS,"+",6,8),
|
||||
new Token(Token.INTCONST,"5",6,9),
|
||||
new Token(Token.PLUS,"+",6,10),
|
||||
new Token(Token.FLOATCONST,"6.2",6,11),
|
||||
new Token(Token.SEMICOLON,";",6,14),
|
||||
// y := 3.56+1.2e3+45.e-67+4e34+3E-1;
|
||||
new Token(Token.ID,"y",7,2),
|
||||
new Token(Token.ASSIGN,":=",7,4),
|
||||
new Token(Token.FLOATCONST,"3.56",7,7),
|
||||
new Token(Token.PLUS,"+",7,11),
|
||||
new Token(Token.FLOATCONST,"1.2e3",7,12),
|
||||
new Token(Token.PLUS,"+",7,17),
|
||||
new Token(Token.FLOATCONST,"45.e-67",7,18),
|
||||
new Token(Token.PLUS,"+",7,25),
|
||||
new Token(Token.FLOATCONST,"4e34",7,26),
|
||||
new Token(Token.PLUS,"+",7,30),
|
||||
new Token(Token.FLOATCONST,"3E-1",7,31),
|
||||
new Token(Token.SEMICOLON,";",7,35),
|
||||
// z := \"Hello \\\"World\\\"\" + \":\";
|
||||
new Token(Token.ID,"z",8,2),
|
||||
new Token(Token.ASSIGN,":=",8,4),
|
||||
new Token(Token.STRINGCONST,"\"Hello \\\"World\\\"\"",8,7),
|
||||
new Token(Token.PLUS,"+",8,25),
|
||||
new Token(Token.STRINGCONST,"\":\"",8,27),
|
||||
new Token(Token.SEMICOLON,";",8,30),
|
||||
// z := \"Peter\" + 4;
|
||||
new Token(Token.ID,"z",9,2),
|
||||
new Token(Token.ASSIGN,":=",9,4),
|
||||
new Token(Token.STRINGCONST,"\"Peter\"",9,7),
|
||||
new Token(Token.PLUS,"+",9,15),
|
||||
new Token(Token.INTCONST,"4",9,17),
|
||||
new Token(Token.SEMICOLON,";",9,18),
|
||||
// a := 3+4;
|
||||
new Token(Token.ID,"a",10,2),
|
||||
new Token(Token.ASSIGN,":=",10,4),
|
||||
new Token(Token.INTCONST,"3",10,7),
|
||||
new Token(Token.PLUS,"+",10,8),
|
||||
new Token(Token.INTCONST,"4",10,9),
|
||||
new Token(Token.SEMICOLON,";",10,10),
|
||||
// end.
|
||||
new Token(Token.END,"end",11,1),
|
||||
new Token(Token.DOT,".",11,4));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
/* **********************************************
|
||||
* Duale Hochschule Baden-Württemberg Karlsruhe
|
||||
* Prof. Dr. Jörn Eisenbiegler
|
||||
*
|
||||
* Vorlesung Übersetzerbau
|
||||
* Praxis LL(1)-Parser für X
|
||||
* - Testfall-Utility für Scanner
|
||||
*
|
||||
* **********************************************
|
||||
*/
|
||||
|
||||
|
||||
package de.dhbw.compiler.xparser.test;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
import java.io.StringReader;
|
||||
|
||||
import de.dhbw.compiler.xparser.FloatConstToken;
|
||||
import de.dhbw.compiler.xparser.IntConstToken;
|
||||
import de.dhbw.compiler.xparser.JFlexXScanner;
|
||||
import de.dhbw.compiler.xparser.StringConstToken;
|
||||
import de.dhbw.compiler.xparser.Token;
|
||||
|
||||
public abstract class TokenStreamTest {
|
||||
|
||||
protected void testTokenList(String in, boolean convert, Token... TokenList) throws Exception {
|
||||
JFlexXScanner scanner = new JFlexXScanner(new StringReader(in));
|
||||
Token myToken;
|
||||
|
||||
for (Token expected : TokenList) {
|
||||
myToken = scanner.nextToken();
|
||||
assertEquals("Expect Token "+expected.toString()+". Error in type.",
|
||||
expected.getType(), myToken.getType());
|
||||
assertEquals("Expect Token "+expected.toString()+". Error in text.",
|
||||
expected.getText(), myToken.getText());
|
||||
assertEquals("Expect Token "+expected.toString()+". Error in line.",
|
||||
expected.getLine(), myToken.getLine());
|
||||
assertEquals("Expect Token "+expected.toString()+". Error in column.",
|
||||
expected.getColumn(), myToken.getColumn());
|
||||
if (convert) {
|
||||
switch (myToken.getType()) {
|
||||
case Token.INTCONST:
|
||||
int intValue = Integer.parseInt(expected.getText());
|
||||
assertEquals("Expected Token value "+intValue,
|
||||
intValue,((IntConstToken)myToken).getValue());
|
||||
break;
|
||||
case Token.FLOATCONST:
|
||||
double doubleValue = Double.parseDouble(expected.getText().replace("^", "e"));
|
||||
assertEquals("Expected Token value "+doubleValue,
|
||||
doubleValue,((FloatConstToken)myToken).getValue(), doubleValue*0.0000001);
|
||||
break;
|
||||
case Token.STRINGCONST:
|
||||
String stringValue = expected.getText().substring(1, expected.getText().length()-1).replace("\\\"", "\"");
|
||||
assertEquals("Expected Token value "+stringValue,
|
||||
stringValue,((StringConstToken)myToken).getValue());
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
myToken = scanner.nextToken();
|
||||
assertEquals("Expected End of File (EOF), read " + myToken.toString() + ".", Token.EOF, myToken.getType());
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user