[06 - Top Down Parser] Add ÜB-Praxis-Abstiegsparser für X-Leer
This commit is contained in:
7
ÜB-Praxis-Abstiegsparser für X-Leer/.classpath
Normal file
7
ÜB-Praxis-Abstiegsparser für X-Leer/.classpath
Normal file
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry excluding="**/*.cup|**/*.lex" kind="src" path="src"/>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
|
||||
<classpathentry kind="output" path="bin"/>
|
||||
</classpath>
|
||||
@@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<launchConfiguration type="org.eclipse.ant.AntBuilderLaunchConfigurationType">
|
||||
<booleanAttribute key="org.eclipse.ant.ui.ATTR_TARGETS_UPDATED" value="true"/>
|
||||
<booleanAttribute key="org.eclipse.ant.ui.DEFAULT_VM_INSTALL" value="false"/>
|
||||
<stringAttribute key="org.eclipse.debug.core.ATTR_REFRESH_SCOPE" value="${container}"/>
|
||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS"/>
|
||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES"/>
|
||||
<booleanAttribute key="org.eclipse.debug.ui.ATTR_LAUNCH_IN_BACKGROUND" value="false"/>
|
||||
<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="org.eclipse.ant.ui.AntClasspathProvider"/>
|
||||
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="ÜB-Praxis-JFlex Scanner für AS 3"/>
|
||||
<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.ant.ui.AntClasspathProvider"/>
|
||||
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LAUNCH_CONFIGURATION_BUILD_SCOPE" value="${project}"/>
|
||||
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="${workspace_loc}${project_path}\lib\jflexant.xml"/>
|
||||
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_RUN_BUILD_KINDS" value="full,incremental,auto,clean"/>
|
||||
<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_TRIGGERS_CONFIGURED" value="true"/>
|
||||
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${workspace_loc}${project_path}"/>
|
||||
<stringAttribute key="process_factory_id" value="org.eclipse.ant.ui.remoteAntProcessFactory"/>
|
||||
</launchConfiguration>
|
||||
8
ÜB-Praxis-Abstiegsparser für X-Leer/.idea/.gitignore
generated
vendored
Normal file
8
ÜB-Praxis-Abstiegsparser für X-Leer/.idea/.gitignore
generated
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
# Datasource local storage ignored files
|
||||
/dataSources/
|
||||
/dataSources.local.xml
|
||||
# Editor-based HTTP Client requests
|
||||
/httpRequests/
|
||||
6
ÜB-Praxis-Abstiegsparser für X-Leer/.idea/misc.xml
generated
Normal file
6
ÜB-Praxis-Abstiegsparser für X-Leer/.idea/misc.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8.0_181" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/out" />
|
||||
</component>
|
||||
</project>
|
||||
8
ÜB-Praxis-Abstiegsparser für X-Leer/.idea/modules.xml
generated
Normal file
8
ÜB-Praxis-Abstiegsparser für X-Leer/.idea/modules.xml
generated
Normal file
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/ÜB-Praxis-Abstiegsparser für X-Leer.iml" filepath="$PROJECT_DIR$/ÜB-Praxis-Abstiegsparser für X-Leer.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
||||
6
ÜB-Praxis-Abstiegsparser für X-Leer/.idea/vcs.xml
generated
Normal file
6
ÜB-Praxis-Abstiegsparser für X-Leer/.idea/vcs.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
|
||||
</component>
|
||||
</project>
|
||||
33
ÜB-Praxis-Abstiegsparser für X-Leer/.project
Normal file
33
ÜB-Praxis-Abstiegsparser für X-Leer/.project
Normal file
@@ -0,0 +1,33 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>ÜB-Praxis-Abstiegsparser für X-Leer</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.ui.externaltools.ExternalToolBuilder</name>
|
||||
<arguments>
|
||||
<dictionary>
|
||||
<key>LaunchConfigHandle</key>
|
||||
<value><project>/.externalToolBuilders/JFlex Ant AS [Builder].launch</value>
|
||||
</dictionary>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>pi.eclipse.cle.CupLexNature</nature>
|
||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||
<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
||||
@@ -0,0 +1,11 @@
|
||||
eclipse.preferences.version=1
|
||||
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
|
||||
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
|
||||
org.eclipse.jdt.core.compiler.compliance=1.7
|
||||
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
|
||||
org.eclipse.jdt.core.compiler.debug.localVariable=generate
|
||||
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
|
||||
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
||||
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
||||
org.eclipse.jdt.core.compiler.source=1.7
|
||||
@@ -0,0 +1,5 @@
|
||||
//src/de/dhbw/compiler/JFlexASScanner/JFlexASScanner.lex/lex-code-method=0
|
||||
//src/de/dhbw/compiler/JFlexASScanner/JFlexASScanner.lex/lex-comply-jlex=false
|
||||
//src/de/dhbw/compiler/JFlexASScanner/JFlexASScanner.lex/lex-output=src
|
||||
//src/de/dhbw/compiler/JFlexASScanner/JFlexASScanner.lex/lex-skip-min=false
|
||||
eclipse.preferences.version=1
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -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-Abstiegsparser 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
ÜB-Praxis-Abstiegsparser für X-Leer/lib/jflex-1.6.1.jar
Normal file
BIN
ÜB-Praxis-Abstiegsparser für X-Leer/lib/jflex-1.6.1.jar
Normal file
Binary file not shown.
13
ÜB-Praxis-Abstiegsparser für X-Leer/lib/jflexant.xml
Normal file
13
ÜB-Praxis-Abstiegsparser 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 X Abstiegsparser
|
||||
* - 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 X Abstiegsparser
|
||||
* - 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-Abstiegsparser 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,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-Abstiegsparser 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,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 X Abstiegsparser
|
||||
* - 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,168 @@
|
||||
/* **********************************************
|
||||
* Duale Hochschule Baden-Württemberg Karlsruhe
|
||||
* Prof. Dr. Jörn Eisenbiegler
|
||||
*
|
||||
* Vorlesung Übersetzerbau
|
||||
* Praxis AST 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 "UMINUS";
|
||||
default: return "Unknown token type!";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
/* **********************************************
|
||||
* Duale Hochschule Baden-Württemberg Karlsruhe
|
||||
* Prof. Dr. Jörn Eisenbiegler
|
||||
*
|
||||
* Vorlesung Übersetzerbau
|
||||
* Praxis X Abstiegsparser
|
||||
*
|
||||
* **********************************************
|
||||
*/
|
||||
|
||||
package de.dhbw.compiler.xparser;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class TokenReader {
|
||||
|
||||
private ArrayList<Token> list = new ArrayList<Token>();
|
||||
private int tokenindex = 0;
|
||||
|
||||
public TokenReader(JFlexXScanner s) throws IOException {
|
||||
Token mytoken;
|
||||
do {
|
||||
mytoken = s.nextToken();
|
||||
list.add(mytoken);
|
||||
} while(mytoken.getType()!=Token.EOF);
|
||||
}
|
||||
|
||||
public Token nextToken() {
|
||||
return list.get(tokenindex++);
|
||||
}
|
||||
|
||||
public int getPosition() {
|
||||
return tokenindex;
|
||||
}
|
||||
|
||||
public void setPosition(int position) {
|
||||
tokenindex = position;
|
||||
}
|
||||
|
||||
public int getTokenCount() {
|
||||
return list.size();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,97 @@
|
||||
/* **********************************************
|
||||
* Duale Hochschule Baden-Württemberg Karlsruhe
|
||||
* Prof. Dr. Jörn Eisenbiegler
|
||||
*
|
||||
* Vorlesung Übersetzerbau
|
||||
* Praxis X Abstiegsparser
|
||||
* - 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,26 @@
|
||||
/* **********************************************
|
||||
* Duale Hochschule Baden-Württemberg Karlsruhe
|
||||
* Prof. Dr. Jörn Eisenbiegler
|
||||
*
|
||||
* Vorlesung Übersetzerbau
|
||||
* Praxis X Abstiegsparser
|
||||
* - Abstiegsparser
|
||||
*
|
||||
* **********************************************
|
||||
*/
|
||||
|
||||
package de.dhbw.compiler.xparser;
|
||||
|
||||
public class XParser {
|
||||
|
||||
|
||||
public XParser(TokenReader in) {
|
||||
//TODO Initialization
|
||||
}
|
||||
|
||||
public Tree parseProgram() {
|
||||
//TODO Parser
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
/* **********************************************
|
||||
* Duale Hochschule Baden-Württemberg Karlsruhe
|
||||
* Prof. Dr. Jörn Eisenbiegler
|
||||
*
|
||||
* Vorlesung Übersetzerbau
|
||||
* Praxis X Abstiegsparser
|
||||
*
|
||||
* **********************************************
|
||||
*/
|
||||
|
||||
package de.dhbw.compiler.xparser;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
import java.io.StringReader;
|
||||
|
||||
|
||||
|
||||
public class XParserMain {
|
||||
|
||||
private static final String TESTMIN = "program beginend;\n"+
|
||||
"begin\n"+
|
||||
"end.";
|
||||
|
||||
private static final String TESTXmin1 =
|
||||
"program xmin1;\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 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 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 X Abstiegsparser
|
||||
* - Testfall-Utility für Parser
|
||||
*
|
||||
* **********************************************
|
||||
*/
|
||||
|
||||
|
||||
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.TokenReader;
|
||||
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));
|
||||
TokenReader reader = new TokenReader(scanner);
|
||||
XParser parser = new XParser(reader);
|
||||
|
||||
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, TestXASTParser1.class, TestXASTParser2.class })
|
||||
public class TestXASTParser {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,256 @@
|
||||
/* **********************************************
|
||||
* Duale Hochschule Baden-Württemberg Karlsruhe
|
||||
* Prof. Dr. Jörn Eisenbiegler
|
||||
*
|
||||
* Vorlesung Übersetzerbau
|
||||
* Praxis AST 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 TestXASTParser1 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 AST 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 TestXASTParser2 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 X Abstiegsparser
|
||||
* - 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 X Abstiegsparser
|
||||
* - 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,21 @@
|
||||
/* **********************************************
|
||||
* Duale Hochschule Baden-Württemberg Karlsruhe
|
||||
* Prof. Dr. Jörn Eisenbiegler
|
||||
*
|
||||
* Vorlesung Übersetzerbau
|
||||
* Praxis X Abstiegsparser
|
||||
* - Testsuite für X
|
||||
*
|
||||
* **********************************************
|
||||
*/
|
||||
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, TestXTopDownParser1.class, TestXTopDownParser2.class })
|
||||
public class TestXTopDownParser {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,317 @@
|
||||
/* **********************************************
|
||||
* Duale Hochschule Baden-Württemberg Karlsruhe
|
||||
* Prof. Dr. Jörn Eisenbiegler
|
||||
*
|
||||
* Vorlesung Übersetzerbau
|
||||
* Praxis X Abstiegsparser
|
||||
* - Testklasse Syntax für Xmin-Anteil
|
||||
*
|
||||
* **********************************************
|
||||
*/
|
||||
|
||||
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 TestXTopDownParser1 extends ParseTreeTest {
|
||||
|
||||
@Test
|
||||
public void program00BeginEnd() throws Exception {
|
||||
String test = "program beginEnd;\n"+
|
||||
"begin\n"+
|
||||
"end.";
|
||||
String expected = "(APROGRAM program beginEnd ; DECLLIST (BLOCK begin STATLIST end) . )";
|
||||
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 = "(APROGRAM program beginEnd2 ; DECLLIST (BLOCK begin (STATLIST "+
|
||||
"(STATWITHSEMI (STAT (BLOCK begin STATLIST end)) ;)) end) . )";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void program10Assign() throws Exception {
|
||||
String test = "program assign;\n"+
|
||||
" x: int;"+
|
||||
"begin\n"+
|
||||
" x :=0;"+
|
||||
"end.";
|
||||
String expected = "(APROGRAM program assign ; (DECLLIST (DECL MODIFIER x : (TYPE int) ;))"+
|
||||
" (BLOCK begin (STATLIST (STATWITHSEMI (STAT (ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 0))))) ;)) end) . )";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void program11ExprPlus() throws Exception {
|
||||
String test = "program exprPlus;\n"+
|
||||
" x: int;"+
|
||||
"begin\n"+
|
||||
" x :=0+1;"+
|
||||
"end.";
|
||||
String expected = "(APROGRAM program exprPlus ; (DECLLIST (DECL MODIFIER x : (TYPE int) ;))"+
|
||||
" (BLOCK begin (STATLIST (STATWITHSEMI (STAT "+
|
||||
"(ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 0)) + (EXPR (EXPR2 (EXPR3 1)))))) ;)) end) . )";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void program12ExprMinus() throws Exception {
|
||||
String test = "program exprMinus;\n"+
|
||||
" x: int;"+
|
||||
"begin\n"+
|
||||
" x :=0-1;"+
|
||||
"end.";
|
||||
String expected = "(APROGRAM program exprMinus ; (DECLLIST (DECL MODIFIER x : (TYPE int) ;))"+
|
||||
" (BLOCK begin (STATLIST (STATWITHSEMI (STAT "+
|
||||
"(ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 0)) - (EXPR (EXPR2 (EXPR3 1)))))) ;)) end) . )";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void program13ExprMul() throws Exception {
|
||||
String test = "program exprMul;\n"+
|
||||
" x: int;"+
|
||||
"begin\n"+
|
||||
" x :=0*1;"+
|
||||
"end.";
|
||||
String expected = "(APROGRAM program exprMul ; (DECLLIST (DECL MODIFIER x : (TYPE int) ;))"+
|
||||
" (BLOCK begin (STATLIST (STATWITHSEMI (STAT "+
|
||||
"(ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 0) * (EXPR2 (EXPR3 1)))))) ;)) end) . )";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void program14ExprDiv() throws Exception {
|
||||
String test = "program exprDiv;\n"+
|
||||
" x: int;"+
|
||||
"begin\n"+
|
||||
" x :=0/1;"+
|
||||
"end.";
|
||||
String expected = "(APROGRAM program exprDiv ; (DECLLIST (DECL MODIFIER x : (TYPE int) ;))"+
|
||||
" (BLOCK begin (STATLIST (STATWITHSEMI (STAT "+
|
||||
"(ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 0) / (EXPR2 (EXPR3 1)))))) ;)) end) . )";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void program15ExprUMinus() throws Exception {
|
||||
String test = "program exprUMinus;\n"+
|
||||
" x: int;"+
|
||||
"begin\n"+
|
||||
" x :=0--1;"+
|
||||
"end.";
|
||||
String expected = "(APROGRAM program exprUMinus ; (DECLLIST (DECL MODIFIER x : (TYPE int) ;))"+
|
||||
" (BLOCK begin (STATLIST (STATWITHSEMI (STAT "+
|
||||
"(ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 0)) - (EXPR (EXPR2 (EXPR3 - 1)))))) ;)) end) . )";
|
||||
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 = "(APROGRAM program exprPlus ; (DECLLIST (DECL MODIFIER x : (TYPE int) ;))"+
|
||||
" (BLOCK begin (STATLIST (STATWITHSEMI (STAT "+
|
||||
"(ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 0)) + (EXPR (EXPR2 (EXPR3 1)) + "+
|
||||
"(EXPR (EXPR2 (EXPR3 - 2)) - (EXPR (EXPR2 (EXPR3 3)) + (EXPR (EXPR2 (EXPR3 4))))))))) ;)) end) . )";
|
||||
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 = "(APROGRAM program exprMul ; (DECLLIST (DECL MODIFIER x : (TYPE int) ;))"+
|
||||
" (BLOCK begin (STATLIST (STATWITHSEMI (STAT "+
|
||||
"(ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 0) * (EXPR2 (EXPR3 1) / (EXPR2 (EXPR3 2) *"+
|
||||
" (EXPR2 (EXPR3 - 3) * (EXPR2 (EXPR3 4))))))))) ;)) end) . )";
|
||||
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 = "(APROGRAM program exprAll ; (DECLLIST (DECL MODIFIER x : (TYPE int) ;))"+
|
||||
" (BLOCK begin (STATLIST (STATWITHSEMI (STAT "+
|
||||
"(ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 0) * (EXPR2 (EXPR3 1))) + (EXPR (EXPR2 (EXPR3 2) "+
|
||||
"/ (EXPR2 (EXPR3 - 3) * (EXPR2 (EXPR3 ( (EXPR (EXPR2 (EXPR3 4)) - (EXPR (EXPR2 (EXPR3 5)) "+
|
||||
"+ (EXPR (EXPR2 (EXPR3 6))))) )) * (EXPR2 (EXPR3 7))))))))) ;)) end) . )";
|
||||
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 = "(APROGRAM program exprAll ; (DECLLIST (DECL MODIFIER x : (TYPE int) ;) "+
|
||||
"(DECL MODIFIER y : (TYPE int) ;) (DECL MODIFIER z : (TYPE int) ;))"+
|
||||
" (BLOCK begin (STATLIST (STATWITHSEMI (STAT "+
|
||||
"(ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 0) * (EXPR2 (EXPR3 x))) + (EXPR (EXPR2 (EXPR3 y)))))) ;)) end) . )";
|
||||
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 = "(APROGRAM program cond ; (DECLLIST (DECL MODIFIER x : (TYPE int) ;))"+
|
||||
" (BLOCK begin (STATLIST (STATWITHSEMI (STAT "+
|
||||
"(CONDSTAT if (COND (EXPR (EXPR2 (EXPR3 2))) < (EXPR (EXPR2 (EXPR3 3)))) "+
|
||||
"then (STAT (ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 1))))))) ;)) end) . )";
|
||||
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 = "(APROGRAM program condElse ; (DECLLIST (DECL MODIFIER x : (TYPE int) ;))"+
|
||||
" (BLOCK begin (STATLIST (STATWITHSEMI (STAT "+
|
||||
"(CONDSTAT if (COND (EXPR (EXPR2 (EXPR3 2))) > (EXPR (EXPR2 (EXPR3 3)))) "+
|
||||
"then (STAT (ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 1))))) "+
|
||||
"else (STAT (ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 2))))))) ;)) end) . )";
|
||||
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 = "(APROGRAM program condelse2 ; (DECLLIST (DECL MODIFIER x : (TYPE int) ;))"+
|
||||
" (BLOCK begin (STATLIST (STATWITHSEMI (STAT "+
|
||||
"(CONDSTAT if (COND (EXPR (EXPR2 (EXPR3 2))) = (EXPR (EXPR2 (EXPR3 3)))) "+
|
||||
"then (STAT (CONDSTAT if (COND (EXPR (EXPR2 (EXPR3 4))) < (EXPR (EXPR2 (EXPR3 5)))) "+
|
||||
"then (STAT (ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 1))))) "+
|
||||
"else (STAT (ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 2))))))) "+
|
||||
"else (STAT (ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 3))))))) ;)) end) . )";
|
||||
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 = "(APROGRAM program condelse3 ; (DECLLIST (DECL MODIFIER x : (TYPE int) ;))"+
|
||||
" (BLOCK begin (STATLIST (STATWITHSEMI (STAT "+
|
||||
"(CONDSTAT if (COND (EXPR (EXPR2 (EXPR3 2))) < (EXPR (EXPR2 (EXPR3 3)))) "+
|
||||
"then (STAT (CONDSTAT if (COND (EXPR (EXPR2 (EXPR3 4))) > (EXPR (EXPR2 (EXPR3 5)))) "+
|
||||
"then (STAT (ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 1))))) "+
|
||||
"else (STAT (CONDSTAT if (COND (EXPR (EXPR2 (EXPR3 6))) = (EXPR (EXPR2 (EXPR3 7)))) "+
|
||||
"then (STAT (ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 2))))) "+
|
||||
"else (STAT (ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 3))))))))))) ;)) end) . )";
|
||||
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 = "(APROGRAM program condelse4 ; (DECLLIST (DECL MODIFIER x : (TYPE int) ;))"+
|
||||
" (BLOCK begin (STATLIST (STATWITHSEMI (STAT "+
|
||||
"(CONDSTAT if (COND (EXPR (EXPR2 (EXPR3 2))) < (EXPR (EXPR2 (EXPR3 3)))) "+
|
||||
"then (STAT (CONDSTAT if (COND (EXPR (EXPR2 (EXPR3 4))) > (EXPR (EXPR2 (EXPR3 5)))) "+
|
||||
"then (STAT (ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 1))))) "+
|
||||
"else (STAT (ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 2))))))) "+
|
||||
"else (STAT (CONDSTAT if (COND (EXPR (EXPR2 (EXPR3 6))) = (EXPR (EXPR2 (EXPR3 7)))) "+
|
||||
"then (STAT (ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 3))))) "+
|
||||
"else (STAT (ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 4))))))))) ;)) end) . )";
|
||||
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 = "(APROGRAM program xmin1 ; (DECLLIST (DECL (MODIFIER read) x : (TYPE int) ;) "+
|
||||
"(DECL (MODIFIER print) y : (TYPE int) ;)) "+
|
||||
"(BLOCK begin (STATLIST (STATWITHSEMI (STAT (ASSIGNSTAT y := (EXPR (EXPR2 (EXPR3 25)) "+
|
||||
"+ (EXPR (EXPR2 (EXPR3 2) * (EXPR2 (EXPR3 x))) - (EXPR (EXPR2 (EXPR3 6) "+
|
||||
"* (EXPR2 (EXPR3 x)))))))) ;) (STATWITHSEMI (STAT (CONDSTAT "+
|
||||
"if (COND (EXPR (EXPR2 (EXPR3 x))) < (EXPR (EXPR2 (EXPR3 y)))) "+
|
||||
"then (STAT (BLOCK begin (STATLIST (STATWITHSEMI (STAT (ASSIGNSTAT x "+
|
||||
":= (EXPR (EXPR2 (EXPR3 - 3) / (EXPR2 (EXPR3 6) * (EXPR2 (EXPR3 ( (EXPR (EXPR2 (EXPR3 y)) "+
|
||||
"+ (EXPR (EXPR2 (EXPR3 2)))) )))))))) ;) (STATWITHSEMI (STAT (CONDSTAT "+
|
||||
"if (COND (EXPR (EXPR2 (EXPR3 y))) < (EXPR (EXPR2 (EXPR3 x)))) "+
|
||||
"then (STAT (ASSIGNSTAT y := (EXPR (EXPR2 (EXPR3 y)) + (EXPR (EXPR2 (EXPR3 3)))))) "+
|
||||
"else (STAT (ASSIGNSTAT y := (EXPR (EXPR2 (EXPR3 y)) + (EXPR (EXPR2 (EXPR3 4)))))))) ;)) "+
|
||||
"end)) else (STAT (BLOCK begin (STATLIST (STATWITHSEMI (STAT (CONDSTAT "+
|
||||
"if (COND (EXPR (EXPR2 (EXPR3 y))) < (EXPR (EXPR2 (EXPR3 x)))) "+
|
||||
"then (STAT (ASSIGNSTAT y := (EXPR (EXPR2 (EXPR3 y)) + (EXPR (EXPR2 (EXPR3 3)))))))) ;) "+
|
||||
"(STATWITHSEMI (STAT (ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 y) * "+
|
||||
"(EXPR2 (EXPR3 ( (EXPR (EXPR2 (EXPR3 y)) - (EXPR (EXPR2 (EXPR3 x)))) )) / "+
|
||||
"(EXPR2 (EXPR3 y))))))) ;)) end)))) ;) (STATWITHSEMI (STAT (ASSIGNSTAT y "+
|
||||
":= (EXPR (EXPR2 (EXPR3 x) * (EXPR2 (EXPR3 y)))))) ;)) end) . )";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,310 @@
|
||||
/* **********************************************
|
||||
* Duale Hochschule Baden-Württemberg Karlsruhe
|
||||
* Prof. Dr. Jörn Eisenbiegler
|
||||
*
|
||||
* Vorlesung Übersetzerbau
|
||||
* Praxis X Abstiegsparser
|
||||
* - Testklasse Syntax X
|
||||
*
|
||||
* **********************************************
|
||||
*/
|
||||
|
||||
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 TestXTopDownParser2 extends ParseTreeTest {
|
||||
|
||||
@Test
|
||||
public void program30Decl() throws Exception {
|
||||
String test = "program decl;\n"+
|
||||
" x: int;"+
|
||||
"begin\n"+
|
||||
"end.";
|
||||
String expected = "(APROGRAM program decl ; (DECLLIST (DECL MODIFIER x : (TYPE int) ;))"+
|
||||
" (BLOCK begin STATLIST end) . )";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void program31DeclRead() throws Exception {
|
||||
String test = "program declRead;\n"+
|
||||
" read x: int;"+
|
||||
"begin\n"+
|
||||
"end.";
|
||||
String expected = "(APROGRAM program declRead ; (DECLLIST (DECL (MODIFIER read) x : (TYPE int) ;))"+
|
||||
" (BLOCK begin STATLIST end) . )";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void program32DeclPrint() throws Exception {
|
||||
String test = "program declPrint;\n"+
|
||||
" print x: int;"+
|
||||
"begin\n"+
|
||||
"end.";
|
||||
String expected = "(APROGRAM program declPrint ; (DECLLIST (DECL (MODIFIER print) x : (TYPE int) ;))"+
|
||||
" (BLOCK begin STATLIST end) . )";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void program33DeclReadPrint() throws Exception {
|
||||
String test = "program declReadPrint;\n"+
|
||||
" read print x: int;"+
|
||||
"begin\n"+
|
||||
"end.";
|
||||
String expected = "(APROGRAM program declReadPrint ; (DECLLIST (DECL (MODIFIER read print) x : (TYPE int) ;))"+
|
||||
" (BLOCK begin STATLIST end) . )";
|
||||
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 = "(APROGRAM program declMult ; (DECLLIST (DECL (MODIFIER read print) a : (TYPE int) ;)" +
|
||||
" (DECL MODIFIER b : (TYPE int) ;)" +
|
||||
" (DECL (MODIFIER read) c : (TYPE int) ;)" +
|
||||
" (DECL (MODIFIER print) d : (TYPE int) ;)" +
|
||||
") (BLOCK begin STATLIST end) . )";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void program35DeclFloatString() throws Exception {
|
||||
String test = "program decl;\n"+
|
||||
" x: float;"+
|
||||
" y: string;"+
|
||||
"begin\n"+
|
||||
"end.";
|
||||
String expected = "(APROGRAM program decl ; (DECLLIST (DECL MODIFIER x : (TYPE float) ;) (DECL MODIFIER y : (TYPE string) ;))"+
|
||||
" (BLOCK begin STATLIST end) . )";
|
||||
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 = "(APROGRAM program declRead ; (DECLLIST (DECL (MODIFIER read) x : (TYPE float) ;) "+
|
||||
"(DECL (MODIFIER read) y : (TYPE string) ;))"+
|
||||
" (BLOCK begin STATLIST end) . )";
|
||||
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 = "(APROGRAM program declRead ; (DECLLIST (DECL (MODIFIER print) x : (TYPE float) ;) "+
|
||||
"(DECL (MODIFIER print) y : (TYPE string) ;))"+
|
||||
" (BLOCK begin STATLIST end) . )";
|
||||
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 = "(APROGRAM program declRead ; (DECLLIST (DECL (MODIFIER read print) x : (TYPE float) ;) "+
|
||||
"(DECL (MODIFIER read print) y : (TYPE string) ;))"+
|
||||
" (BLOCK begin STATLIST end) . )";
|
||||
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 = "(APROGRAM program exprAll ; (DECLLIST (DECL MODIFIER x : (TYPE float) ;))"+
|
||||
" (BLOCK begin (STATLIST (STATWITHSEMI (STAT "+
|
||||
"(ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 1.23e-45))))) ;)) end) . )";
|
||||
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 = "(APROGRAM program exprAll ; (DECLLIST (DECL MODIFIER x : (TYPE float) ;))"+
|
||||
" (BLOCK begin (STATLIST (STATWITHSEMI (STAT "+
|
||||
"(ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 0.0) * (EXPR2 (EXPR3 1.1))) + (EXPR (EXPR2 (EXPR3 2) "+
|
||||
"/ (EXPR2 (EXPR3 - 3.4e-6) * (EXPR2 (EXPR3 ( (EXPR (EXPR2 (EXPR3 4.4)) - (EXPR (EXPR2 (EXPR3 5)) "+
|
||||
"+ (EXPR (EXPR2 (EXPR3 6.5))))) )) * (EXPR2 (EXPR3 7.4))))))))) ;)) end) . )";
|
||||
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 = "(APROGRAM program exprAll ; (DECLLIST (DECL MODIFIER x : (TYPE float) ;))"+
|
||||
" (BLOCK begin (STATLIST (STATWITHSEMI (STAT "+
|
||||
"(ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 0.0)) + (EXPR (EXPR2 (EXPR3 - 1.2)) - (EXPR (EXPR2 (EXPR3 - 2.3) *"+
|
||||
" (EXPR2 (EXPR3 - 4.5) / (EXPR2 (EXPR3 - 6.7))))))))) ;)) end) . )";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void program43StringAssign() throws Exception {
|
||||
String test = "program exprAll;\n"+
|
||||
" x: string;"+
|
||||
"begin\n"+
|
||||
" x :=\"Hello\";"+
|
||||
"end.";
|
||||
String expected = "(APROGRAM program exprAll ; (DECLLIST (DECL MODIFIER x : (TYPE string) ;))"+
|
||||
" (BLOCK begin (STATLIST (STATWITHSEMI (STAT "+
|
||||
"(ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 \"Hello\"))))) ;)) end) . )";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void program44StringExpr1() throws Exception {
|
||||
String test = "program exprAll;\n"+
|
||||
" x: string;"+
|
||||
"begin\n"+
|
||||
" x := x + \"Hello\";"+
|
||||
"end.";
|
||||
String expected = "(APROGRAM program exprAll ; (DECLLIST (DECL MODIFIER x : (TYPE string) ;))"+
|
||||
" (BLOCK begin (STATLIST (STATWITHSEMI (STAT "+
|
||||
"(ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 x)) + (EXPR (EXPR2 (EXPR3 \"Hello\")))))) ;)) end) . )";
|
||||
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 = "(APROGRAM program exprAll ; (DECLLIST (DECL MODIFIER x : (TYPE string) ;)) (BLOCK begin (STATLIST "
|
||||
+ "(STATWITHSEMI (STAT (WHILESTAT while ( (COND (EXPR (EXPR2 (EXPR3 2))) < (EXPR (EXPR2 (EXPR3 x)))) )"
|
||||
+ " (STAT (ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 x)) + (EXPR (EXPR2 (EXPR3 1)))))))) ;)) end) . )";
|
||||
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 = "(APROGRAM program exprAll ; (DECLLIST (DECL MODIFIER x : (TYPE string) ;)) (BLOCK begin (STATLIST "
|
||||
+ "(STATWITHSEMI (STAT (WHILESTAT while ( (COND (EXPR (EXPR2 (EXPR3 2))) < (EXPR (EXPR2 (EXPR3 x)))) )"
|
||||
+ " (STAT (BLOCK begin (STATLIST "
|
||||
+ "(STATWITHSEMI (STAT (ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 x)) + (EXPR (EXPR2 (EXPR3 1)))))) ;) "
|
||||
+ "(STATWITHSEMI (STAT (ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 x)) + (EXPR (EXPR2 (EXPR3 1)))))) ;)) end)))) ;)) end) . )";
|
||||
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 = "(APROGRAM program exprAll ; (DECLLIST (DECL MODIFIER x : (TYPE string) ;) "
|
||||
+ "(DECL MODIFIER y : (TYPE string) ;)) (BLOCK begin (STATLIST "
|
||||
+ "(STATWITHSEMI (STAT (FORSTAT for ( (ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 1)))) ; "
|
||||
+ "(COND (EXPR (EXPR2 (EXPR3 x))) < (EXPR (EXPR2 (EXPR3 10)))) ; "
|
||||
+ "(ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 x)) + (EXPR (EXPR2 (EXPR3 1))))) ) "
|
||||
+ "(STAT (ASSIGNSTAT y := (EXPR (EXPR2 (EXPR3 y)) + (EXPR (EXPR2 (EXPR3 1)))))))) ;)) end) . )";
|
||||
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 = "(APROGRAM program exprAll ; (DECLLIST (DECL MODIFIER x : (TYPE string) ;) "
|
||||
+ "(DECL MODIFIER y : (TYPE string) ;)) (BLOCK begin (STATLIST "
|
||||
+ "(STATWITHSEMI (STAT (FORSTAT for ( (ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 1)))) ; "
|
||||
+ "(COND (EXPR (EXPR2 (EXPR3 x))) < (EXPR (EXPR2 (EXPR3 10)))) ; "
|
||||
+ "(ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 x)) + (EXPR (EXPR2 (EXPR3 1))))) ) (STAT "
|
||||
+ "(BLOCK begin (STATLIST (STATWITHSEMI (STAT "
|
||||
+ "(ASSIGNSTAT y := (EXPR (EXPR2 (EXPR3 y)) + (EXPR (EXPR2 (EXPR3 1)))))) ;)) end)))) ;)) end) . )";
|
||||
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 = "(APROGRAM program test5 ; "
|
||||
+ "(DECLLIST (DECL (MODIFIER read) x : (TYPE int) ;) (DECL (MODIFIER print) y : (TYPE float) ;) "
|
||||
+ "(DECL MODIFIER z : (TYPE int) ;)) "
|
||||
+ "(BLOCK begin (STATLIST (STATWITHSEMI (STAT "
|
||||
+ "(WHILESTAT while ( (COND (EXPR (EXPR2 (EXPR3 x))) < (EXPR (EXPR2 (EXPR3 4)))) ) (STAT "
|
||||
+ "(BLOCK begin (STATLIST (STATWITHSEMI (STAT "
|
||||
+ "(FORSTAT for ( (ASSIGNSTAT z := (EXPR (EXPR2 (EXPR3 0)))) ; "
|
||||
+ "(COND (EXPR (EXPR2 (EXPR3 z))) < (EXPR (EXPR2 (EXPR3 4)))) ; "
|
||||
+ "(ASSIGNSTAT z := (EXPR (EXPR2 (EXPR3 z)) + (EXPR (EXPR2 (EXPR3 1))))) ) "
|
||||
+ "(STAT (ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 x)) + (EXPR (EXPR2 (EXPR3 2)))))))) ;) "
|
||||
+ "(STATWITHSEMI (STAT (CONDSTAT if (COND (EXPR (EXPR2 (EXPR3 x))) = (EXPR (EXPR2 (EXPR3 4)))) "
|
||||
+ "then (STAT (BLOCK begin (STATLIST (STATWITHSEMI (STAT "
|
||||
+ "(ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 z) * (EXPR2 (EXPR3 ( (EXPR (EXPR2 (EXPR3 x)) + "
|
||||
+ "(EXPR (EXPR2 (EXPR3 2)))) ))))))) ;) "
|
||||
+ "(STATWITHSEMI (STAT (ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 x)) + (EXPR (EXPR2 (EXPR3 10)))))) ;)) end)) "
|
||||
+ "else (STAT (ASSIGNSTAT y := (EXPR (EXPR2 (EXPR3 100.e-3))))))) ;)) end)))) ;)) end) . )";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
/* **********************************************
|
||||
* Duale Hochschule Baden-Württemberg Karlsruhe
|
||||
* Prof. Dr. Jörn Eisenbiegler
|
||||
*
|
||||
* Vorlesung Übersetzerbau
|
||||
* Praxis Xmin Abstiegsparser
|
||||
* - Testsuite für Xmin
|
||||
*
|
||||
* **********************************************
|
||||
*/
|
||||
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,
|
||||
TestXminTopDownParser1.class })
|
||||
public class TestXminTopDownParser {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,296 @@
|
||||
/* **********************************************
|
||||
* Duale Hochschule Baden-Württemberg Karlsruhe
|
||||
* Prof. Dr. Jörn Eisenbiegler
|
||||
*
|
||||
* Vorlesung Übersetzerbau
|
||||
* Praxis Xmin Abstiegsparser
|
||||
* - Testklasse Xmin Syntax
|
||||
*
|
||||
* **********************************************
|
||||
*/
|
||||
|
||||
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 TestXminTopDownParser1 extends ParseTreeTest {
|
||||
|
||||
@Test
|
||||
public void program00BeginEnd() throws Exception {
|
||||
String test = "program beginEnd;\n"+
|
||||
"begin\n"+
|
||||
"end.";
|
||||
String expected = "(APROGRAM program beginEnd ; (BLOCK begin STATLIST end) . )";
|
||||
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 = "(APROGRAM program beginEnd2 ; (BLOCK begin (STATLIST "+
|
||||
"(STATWITHSEMI (STAT (BLOCK begin STATLIST end)) ;)) end) . )";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void program10Assign() throws Exception {
|
||||
String test = "program assign;\n"+
|
||||
"begin\n"+
|
||||
" x :=0;"+
|
||||
"end.";
|
||||
String expected = "(APROGRAM program assign ;"+
|
||||
" (BLOCK begin (STATLIST (STATWITHSEMI (STAT (ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 0))))) ;)) end) . )";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void program11ExprPlus() throws Exception {
|
||||
String test = "program exprPlus;\n"+
|
||||
"begin\n"+
|
||||
" x :=0+1;"+
|
||||
"end.";
|
||||
String expected = "(APROGRAM program exprPlus ;"+
|
||||
" (BLOCK begin (STATLIST (STATWITHSEMI (STAT "+
|
||||
"(ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 0)) + (EXPR (EXPR2 (EXPR3 1)))))) ;)) end) . )";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void program12ExprMinus() throws Exception {
|
||||
String test = "program exprMinus;\n"+
|
||||
"begin\n"+
|
||||
" x :=0-1;"+
|
||||
"end.";
|
||||
String expected = "(APROGRAM program exprMinus ;"+
|
||||
" (BLOCK begin (STATLIST (STATWITHSEMI (STAT "+
|
||||
"(ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 0)) - (EXPR (EXPR2 (EXPR3 1)))))) ;)) end) . )";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void program13ExprMul() throws Exception {
|
||||
String test = "program exprMul;\n"+
|
||||
"begin\n"+
|
||||
" x :=0*1;"+
|
||||
"end.";
|
||||
String expected = "(APROGRAM program exprMul ;"+
|
||||
" (BLOCK begin (STATLIST (STATWITHSEMI (STAT "+
|
||||
"(ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 0) * (EXPR2 (EXPR3 1)))))) ;)) end) . )";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void program14ExprDiv() throws Exception {
|
||||
String test = "program exprDiv;\n"+
|
||||
"begin\n"+
|
||||
" x :=0/1;"+
|
||||
"end.";
|
||||
String expected = "(APROGRAM program exprDiv ;"+
|
||||
" (BLOCK begin (STATLIST (STATWITHSEMI (STAT "+
|
||||
"(ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 0) / (EXPR2 (EXPR3 1)))))) ;)) end) . )";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void program15ExprUMinus() throws Exception {
|
||||
String test = "program exprUMinus;\n"+
|
||||
"begin\n"+
|
||||
" x :=0--1;"+
|
||||
"end.";
|
||||
String expected = "(APROGRAM program exprUMinus ;"+
|
||||
" (BLOCK begin (STATLIST (STATWITHSEMI (STAT "+
|
||||
"(ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 0)) - (EXPR (EXPR2 (EXPR3 - 1)))))) ;)) end) . )";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void program16ExprPlusMinus() throws Exception {
|
||||
String test = "program exprPlus;\n"+
|
||||
"begin\n"+
|
||||
" x :=0+1+-2-3+4;"+
|
||||
"end.";
|
||||
String expected = "(APROGRAM program exprPlus ;"+
|
||||
" (BLOCK begin (STATLIST (STATWITHSEMI (STAT "+
|
||||
"(ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 0)) + (EXPR (EXPR2 (EXPR3 1)) + "+
|
||||
"(EXPR (EXPR2 (EXPR3 - 2)) - (EXPR (EXPR2 (EXPR3 3)) + (EXPR (EXPR2 (EXPR3 4))))))))) ;)) end) . )";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void program17ExprMulDiv() throws Exception {
|
||||
String test = "program exprMul;\n"+
|
||||
"begin\n"+
|
||||
" x :=0*1/2*-3*4;"+
|
||||
"end.";
|
||||
String expected = "(APROGRAM program exprMul ;"+
|
||||
" (BLOCK begin (STATLIST (STATWITHSEMI (STAT "+
|
||||
"(ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 0) * (EXPR2 (EXPR3 1) / (EXPR2 (EXPR3 2) *"+
|
||||
" (EXPR2 (EXPR3 - 3) * (EXPR2 (EXPR3 4))))))))) ;)) end) . )";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void program18ExprAll() throws Exception {
|
||||
String test = "program exprAll;\n"+
|
||||
"begin\n"+
|
||||
" x :=0*1+2/-3*(4-5+6)*7;"+
|
||||
"end.";
|
||||
String expected = "(APROGRAM program exprAll ;"+
|
||||
" (BLOCK begin (STATLIST (STATWITHSEMI (STAT "+
|
||||
"(ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 0) * (EXPR2 (EXPR3 1))) + (EXPR (EXPR2 (EXPR3 2) "+
|
||||
"/ (EXPR2 (EXPR3 - 3) * (EXPR2 (EXPR3 ( (EXPR (EXPR2 (EXPR3 4)) - (EXPR (EXPR2 (EXPR3 5)) "+
|
||||
"+ (EXPR (EXPR2 (EXPR3 6))))) )) * (EXPR2 (EXPR3 7))))))))) ;)) end) . )";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void program19ExprVar() throws Exception {
|
||||
String test = "program exprAll;\n"+
|
||||
"begin\n"+
|
||||
" x :=0*x+y;"+
|
||||
"end.";
|
||||
String expected = "(APROGRAM program exprAll ;"+
|
||||
" (BLOCK begin (STATLIST (STATWITHSEMI (STAT "+
|
||||
"(ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 0) * (EXPR2 (EXPR3 x))) + (EXPR (EXPR2 (EXPR3 y)))))) ;)) end) . )";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void program20Cond() throws Exception {
|
||||
String test = "program cond;\n"+
|
||||
"begin\n"+
|
||||
" if 2<3 then x:=1;"+
|
||||
"end.";
|
||||
String expected = "(APROGRAM program cond ;"+
|
||||
" (BLOCK begin (STATLIST (STATWITHSEMI (STAT "+
|
||||
"(CONDSTAT if (COND (EXPR (EXPR2 (EXPR3 2))) < (EXPR (EXPR2 (EXPR3 3)))) "+
|
||||
"then (STAT (ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 1))))))) ;)) end) . )";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void program21CondElse() throws Exception {
|
||||
String test = "program condElse;\n"+
|
||||
"begin\n"+
|
||||
" if 2>3 then x:=1 else x:=2;"+
|
||||
"end.";
|
||||
String expected = "(APROGRAM program condElse ;"+
|
||||
" (BLOCK begin (STATLIST (STATWITHSEMI (STAT "+
|
||||
"(CONDSTAT if (COND (EXPR (EXPR2 (EXPR3 2))) > (EXPR (EXPR2 (EXPR3 3)))) "+
|
||||
"then (STAT (ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 1))))) "+
|
||||
"else (STAT (ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 2))))))) ;)) end) . )";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void program22CondElse2() throws Exception {
|
||||
String test = "program condelse2;\n"+
|
||||
"begin\n"+
|
||||
" if 2=3 then if 4<5 then x:=1 else x:=2 else x:=3;"+
|
||||
"end.";
|
||||
String expected = "(APROGRAM program condelse2 ;"+
|
||||
" (BLOCK begin (STATLIST (STATWITHSEMI (STAT "+
|
||||
"(CONDSTAT if (COND (EXPR (EXPR2 (EXPR3 2))) = (EXPR (EXPR2 (EXPR3 3)))) "+
|
||||
"then (STAT (CONDSTAT if (COND (EXPR (EXPR2 (EXPR3 4))) < (EXPR (EXPR2 (EXPR3 5)))) "+
|
||||
"then (STAT (ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 1))))) "+
|
||||
"else (STAT (ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 2))))))) "+
|
||||
"else (STAT (ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 3))))))) ;)) end) . )";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void program23CondElse3() throws Exception {
|
||||
String test = "program condelse3;\n"+
|
||||
"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 = "(APROGRAM program condelse3 ;"+
|
||||
" (BLOCK begin (STATLIST (STATWITHSEMI (STAT "+
|
||||
"(CONDSTAT if (COND (EXPR (EXPR2 (EXPR3 2))) < (EXPR (EXPR2 (EXPR3 3)))) "+
|
||||
"then (STAT (CONDSTAT if (COND (EXPR (EXPR2 (EXPR3 4))) > (EXPR (EXPR2 (EXPR3 5)))) "+
|
||||
"then (STAT (ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 1))))) "+
|
||||
"else (STAT (CONDSTAT if (COND (EXPR (EXPR2 (EXPR3 6))) = (EXPR (EXPR2 (EXPR3 7)))) "+
|
||||
"then (STAT (ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 2))))) "+
|
||||
"else (STAT (ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 3))))))))))) ;)) end) . )";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void program24CondElse4() throws Exception {
|
||||
String test = "program condelse4;\n"+
|
||||
"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 = "(APROGRAM program condelse4 ;"+
|
||||
" (BLOCK begin (STATLIST (STATWITHSEMI (STAT "+
|
||||
"(CONDSTAT if (COND (EXPR (EXPR2 (EXPR3 2))) < (EXPR (EXPR2 (EXPR3 3)))) "+
|
||||
"then (STAT (CONDSTAT if (COND (EXPR (EXPR2 (EXPR3 4))) > (EXPR (EXPR2 (EXPR3 5)))) "+
|
||||
"then (STAT (ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 1))))) "+
|
||||
"else (STAT (ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 2))))))) "+
|
||||
"else (STAT (CONDSTAT if (COND (EXPR (EXPR2 (EXPR3 6))) = (EXPR (EXPR2 (EXPR3 7)))) "+
|
||||
"then (STAT (ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 3))))) "+
|
||||
"else (STAT (ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 4))))))))) ;)) end) . )";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void program90Xmin1() throws Exception {
|
||||
String test = "program xmin1;\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 = "(APROGRAM program xmin1 ; "+
|
||||
"(BLOCK begin (STATLIST (STATWITHSEMI (STAT (ASSIGNSTAT y := (EXPR (EXPR2 (EXPR3 25)) "+
|
||||
"+ (EXPR (EXPR2 (EXPR3 2) * (EXPR2 (EXPR3 x))) - (EXPR (EXPR2 (EXPR3 6) "+
|
||||
"* (EXPR2 (EXPR3 x)))))))) ;) (STATWITHSEMI (STAT (CONDSTAT "+
|
||||
"if (COND (EXPR (EXPR2 (EXPR3 x))) < (EXPR (EXPR2 (EXPR3 y)))) "+
|
||||
"then (STAT (BLOCK begin (STATLIST (STATWITHSEMI (STAT (ASSIGNSTAT x "+
|
||||
":= (EXPR (EXPR2 (EXPR3 - 3) / (EXPR2 (EXPR3 6) * (EXPR2 (EXPR3 ( (EXPR (EXPR2 (EXPR3 y)) "+
|
||||
"+ (EXPR (EXPR2 (EXPR3 2)))) )))))))) ;) (STATWITHSEMI (STAT (CONDSTAT "+
|
||||
"if (COND (EXPR (EXPR2 (EXPR3 y))) < (EXPR (EXPR2 (EXPR3 x)))) "+
|
||||
"then (STAT (ASSIGNSTAT y := (EXPR (EXPR2 (EXPR3 y)) + (EXPR (EXPR2 (EXPR3 3)))))) "+
|
||||
"else (STAT (ASSIGNSTAT y := (EXPR (EXPR2 (EXPR3 y)) + (EXPR (EXPR2 (EXPR3 4)))))))) ;)) "+
|
||||
"end)) else (STAT (BLOCK begin (STATLIST (STATWITHSEMI (STAT (CONDSTAT "+
|
||||
"if (COND (EXPR (EXPR2 (EXPR3 y))) < (EXPR (EXPR2 (EXPR3 x)))) "+
|
||||
"then (STAT (ASSIGNSTAT y := (EXPR (EXPR2 (EXPR3 y)) + (EXPR (EXPR2 (EXPR3 3)))))))) ;) "+
|
||||
"(STATWITHSEMI (STAT (ASSIGNSTAT x := (EXPR (EXPR2 (EXPR3 y) * "+
|
||||
"(EXPR2 (EXPR3 ( (EXPR (EXPR2 (EXPR3 y)) - (EXPR (EXPR2 (EXPR3 x)))) )) / "+
|
||||
"(EXPR2 (EXPR3 y))))))) ;)) end)))) ;) (STATWITHSEMI (STAT (ASSIGNSTAT y "+
|
||||
":= (EXPR (EXPR2 (EXPR3 x) * (EXPR2 (EXPR3 y)))))) ;)) end) . )";
|
||||
testParseTree(test, expected);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
/* **********************************************
|
||||
* Duale Hochschule Baden-Württemberg Karlsruhe
|
||||
* Prof. Dr. Jörn Eisenbiegler
|
||||
*
|
||||
* Vorlesung Übersetzerbau
|
||||
* Praxis X Abstiegsparser
|
||||
* - 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());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="JAVA_MODULE" version="4">
|
||||
<component name="NewModuleRootManager">
|
||||
<output url="file://$MODULE_DIR$/bin" />
|
||||
<exclude-output />
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
|
||||
</content>
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
<orderEntry type="jdk" jdkName="JavaSE-1.7" jdkType="JavaSDK" />
|
||||
<orderEntry type="module-library">
|
||||
<library name="junit4">
|
||||
<CLASSES>
|
||||
<root url="jar://$APPLICATION_HOME_DIR$/lib/junit-4.12.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</orderEntry>
|
||||
</component>
|
||||
</module>
|
||||
Binary file not shown.
@@ -22,7 +22,7 @@ package de.dhbw.compiler.jflexasscanner;
|
||||
%public
|
||||
%final
|
||||
|
||||
%xstate FRAC, EXP, STR, NULL, ID, NUM
|
||||
%xstate FRAC, EXP, STR, NULL, ID, NUM, TO
|
||||
|
||||
%{
|
||||
String idValue = "";
|
||||
@@ -31,6 +31,7 @@ package de.dhbw.compiler.jflexasscanner;
|
||||
String numberString = "";
|
||||
int decimalPlace = 0;
|
||||
int exponent = 0;
|
||||
String toRangeString = "";
|
||||
|
||||
private Token numToken(String numberString, int value) {
|
||||
//return new Token(Token.NUM, String.valueOf(intValue), yyline+1, yycolumn+1-String.valueOf(intValue).length());
|
||||
@@ -44,6 +45,7 @@ CapitalChars = [A-Z]
|
||||
Numbers = [0-9]
|
||||
AllChars = [a-zA-Z0-9]
|
||||
Dot = [\.]
|
||||
//To = \d\s*[\.]*\s*\d
|
||||
Power = \^{Numbers}
|
||||
|
||||
%eofval{
|
||||
@@ -58,6 +60,7 @@ Power = \^{Numbers}
|
||||
{Numbers} { yybegin(NUM);
|
||||
intValue = yycharat(0)-'0';
|
||||
numberString = yytext(); }
|
||||
{Dot} { yybegin(TO); toRangeString = yytext(); }
|
||||
{AllChars} { yybegin(ID); System.out.println("BEGIN ID <"+yytext()+">");
|
||||
idValue = yytext(); }
|
||||
[\[] { return new Token(Token.LSBR, yytext(), yyline+1, yycolumn+1); }
|
||||
@@ -90,6 +93,7 @@ Power = \^{Numbers}
|
||||
|
||||
<FRAC> {
|
||||
{Numbers} { fracValue += (yycharat(0) - '0') * Math.pow(10, -++decimalPlace); numberString += yytext(); }
|
||||
{Dot} { yybegin(TO); toRangeString = yytext(); }
|
||||
<<EOF>> { yybegin(YYINITIAL);
|
||||
return new FracToken(Token.FRAC, numberString, yyline+1, yycolumn+1-numberString.length(), fracValue); }
|
||||
\^{Numbers} { yybegin(EXP); numberString += yytext(); exponent = yycharat(1) - '0'; System.out.println("BEGIN EXP <"+yytext()+"> / exponent: " + exponent); }
|
||||
@@ -109,6 +113,36 @@ Power = \^{Numbers}
|
||||
return new FracToken(Token.FRAC, numberString, yyline+1, yycolumn+1-numberString.length(), fracValue * Math.pow(10, exponent)); }
|
||||
}
|
||||
|
||||
<TO> {
|
||||
{Dot} { toRangeString += yytext(); System.out.println("TO DOT <"+toRangeString+"> / " + yyline + " - " + yycolumn);
|
||||
if (toRangeString.length() % 2 == 0) {
|
||||
String result = toRangeString;
|
||||
toRangeString = "";
|
||||
return new Token(Token.TO, result, yyline+1, yycolumn+1-1);
|
||||
}}
|
||||
{Numbers} { yybegin(NUM); yypushback(1);
|
||||
if (toRangeString.length() % 2 == 0) {
|
||||
toRangeString = "";
|
||||
return new Token(Token.TO, "..", yyline+1, yycolumn+1-2);
|
||||
} else {
|
||||
return new Token(Token.INVALID, toRangeString, yyline+1, yycolumn+1-toRangeString.length());
|
||||
}}
|
||||
<<EOF>> { yybegin(YYINITIAL);
|
||||
if (toRangeString.length() % 2 == 0) {
|
||||
toRangeString = "";
|
||||
return new Token(Token.TO, "..", yyline+1, yycolumn+1-2);
|
||||
} else {
|
||||
return new Token(Token.INVALID, toRangeString, yyline+1, yycolumn+1-toRangeString.length());
|
||||
}}
|
||||
[^] { yybegin(YYINITIAL); yypushback(1);
|
||||
if (toRangeString.length() % 2 == 0) {
|
||||
toRangeString = "";
|
||||
return new Token(Token.TO, "..", yyline+1, yycolumn+1-2);
|
||||
} else {
|
||||
return new Token(Token.INVALID, toRangeString, yyline+1, yycolumn+1-toRangeString.length());
|
||||
}}
|
||||
}
|
||||
|
||||
[^] { System.out.println("Illegal character <" + yytext() + ">");
|
||||
return new Token(Token.INVALID, yytext(), yyline+1, yycolumn+1); }
|
||||
|
||||
|
||||
@@ -34,6 +34,7 @@ public final class JFlexASScanner {
|
||||
public static final int NULL = 8;
|
||||
public static final int ID = 10;
|
||||
public static final int NUM = 12;
|
||||
public static final int TO = 14;
|
||||
|
||||
/**
|
||||
* ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l
|
||||
@@ -42,7 +43,7 @@ public final class JFlexASScanner {
|
||||
* 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, 3, 3, 4, 4, 5, 5
|
||||
0, 0, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 6, 6
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -64,12 +65,13 @@ public final class JFlexASScanner {
|
||||
private static final int [] ZZ_ACTION = zzUnpackAction();
|
||||
|
||||
private static final String ZZ_ACTION_PACKED_0 =
|
||||
"\6\0\1\1\1\2\1\3\1\4\1\3\1\5\1\6"+
|
||||
"\1\7\1\10\1\11\1\10\1\12\1\13\1\14\1\15"+
|
||||
"\1\16\1\17\1\20\1\21\1\0\1\22\1\0\1\23";
|
||||
"\7\0\1\1\1\2\1\3\1\4\1\5\1\3\1\6"+
|
||||
"\1\7\1\10\1\11\1\12\1\11\1\13\1\14\1\15"+
|
||||
"\1\16\1\17\1\20\1\21\1\22\1\23\1\24\1\25"+
|
||||
"\1\0\1\26\1\0\1\27";
|
||||
|
||||
private static int [] zzUnpackAction() {
|
||||
int [] result = new int[29];
|
||||
int [] result = new int[34];
|
||||
int offset = 0;
|
||||
offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
|
||||
return result;
|
||||
@@ -94,13 +96,14 @@ public final class JFlexASScanner {
|
||||
private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
|
||||
|
||||
private static final String ZZ_ROWMAP_PACKED_0 =
|
||||
"\0\0\0\14\0\30\0\44\0\60\0\74\0\44\0\110"+
|
||||
"\0\44\0\44\0\124\0\44\0\44\0\44\0\44\0\44"+
|
||||
"\0\140\0\44\0\44\0\44\0\44\0\44\0\44\0\44"+
|
||||
"\0\44\0\154\0\44\0\170\0\44";
|
||||
"\0\0\0\14\0\30\0\44\0\60\0\74\0\110\0\44"+
|
||||
"\0\124\0\44\0\44\0\44\0\140\0\44\0\44\0\44"+
|
||||
"\0\44\0\44\0\154\0\44\0\44\0\44\0\44\0\44"+
|
||||
"\0\44\0\44\0\44\0\44\0\44\0\44\0\170\0\44"+
|
||||
"\0\204\0\44";
|
||||
|
||||
private static int [] zzUnpackRowMap() {
|
||||
int [] result = new int[29];
|
||||
int [] result = new int[34];
|
||||
int offset = 0;
|
||||
offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
|
||||
return result;
|
||||
@@ -123,15 +126,15 @@ public final class JFlexASScanner {
|
||||
private static final int [] ZZ_TRANS = zzUnpackTrans();
|
||||
|
||||
private static final String ZZ_TRANS_PACKED_0 =
|
||||
"\1\7\1\10\1\11\1\12\2\7\1\13\2\11\1\14"+
|
||||
"\1\15\1\16\3\17\1\20\1\17\1\21\6\17\3\22"+
|
||||
"\1\23\10\22\14\0\2\24\2\25\2\24\3\25\3\24"+
|
||||
"\2\26\1\27\1\30\1\31\1\26\3\27\3\26\1\0"+
|
||||
"\1\10\21\0\1\32\7\0\1\33\20\0\1\34\13\0"+
|
||||
"\1\35\3\0";
|
||||
"\1\10\1\11\1\12\1\13\1\14\1\10\1\15\2\12"+
|
||||
"\1\16\1\17\1\20\3\21\1\22\1\14\1\23\6\21"+
|
||||
"\3\24\1\25\10\24\14\0\2\26\2\27\2\26\3\27"+
|
||||
"\3\26\2\30\1\31\1\32\1\33\1\30\3\31\3\30"+
|
||||
"\3\34\1\35\1\36\7\34\1\0\1\11\21\0\1\37"+
|
||||
"\7\0\1\40\20\0\1\41\13\0\1\42\3\0";
|
||||
|
||||
private static int [] zzUnpackTrans() {
|
||||
int [] result = new int[132];
|
||||
int [] result = new int[144];
|
||||
int offset = 0;
|
||||
offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
|
||||
return result;
|
||||
@@ -169,11 +172,11 @@ public final class JFlexASScanner {
|
||||
private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
|
||||
|
||||
private static final String ZZ_ATTRIBUTE_PACKED_0 =
|
||||
"\3\0\1\10\2\0\1\11\1\1\2\11\1\1\5\11"+
|
||||
"\1\1\10\11\1\0\1\11\1\0\1\11";
|
||||
"\3\0\1\10\3\0\1\11\1\1\3\11\1\1\5\11"+
|
||||
"\1\1\13\11\1\0\1\11\1\0\1\11";
|
||||
|
||||
private static int [] zzUnpackAttribute() {
|
||||
int [] result = new int[29];
|
||||
int [] result = new int[34];
|
||||
int offset = 0;
|
||||
offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
|
||||
return result;
|
||||
@@ -255,6 +258,7 @@ public final class JFlexASScanner {
|
||||
String numberString = "";
|
||||
int decimalPlace = 0;
|
||||
int exponent = 0;
|
||||
String toRangeString = "";
|
||||
|
||||
private Token numToken(String numberString, int value) {
|
||||
//return new Token(Token.NUM, String.valueOf(intValue), yyline+1, yycolumn+1-String.valueOf(intValue).length());
|
||||
@@ -633,22 +637,32 @@ public final class JFlexASScanner {
|
||||
yybegin(YYINITIAL);
|
||||
return new FracToken(Token.FRAC, numberString, yyline+1, yycolumn+1-numberString.length(), fracValue);
|
||||
}
|
||||
case 30: break;
|
||||
case 35: break;
|
||||
case EXP: {
|
||||
yybegin(YYINITIAL);
|
||||
return new FracToken(Token.FRAC, numberString, yyline+1, yycolumn+1-numberString.length(), fracValue * Math.pow(10, exponent));
|
||||
}
|
||||
case 31: break;
|
||||
case 36: break;
|
||||
case ID: {
|
||||
yybegin(YYINITIAL);
|
||||
return new Token(Token.ID, idValue, yyline+1, yycolumn+1-idValue.length());
|
||||
}
|
||||
case 32: break;
|
||||
case 37: break;
|
||||
case NUM: {
|
||||
yybegin(YYINITIAL);
|
||||
return numToken(numberString, intValue);
|
||||
}
|
||||
case 33: break;
|
||||
case 38: break;
|
||||
case TO: {
|
||||
yybegin(YYINITIAL);
|
||||
if (toRangeString.length() % 2 == 0) {
|
||||
toRangeString = "";
|
||||
return new Token(Token.TO, "..", yyline+1, yycolumn+1-2);
|
||||
} else {
|
||||
return new Token(Token.INVALID, toRangeString, yyline+1, yycolumn+1-toRangeString.length());
|
||||
}
|
||||
}
|
||||
case 39: break;
|
||||
default:
|
||||
{ return new Token(Token.EOF, "", yyline+1, yycolumn+1);
|
||||
}
|
||||
@@ -660,95 +674,128 @@ public final class JFlexASScanner {
|
||||
{ System.out.println("Illegal character <" + yytext() + ">");
|
||||
return new Token(Token.INVALID, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 20: break;
|
||||
case 24: break;
|
||||
case 2:
|
||||
{ /* Ignore */
|
||||
}
|
||||
case 21: break;
|
||||
case 25: break;
|
||||
case 3:
|
||||
{ yybegin(ID); System.out.println("BEGIN ID <"+yytext()+">");
|
||||
idValue = yytext();
|
||||
}
|
||||
case 22: break;
|
||||
case 26: break;
|
||||
case 4:
|
||||
{ yybegin(NUM);
|
||||
intValue = yycharat(0)-'0';
|
||||
numberString = yytext();
|
||||
}
|
||||
case 23: break;
|
||||
case 27: break;
|
||||
case 5:
|
||||
{ yybegin(TO); toRangeString = yytext();
|
||||
}
|
||||
case 28: break;
|
||||
case 6:
|
||||
{ return new Token(Token.LSBR, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 24: break;
|
||||
case 6:
|
||||
case 29: break;
|
||||
case 7:
|
||||
{ return new Token(Token.RSBR, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 25: break;
|
||||
case 7:
|
||||
case 30: break;
|
||||
case 8:
|
||||
{ return new Token(Token.COMMA, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 26: break;
|
||||
case 8:
|
||||
case 31: break;
|
||||
case 9:
|
||||
{ yybegin(YYINITIAL);
|
||||
yypushback(1);
|
||||
return new FracToken(Token.FRAC, numberString, yyline+1, yycolumn+1-numberString.length(), fracValue);
|
||||
}
|
||||
case 27: break;
|
||||
case 9:
|
||||
case 32: break;
|
||||
case 10:
|
||||
{ fracValue += (yycharat(0) - '0') * Math.pow(10, -++decimalPlace); numberString += yytext();
|
||||
}
|
||||
case 28: break;
|
||||
case 10:
|
||||
case 33: break;
|
||||
case 11:
|
||||
{ yybegin(YYINITIAL);
|
||||
yypushback(1);
|
||||
System.out.println("numberString: " + numberString);
|
||||
System.out.println("fracValue: " + fracValue + " / exponent: " + exponent);
|
||||
return new FracToken(Token.FRAC, numberString, yyline+1, yycolumn+1-numberString.length(), fracValue * Math.pow(10, exponent));
|
||||
}
|
||||
case 29: break;
|
||||
case 11:
|
||||
case 34: break;
|
||||
case 12:
|
||||
{ numberString += yytext(); exponent = exponent * 10 + yycharat(0) - '0';
|
||||
}
|
||||
case 30: break;
|
||||
case 12:
|
||||
case 35: break;
|
||||
case 13:
|
||||
{ yybegin(YYINITIAL);
|
||||
yypushback(1);
|
||||
return new Token(Token.ID, idValue, yyline+1, yycolumn+1-idValue.length());
|
||||
}
|
||||
case 31: break;
|
||||
case 13:
|
||||
case 36: break;
|
||||
case 14:
|
||||
{ idValue += yytext();
|
||||
}
|
||||
case 32: break;
|
||||
case 14:
|
||||
case 37: break;
|
||||
case 15:
|
||||
{ yybegin(YYINITIAL);
|
||||
yypushback(1);
|
||||
return numToken(numberString, intValue);
|
||||
}
|
||||
case 33: break;
|
||||
case 15:
|
||||
case 38: break;
|
||||
case 16:
|
||||
{ yybegin(ID); idValue = numberString; yypushback(1);
|
||||
}
|
||||
case 34: break;
|
||||
case 16:
|
||||
case 39: break;
|
||||
case 17:
|
||||
{ intValue = intValue * 10 + yycharat(0) - '0'; numberString += yytext();
|
||||
}
|
||||
case 35: break;
|
||||
case 17:
|
||||
case 40: break;
|
||||
case 18:
|
||||
{ yybegin(FRAC);
|
||||
fracValue = intValue;
|
||||
System.out.println("BEGIN FRAC <"+yytext()+">");
|
||||
numberString += yytext();
|
||||
}
|
||||
case 36: break;
|
||||
case 18:
|
||||
case 41: break;
|
||||
case 19:
|
||||
{ yybegin(YYINITIAL); yypushback(1);
|
||||
if (toRangeString.length() % 2 == 0) {
|
||||
toRangeString = "";
|
||||
return new Token(Token.TO, "..", yyline+1, yycolumn+1-2);
|
||||
} else {
|
||||
return new Token(Token.INVALID, toRangeString, yyline+1, yycolumn+1-toRangeString.length());
|
||||
}
|
||||
}
|
||||
case 42: break;
|
||||
case 20:
|
||||
{ yybegin(NUM); yypushback(1);
|
||||
if (toRangeString.length() % 2 == 0) {
|
||||
toRangeString = "";
|
||||
return new Token(Token.TO, "..", yyline+1, yycolumn+1-2);
|
||||
} else {
|
||||
return new Token(Token.INVALID, toRangeString, yyline+1, yycolumn+1-toRangeString.length());
|
||||
}
|
||||
}
|
||||
case 43: break;
|
||||
case 21:
|
||||
{ toRangeString += yytext(); System.out.println("TO DOT <"+toRangeString+"> / " + yyline + " - " + yycolumn);
|
||||
if (toRangeString.length() % 2 == 0) {
|
||||
String result = toRangeString;
|
||||
toRangeString = "";
|
||||
return new Token(Token.TO, result, yyline+1, yycolumn+1-1);
|
||||
}
|
||||
}
|
||||
case 44: break;
|
||||
case 22:
|
||||
{ yybegin(EXP); numberString += yytext(); exponent = yycharat(1) - '0'; System.out.println("BEGIN EXP <"+yytext()+"> / exponent: " + exponent);
|
||||
}
|
||||
case 37: break;
|
||||
case 19:
|
||||
case 45: break;
|
||||
case 23:
|
||||
{ return new Token(Token.NULL, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 38: break;
|
||||
case 46: break;
|
||||
default:
|
||||
zzScanError(ZZ_NO_MATCH);
|
||||
}
|
||||
|
||||
@@ -34,6 +34,7 @@ public final class JFlexASScanner {
|
||||
public static final int NULL = 8;
|
||||
public static final int ID = 10;
|
||||
public static final int NUM = 12;
|
||||
public static final int TO = 14;
|
||||
|
||||
/**
|
||||
* ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l
|
||||
@@ -42,7 +43,7 @@ public final class JFlexASScanner {
|
||||
* 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, 3, 3, 4, 4, 5, 5
|
||||
0, 0, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 6, 6
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -64,12 +65,13 @@ public final class JFlexASScanner {
|
||||
private static final int [] ZZ_ACTION = zzUnpackAction();
|
||||
|
||||
private static final String ZZ_ACTION_PACKED_0 =
|
||||
"\6\0\1\1\1\2\1\3\1\4\1\3\1\5\1\6"+
|
||||
"\1\7\1\10\1\11\1\10\1\12\1\13\1\14\1\15"+
|
||||
"\1\16\1\17\1\20\1\21\1\0\1\22\1\0\1\23";
|
||||
"\7\0\1\1\1\2\1\3\1\4\1\5\1\3\1\6"+
|
||||
"\1\7\1\10\1\11\1\12\1\11\1\13\1\14\1\15"+
|
||||
"\1\16\1\17\1\20\1\21\1\22\1\23\1\24\1\25"+
|
||||
"\1\0\1\26\1\0\1\27";
|
||||
|
||||
private static int [] zzUnpackAction() {
|
||||
int [] result = new int[29];
|
||||
int [] result = new int[34];
|
||||
int offset = 0;
|
||||
offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
|
||||
return result;
|
||||
@@ -94,13 +96,14 @@ public final class JFlexASScanner {
|
||||
private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
|
||||
|
||||
private static final String ZZ_ROWMAP_PACKED_0 =
|
||||
"\0\0\0\14\0\30\0\44\0\60\0\74\0\44\0\110"+
|
||||
"\0\44\0\44\0\124\0\44\0\44\0\44\0\44\0\44"+
|
||||
"\0\140\0\44\0\44\0\44\0\44\0\44\0\44\0\44"+
|
||||
"\0\44\0\154\0\44\0\170\0\44";
|
||||
"\0\0\0\14\0\30\0\44\0\60\0\74\0\110\0\44"+
|
||||
"\0\124\0\44\0\44\0\44\0\140\0\44\0\44\0\44"+
|
||||
"\0\44\0\44\0\154\0\44\0\44\0\44\0\44\0\44"+
|
||||
"\0\44\0\44\0\44\0\44\0\44\0\44\0\170\0\44"+
|
||||
"\0\204\0\44";
|
||||
|
||||
private static int [] zzUnpackRowMap() {
|
||||
int [] result = new int[29];
|
||||
int [] result = new int[34];
|
||||
int offset = 0;
|
||||
offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
|
||||
return result;
|
||||
@@ -123,15 +126,15 @@ public final class JFlexASScanner {
|
||||
private static final int [] ZZ_TRANS = zzUnpackTrans();
|
||||
|
||||
private static final String ZZ_TRANS_PACKED_0 =
|
||||
"\1\7\1\10\1\11\1\12\2\7\1\13\2\11\1\14"+
|
||||
"\1\15\1\16\3\17\1\20\1\17\1\21\6\17\3\22"+
|
||||
"\1\23\10\22\14\0\2\24\2\25\2\24\3\25\3\24"+
|
||||
"\2\26\1\27\1\30\1\31\1\26\3\27\3\26\1\0"+
|
||||
"\1\10\21\0\1\32\7\0\1\33\20\0\1\34\13\0"+
|
||||
"\1\35\3\0";
|
||||
"\1\10\1\11\1\12\1\13\1\14\1\10\1\15\2\12"+
|
||||
"\1\16\1\17\1\20\3\21\1\22\1\14\1\23\6\21"+
|
||||
"\3\24\1\25\10\24\14\0\2\26\2\27\2\26\3\27"+
|
||||
"\3\26\2\30\1\31\1\32\1\33\1\30\3\31\3\30"+
|
||||
"\3\34\1\35\1\36\7\34\1\0\1\11\21\0\1\37"+
|
||||
"\7\0\1\40\20\0\1\41\13\0\1\42\3\0";
|
||||
|
||||
private static int [] zzUnpackTrans() {
|
||||
int [] result = new int[132];
|
||||
int [] result = new int[144];
|
||||
int offset = 0;
|
||||
offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
|
||||
return result;
|
||||
@@ -169,11 +172,11 @@ public final class JFlexASScanner {
|
||||
private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
|
||||
|
||||
private static final String ZZ_ATTRIBUTE_PACKED_0 =
|
||||
"\3\0\1\10\2\0\1\11\1\1\2\11\1\1\5\11"+
|
||||
"\1\1\10\11\1\0\1\11\1\0\1\11";
|
||||
"\3\0\1\10\3\0\1\11\1\1\3\11\1\1\5\11"+
|
||||
"\1\1\13\11\1\0\1\11\1\0\1\11";
|
||||
|
||||
private static int [] zzUnpackAttribute() {
|
||||
int [] result = new int[29];
|
||||
int [] result = new int[34];
|
||||
int offset = 0;
|
||||
offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
|
||||
return result;
|
||||
@@ -255,6 +258,7 @@ public final class JFlexASScanner {
|
||||
String numberString = "";
|
||||
int decimalPlace = 0;
|
||||
int exponent = 0;
|
||||
String toRangeString = "";
|
||||
|
||||
private Token numToken(String numberString, int value) {
|
||||
//return new Token(Token.NUM, String.valueOf(intValue), yyline+1, yycolumn+1-String.valueOf(intValue).length());
|
||||
@@ -633,22 +637,32 @@ public final class JFlexASScanner {
|
||||
yybegin(YYINITIAL);
|
||||
return new FracToken(Token.FRAC, numberString, yyline+1, yycolumn+1-numberString.length(), fracValue);
|
||||
}
|
||||
case 30: break;
|
||||
case 35: break;
|
||||
case EXP: {
|
||||
yybegin(YYINITIAL);
|
||||
return new FracToken(Token.FRAC, numberString, yyline+1, yycolumn+1-numberString.length(), fracValue * Math.pow(10, exponent));
|
||||
}
|
||||
case 31: break;
|
||||
case 36: break;
|
||||
case ID: {
|
||||
yybegin(YYINITIAL);
|
||||
return new Token(Token.ID, idValue, yyline+1, yycolumn+1-idValue.length());
|
||||
}
|
||||
case 32: break;
|
||||
case 37: break;
|
||||
case NUM: {
|
||||
yybegin(YYINITIAL);
|
||||
return numToken(numberString, intValue);
|
||||
}
|
||||
case 33: break;
|
||||
case 38: break;
|
||||
case TO: {
|
||||
yybegin(YYINITIAL);
|
||||
if (toRangeString.length() % 2 == 0) {
|
||||
toRangeString = "";
|
||||
return new Token(Token.TO, "..", yyline+1, yycolumn+1-2);
|
||||
} else {
|
||||
return new Token(Token.INVALID, toRangeString, yyline+1, yycolumn+1-toRangeString.length());
|
||||
}
|
||||
}
|
||||
case 39: break;
|
||||
default:
|
||||
{ return new Token(Token.EOF, "", yyline+1, yycolumn+1);
|
||||
}
|
||||
@@ -660,95 +674,128 @@ public final class JFlexASScanner {
|
||||
{ System.out.println("Illegal character <" + yytext() + ">");
|
||||
return new Token(Token.INVALID, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 20: break;
|
||||
case 24: break;
|
||||
case 2:
|
||||
{ /* Ignore */
|
||||
}
|
||||
case 21: break;
|
||||
case 25: break;
|
||||
case 3:
|
||||
{ yybegin(ID); System.out.println("BEGIN ID <"+yytext()+">");
|
||||
idValue = yytext();
|
||||
}
|
||||
case 22: break;
|
||||
case 26: break;
|
||||
case 4:
|
||||
{ yybegin(NUM);
|
||||
intValue = yycharat(0)-'0';
|
||||
numberString = yytext();
|
||||
}
|
||||
case 23: break;
|
||||
case 27: break;
|
||||
case 5:
|
||||
{ yybegin(TO); toRangeString = yytext();
|
||||
}
|
||||
case 28: break;
|
||||
case 6:
|
||||
{ return new Token(Token.LSBR, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 24: break;
|
||||
case 6:
|
||||
case 29: break;
|
||||
case 7:
|
||||
{ return new Token(Token.RSBR, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 25: break;
|
||||
case 7:
|
||||
case 30: break;
|
||||
case 8:
|
||||
{ return new Token(Token.COMMA, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 26: break;
|
||||
case 8:
|
||||
case 31: break;
|
||||
case 9:
|
||||
{ yybegin(YYINITIAL);
|
||||
yypushback(1);
|
||||
return new FracToken(Token.FRAC, numberString, yyline+1, yycolumn+1-numberString.length(), fracValue);
|
||||
}
|
||||
case 27: break;
|
||||
case 9:
|
||||
case 32: break;
|
||||
case 10:
|
||||
{ fracValue += (yycharat(0) - '0') * Math.pow(10, -++decimalPlace); numberString += yytext();
|
||||
}
|
||||
case 28: break;
|
||||
case 10:
|
||||
case 33: break;
|
||||
case 11:
|
||||
{ yybegin(YYINITIAL);
|
||||
yypushback(1);
|
||||
System.out.println("numberString: " + numberString);
|
||||
System.out.println("fracValue: " + fracValue + " / exponent: " + exponent);
|
||||
return new FracToken(Token.FRAC, numberString, yyline+1, yycolumn+1-numberString.length(), fracValue * Math.pow(10, exponent));
|
||||
}
|
||||
case 29: break;
|
||||
case 11:
|
||||
case 34: break;
|
||||
case 12:
|
||||
{ numberString += yytext(); exponent = exponent * 10 + yycharat(0) - '0';
|
||||
}
|
||||
case 30: break;
|
||||
case 12:
|
||||
case 35: break;
|
||||
case 13:
|
||||
{ yybegin(YYINITIAL);
|
||||
yypushback(1);
|
||||
return new Token(Token.ID, idValue, yyline+1, yycolumn+1-idValue.length());
|
||||
}
|
||||
case 31: break;
|
||||
case 13:
|
||||
case 36: break;
|
||||
case 14:
|
||||
{ idValue += yytext();
|
||||
}
|
||||
case 32: break;
|
||||
case 14:
|
||||
case 37: break;
|
||||
case 15:
|
||||
{ yybegin(YYINITIAL);
|
||||
yypushback(1);
|
||||
return numToken(numberString, intValue);
|
||||
}
|
||||
case 33: break;
|
||||
case 15:
|
||||
{ yybegin(ID); idValue = String.valueOf(intValue); yypushback(1);
|
||||
}
|
||||
case 34: break;
|
||||
case 38: break;
|
||||
case 16:
|
||||
{ yybegin(ID); idValue = numberString; yypushback(1);
|
||||
}
|
||||
case 39: break;
|
||||
case 17:
|
||||
{ intValue = intValue * 10 + yycharat(0) - '0'; numberString += yytext();
|
||||
}
|
||||
case 35: break;
|
||||
case 17:
|
||||
case 40: break;
|
||||
case 18:
|
||||
{ yybegin(FRAC);
|
||||
fracValue = intValue;
|
||||
System.out.println("BEGIN FRAC <"+yytext()+">");
|
||||
numberString += yytext();
|
||||
}
|
||||
case 36: break;
|
||||
case 18:
|
||||
case 41: break;
|
||||
case 19:
|
||||
{ yybegin(YYINITIAL); yypushback(1);
|
||||
if (toRangeString.length() % 2 == 0) {
|
||||
toRangeString = "";
|
||||
return new Token(Token.TO, "..", yyline+1, yycolumn+1-2);
|
||||
} else {
|
||||
return new Token(Token.INVALID, toRangeString, yyline+1, yycolumn+1-toRangeString.length());
|
||||
}
|
||||
}
|
||||
case 42: break;
|
||||
case 20:
|
||||
{ yybegin(NUM); yypushback(1);
|
||||
if (toRangeString.length() % 2 == 0) {
|
||||
toRangeString = "";
|
||||
return new Token(Token.TO, "..", yyline+1, yycolumn+1-2);
|
||||
} else {
|
||||
return new Token(Token.INVALID, toRangeString, yyline+1, yycolumn+1-toRangeString.length());
|
||||
}
|
||||
}
|
||||
case 43: break;
|
||||
case 21:
|
||||
{ toRangeString += yytext(); System.out.println("TO DOT <"+toRangeString+">");
|
||||
if (toRangeString.length() % 2 == 0) {
|
||||
String result = toRangeString;
|
||||
toRangeString = "";
|
||||
return new Token(Token.TO, result, yyline+1, yycolumn+1-1);
|
||||
}
|
||||
}
|
||||
case 44: break;
|
||||
case 22:
|
||||
{ yybegin(EXP); numberString += yytext(); exponent = yycharat(1) - '0'; System.out.println("BEGIN EXP <"+yytext()+"> / exponent: " + exponent);
|
||||
}
|
||||
case 37: break;
|
||||
case 19:
|
||||
case 45: break;
|
||||
case 23:
|
||||
{ return new Token(Token.NULL, yytext(), yyline+1, yycolumn+1);
|
||||
}
|
||||
case 38: break;
|
||||
case 46: break;
|
||||
default:
|
||||
zzScanError(ZZ_NO_MATCH);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user