Mathias Landhäußer 11 лет назад
Родитель
Сommit
bc814709ad

+ 32 - 0
jplag.frontend.cpp/.classpath

@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" output="target/classes" path="src/main/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="src" output="target/test-classes" path="src/test/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="src" output="target/classes" path="target/generated-sources/javacc">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>

+ 23 - 0
jplag.frontend.cpp/.project

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>jplag.frontend.cpp</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>

+ 12 - 0
jplag.frontend.cpp/.settings/org.eclipse.jdt.core.prefs

@@ -0,0 +1,12 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.6
+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.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.source=1.6

+ 4 - 0
jplag.frontend.cpp/.settings/org.eclipse.m2e.core.prefs

@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1

+ 118 - 0
jplag.frontend.cpp/pom.xml

@@ -0,0 +1,118 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<artifactId>cpp</artifactId>
+	<version>0.0.2-SNAPSHOT</version>
+
+	<repositories>
+		<repository>
+			<id>ipdNexus</id>
+			<name>Recaa Repository</name>
+			<url>http://bob.ipd.kit.edu/nexus/content/repositories/public/</url>
+		</repository>
+	</repositories>
+
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.codehaus.mojo</groupId>
+				<artifactId>build-helper-maven-plugin</artifactId>
+				<version>1.7</version>
+				<configuration>
+					<sources>
+						<source>target/generated-sources/javacc</source>
+					</sources>
+				</configuration>
+				<executions>
+					<execution>
+						<id>add-javacc-source</id>
+						<phase>generate-sources</phase>
+						<goals>
+							<goal>add-source</goal>
+						</goals>
+
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
+				<groupId>org.codehaus.mojo</groupId>
+				<artifactId>javacc-maven-plugin</artifactId>
+				<version>2.6</version>
+				<configuration>
+					<configuration>
+						<debugparser>false</debugparser>
+						<isStatic>false</isStatic>  
+						<grammarEncoding>${project.build.sourceEncoding}</grammarEncoding>
+					</configuration>
+				</configuration>
+				<executions>
+					<execution>
+						<id>javacc</id>
+						<goals>
+							<goal>javacc</goal>
+						</goals>
+					</execution>
+				</executions>
+				<dependencies>
+					<dependency>
+						<groupId>net.java.dev.javacc</groupId>
+						<artifactId>javacc</artifactId>
+						<version>3.2</version>
+					</dependency>
+				</dependencies>
+			</plugin>
+		</plugins>
+		<pluginManagement>
+			<plugins>
+				<!--This plugin's configuration is used to store Eclipse m2e settings 
+					only. It has no influence on the Maven build itself. -->
+				<plugin>
+					<groupId>org.eclipse.m2e</groupId>
+					<artifactId>lifecycle-mapping</artifactId>
+					<version>1.0.0</version>
+					<configuration>
+						<lifecycleMappingMetadata>
+							<pluginExecutions>
+								<pluginExecution>
+									<pluginExecutionFilter>
+										<groupId>
+											org.codehaus.mojo
+										</groupId>
+										<artifactId>
+											javacc-maven-plugin
+										</artifactId>
+										<versionRange>
+											[2.6]
+										</versionRange>
+										<goals>
+											<goal>javacc</goal>
+										</goals>
+									</pluginExecutionFilter>
+									<action>
+										<ignore></ignore>
+									</action>
+								</pluginExecution>
+							</pluginExecutions>
+						</lifecycleMappingMetadata>
+					</configuration>
+				</plugin>
+			</plugins>
+		</pluginManagement>
+	</build>
+
+	<dependencies>
+		<dependency>
+			<groupId>edu.kit.ipd.jplag</groupId>
+			<artifactId>frontend-utils</artifactId>
+		</dependency>
+	</dependencies>
+	<parent>
+		<groupId>edu.kit.ipd.jplag.frontend</groupId>
+		<artifactId>frontend-parent</artifactId>
+		<version>0.3-SNAPSHOT</version>
+	</parent>
+	<properties>
+		<project.build.source>1.6</project.build.source>
+		<project.build.target>1.6</project.build.target>
+	</properties>
+</project>

+ 91 - 0
jplag.frontend.cpp/src/main/java/jplag/cpp/CPPToken.java

@@ -0,0 +1,91 @@
+package jplag.cpp;
+
+public class CPPToken extends jplag.Token implements CPPTokenConstants {
+	private static final long serialVersionUID = 1L;
+	private int line;
+
+	public CPPToken(int type, String file, int zeile) {
+		super(type,file,zeile);
+	}
+
+	public int getLine() { return line; }
+	public void setLine(int line) { this.line = line; }
+
+	public int getColumn() {return 0;}
+	public int getLength() {return 0;}
+
+	public static String type2string(int type) {
+		switch (type) {
+			case CPPTokenConstants.FILE_END:
+									return "********";
+
+			case C_BLOCK_BEGIN:     return "BLOCK{";
+			case C_BLOCK_END:       return "}BLOCK";
+			case C_SCOPE:           return "SCOPE";
+			case C_QUESTIONMARK:    return "COND";
+			case C_ELLIPSIS:        return "...";
+			case C_ASSIGN:          return "ASSIGN";
+			case C_DOT:             return "DOT";
+			case C_ARROW:           return "ARROW";
+			case C_DOTSTAR:         return "DOTSTAR";
+			case C_ARROWSTAR:       return "ARROWSTAR";
+			case C_AUTO:            return "AUTO";
+			case C_BREAK:           return "BREAK";
+			case C_CASE:            return "CASE";
+			case C_CATCH:           return "CATCH";
+			case C_CHAR:            return "CHAR";
+			case C_CONST:           return "CONST";
+			case C_CONTINUE:        return "CONTINUE";
+			case C_DEFAULT:         return "DEFAULT";
+			case C_DELETE:          return "DELETE";
+			case C_DO:              return "DO";
+			case C_DOUBLE:          return "DOUBLE";
+			case C_ELSE:            return "ELSE";
+			case C_ENUM:            return "ENUM";
+			case C_EXTERN:          return "EXTERN";
+			case C_FLOAT:           return "FLOAT";
+			case C_FOR:             return "FOR";
+			case C_FRIEND:          return "FRIEND";
+			case C_GOTO:            return "GOTO";
+			case C_IF:              return "IF";
+			case C_INLINE:          return "INLINE";
+			case C_INT:             return "INT";
+			case C_LONG:            return "LONG";
+			case C_NEW:             return "NEW";
+			case C_PRIVATE:         return "PRIVATE";
+			case C_PROTECTED:       return "PROTECTED";
+			case C_PUBLIC:          return "PUBLIC";
+			case C_REDECLARED:      return "REDECLARED";
+			case C_REGISTER:        return "REGISTER";
+			case C_RETURN:          return "RETURN";
+			case C_SHORT:           return "SHORT";
+			case C_SIGNED:          return "SIGNED";
+			case C_SIZEOF:          return "SIZEOF";
+			case C_STATIC:          return "STATIC";
+			case C_STRUCT:          return "STRUCT";
+			case C_CLASS:           return "CLASS";
+			case C_SWITCH:          return "SWITCH";
+			case C_TEMPLATE:        return "TEMPLATE";
+			case C_THIS:            return "THIS";
+			case C_TRY:             return "TRY";
+			case C_TYPEDEF:         return "TYPEDEF";
+			case C_UNION:           return "UNION";
+			case C_UNSIGNED:        return "UNSIGNED";
+			case C_VIRTUAL:         return "VIRTUAL";
+			case C_VOID:            return "VOID";
+			case C_VOLANTILE:       return "VOLANTILE";
+			case C_WHILE:           return "WHILE";
+			case C_OPERATOR:        return "OPERATOR";
+			case C_THROW:           return "THROW";
+			case C_ID:              return "ID";
+			case C_FUN:             return "FUN";
+			case C_NULL:            return "NULL";
+
+			default:                return "<UNBEKANNT>";
+		}
+	}
+
+	public static int numberOfTokens() { 
+		return NUM_DIFF_TOKENS;
+	} 
+}

+ 72 - 0
jplag.frontend.cpp/src/main/java/jplag/cpp/CPPTokenConstants.java

@@ -0,0 +1,72 @@
+package jplag.cpp;
+
+public interface CPPTokenConstants extends jplag.TokenConstants {
+  final static int FILE_END = 0;
+  // Used to optionally separate methods from each other
+  // with an always marked token
+  final static int SEPARATOR_TOKEN = 1;
+
+  final static int C_BLOCK_BEGIN = 2;
+  final static int C_BLOCK_END = 3;
+  final static int C_SCOPE = 4;
+  final static int C_QUESTIONMARK = 5;
+  final static int C_ELLIPSIS = 6;
+  final static int C_ASSIGN = 7;
+  final static int C_DOT = 8;
+  final static int C_ARROW = 9;
+  final static int C_ARROWSTAR = 10;
+  final static int C_AUTO = 11;
+  final static int C_BREAK = 12;
+  final static int C_CASE = 13;
+  final static int C_CATCH = 14;
+  final static int C_CHAR = 15;
+  final static int C_CONST = 16;
+  final static int C_CONTINUE = 17;
+  final static int C_DEFAULT = 18;
+  final static int C_DELETE = 19;
+  final static int C_DO = 20;
+  final static int C_DOUBLE = 21;
+  final static int C_ELSE = 22;
+  final static int C_ENUM = 23;
+  final static int C_EXTERN = 24;
+  final static int C_FLOAT = 25;
+  final static int C_FOR = 26;
+  final static int C_FRIEND = 27;
+  final static int C_GOTO = 28;
+  final static int C_IF = 29;
+  final static int C_INLINE = 30;
+  final static int C_INT = 31;
+  final static int C_LONG = 32;
+  final static int C_NEW = 33;
+  final static int C_PRIVATE = 34;
+  final static int C_PROTECTED = 35;
+  final static int C_PUBLIC = 36;
+  final static int C_REDECLARED = 37;
+  final static int C_REGISTER = 38;
+  final static int C_RETURN = 39;
+  final static int C_SHORT = 40;
+  final static int C_SIGNED = 41;
+  final static int C_SIZEOF = 42;
+  final static int C_STATIC = 43;
+  final static int C_STRUCT = 44;
+  final static int C_CLASS = 45;
+  final static int C_SWITCH = 46;
+  final static int C_TEMPLATE = 47;
+  final static int C_THIS = 48;
+  final static int C_TRY = 49;
+  final static int C_TYPEDEF = 50;
+  final static int C_UNION = 51;
+  final static int C_UNSIGNED = 52;
+  final static int C_VIRTUAL = 53;
+  final static int C_VOID = 54;
+  final static int C_VOLANTILE = 55;
+  final static int C_WHILE = 56;
+  final static int C_OPERATOR = 57;
+  final static int C_THROW = 58;
+  final static int C_ID = 59;
+  final static int C_FUN = 60;
+  final static int C_DOTSTAR = 61;
+  final static int C_NULL = 62;
+
+  final static int NUM_DIFF_TOKENS = 63;
+}

+ 69 - 0
jplag.frontend.cpp/src/main/java/jplag/cpp/Language.java

@@ -0,0 +1,69 @@
+package jplag.cpp;
+
+import java.io.File;
+
+import jplag.ProgramI;
+
+/*
+ * Leider werden C/C++ nicht geparst, sondern nur gescannt...
+ */
+public class Language implements jplag.Language {
+	private Scanner scanner;
+
+	public Language(ProgramI program) {
+		this.scanner = new Scanner();
+		this.scanner.setProgram(program);
+
+	}
+
+	public int errorsCount() {
+		// TODO Auto-generated method stub
+		return this.scanner.errorsCount();
+	}
+
+	public String[] suffixes() {
+		String[] res = { ".cpp", ".CPP", "c++", "C++", ".c", ".C", ".h", ".H",
+				".hpp", ".HPP" };
+		return res;
+	}
+
+	public String name() {
+		return "C/C++ Scanner [basic markup]";
+	}
+
+	public String getShortName() {
+		return "cpp";
+	}
+
+	public int min_token_match() {
+		return 12;
+	}
+
+	public boolean supportsColumns() {
+		return false;
+	}
+
+	public boolean isPreformated() {
+		return true;
+	}
+
+	public boolean usesIndex() {
+		return false;
+	}
+
+	public jplag.Structure parse(File dir, String[] files) {
+		return this.scanner.scan(dir, files);
+	}
+
+	public boolean errors() {
+		return this.scanner.getErrors();
+	}
+
+	public int noOfTokens() {
+		return jplag.cpp.CPPToken.numberOfTokens();
+	}
+
+	public String type2string(int type) {
+		return jplag.cpp.CPPToken.type2string(type);
+	}
+}

+ 44 - 0
jplag.frontend.cpp/src/main/java/jplag/cpp/Scanner.java

@@ -0,0 +1,44 @@
+package jplag.cpp;
+
+import java.io.File;
+
+import jplag.Parser;
+import jplag.StrippedProgram;
+
+public class Scanner extends Parser implements CPPTokenConstants {
+	private String actFile;
+
+	private jplag.Structure struct;
+
+	public static void main(String args[]) {
+		System.out.print("File: ");
+		for (int i = 0; i < args.length; i++) {
+			System.out.print(args[i] + " ");
+		}
+		System.out.println();
+
+		Scanner scanner = new Scanner();
+		scanner.setProgram(new StrippedProgram());
+
+		jplag.Structure s = scanner.scan(new File("."), args);
+	}
+
+	public jplag.Structure scan(File dir, String files[]) {
+		struct = new jplag.Structure();
+		errors = 0;
+		CPPScanner scanner = null;// will be initialized in Method scanFile
+		for (int i = 0; i < files.length; i++) {
+			actFile = files[i];
+		    getProgram().print(null, "Scanning file " + files[i] + "\n");
+			if (!CPPScanner.scanFile(dir, files[i], scanner, this))
+				errors++;
+			struct.addToken(new CPPToken(FILE_END, actFile, 1));
+		}
+		this.parseEnd();
+		return struct;
+	}
+
+	public void add(int type, Token token) {
+		struct.addToken(new CPPToken(type, actFile, token.beginLine));
+	}
+}

+ 456 - 0
jplag.frontend.cpp/src/main/javacc/CPP.jj

@@ -0,0 +1,456 @@
+/* Hey Emacs, this is -*- mode: java; page-delimiter: "^%%$"; -*- */
+
+/* Ein C/C++ Scanner.
+ * ...weil Parsen zu schwierig ist.
+ */
+
+options
+{
+  STATIC = false;
+  IGNORE_CASE = true;
+  DEBUG_PARSER = false;
+  DEBUG_LOOKAHEAD = false;
+  DEBUG_TOKEN_MANAGER = false;
+}
+
+PARSER_BEGIN(CPPScanner)
+package jplag.cpp;
+import java.io.*;
+import jplag.*;
+
+public class CPPScanner implements CPPTokenConstants {
+    private static Scanner scanner2;
+    public static boolean scanFile(File dir, String fileName,
+        jplag.cpp.CPPScanner scanner, jplag.cpp.Scanner scannerX)
+    {
+        try {
+            InputStream in = new NewlineStream(
+                new FileInputStream(new File(dir,fileName)));
+              if (scanner==null) {
+                scanner = new CPPScanner(in);
+              } else {
+                scanner.ReInit(in);
+              }
+              scanner.scanner2=scannerX;
+        } catch (FileNotFoundException e) {
+              System.out.println("C/C++ Scanner:  File " + fileName + " not found.");
+              return false;
+        }
+        try {
+              scanner.scan();
+        } catch (ParseException e) {
+              scannerX.getProgram().addError("  Parsing Error in '" + fileName + "':\n  " + e.getMessage() + "\n");
+              return false;
+        } catch (TokenMgrError e) {
+              scannerX.getProgram().addError("  Scanning Error in '" + fileName + "':\n  " + e.getMessage() + "\n");
+              return false;
+        }
+        return true;
+    }
+
+/*    public static void main(String args[]) {
+        scanFile(new File("."),args[0]);
+    }*/
+}
+PARSER_END(CPPScanner)
+
+
+
+
+SKIP :
+{
+  " "
+| "\t"
+| "\f"
+| "\n"
+| "\r"
+| "\u001a"
+
+| "//" : IN_LINE_COMMENT
+| "/*" : IN_COMMENT
+| "#" : PREPROCESSOR_OUTPUT
+}
+
+<IN_LINE_COMMENT> SKIP:
+{
+   "\n" : DEFAULT
+}
+<IN_LINE_COMMENT> MORE:
+{
+  < ~[] >
+}
+
+<IN_COMMENT> SKIP:
+{
+   "*/" : DEFAULT
+}
+<IN_COMMENT> MORE:
+{
+  < ~[] >
+}
+
+<PREPROCESSOR_OUTPUT> SKIP:
+{
+  "\\" : PREPROCESSOR_OUTPUT2
+}
+<PREPROCESSOR_OUTPUT2> MORE:
+{
+  "\\" : PREPROCESSOR_OUTPUT
+}
+<PREPROCESSOR_OUTPUT> SKIP:
+{
+  "\n" : DEFAULT
+}
+<PREPROCESSOR_OUTPUT2> SKIP:
+{
+  "\n" : PREPROCESSOR_OUTPUT
+}
+<PREPROCESSOR_OUTPUT, PREPROCESSOR_OUTPUT2> MORE:
+{
+  < ~[] >
+}
+
+
+TOKEN :
+{
+  < LCURLYBRACE: "{" >
+| < RCURLYBRACE: "}" >
+| < LSQUAREBRACKET: "[" >
+| < RSQUAREBRACKET: "]" >
+| < LPARENTHESIS: "(" >
+| < RPARENTHESIS: ")" >
+| < SCOPE: "::" >
+| < COLON: ":" >
+| < SEMICOLON: ";" >
+| < COMMA: "," >
+| < QUESTIONMARK: "?" >
+| < ELLIPSIS: "..." >
+| < ASSIGNEQUAL: "=" >
+| < TIMESEQUAL: "*=" >
+| < DIVIDEEQUAL: "/=" >
+| < MODEQUAL: "%=" >
+| < PLUSEQUAL: "+=" >
+| < MINUSEQUAL: "-=" >
+| < SHIFTLEFTEQUAL: "<<=" >
+| < SHIFTRIGHTEQUAL: ">>=" >
+| < BITWISEANDEQUAL: "&=" >
+| < BITWISEXOREQUAL: "^=" >
+| < BITWISEOREQUAL: "|=" >
+| < OR: "||" >
+| < AND: "&&" >
+| < BITWISEOR: "|" >
+| < BITWISEXOR: "^" >
+| < AMPERSAND: "&" >
+| < EQUAL: "==" >
+| < NOTEQUAL: "!=" >
+| < LESSTHAN: "<" >
+| < GREATERTHAN: ">" >
+| < LESSTHANOREQUALTO: "<=" >
+| < GREATERTHANOREQUALTO: ">=" >
+| < SHIFTLEFT: "<<" >
+| < SHIFTRIGHT: ">>" >
+| < PLUS: "+" >
+| < MINUS: "-" >
+| < STAR: "*" >
+| < DIVIDE: "/" >
+| < MOD: "%" >
+| < PLUSPLUS: "++" >
+| < MINUSMINUS: "--" >
+| < TILDE: "~" >
+| < NOT: "!" >
+| < DOT: "." >
+| < POINTERTO: "->" >
+| < DOTSTAR: ".*" >
+| < ARROWSTAR: "->*" >
+| < AUTO: "auto" >
+| < BREAK: "break" >
+| < CASE: "case" >
+| < CATCH: "catch" >
+| < CHAR: "char" >
+| < CONST: "const" >
+| < CONTINUE: "continue" >
+| < _DEFAULT: "default" >
+| < DELETE: "delete" >
+| < DO: "do" >
+| < DOUBLE: "double" >
+| < ELSE: "else" >
+| < ENUM: "enum" >
+| < EXTERN: "extern" >
+| < FLOAT: "float" >
+| < FOR: "for" >
+| < FRIEND: "friend" >
+| < GOTO: "goto" >
+| < IF: "if" >
+| < INLINE: "inline" >
+| < INT: "int" >
+| < LONG: "long" >
+| < NEW: "new" >
+| < PRIVATE: "private" >
+| < PROTECTED: "protected" >
+| < PUBLIC: "public" >
+| < REDECLARED: "redeclared" >
+| < REGISTER: "register" >
+| < RETURN: "return" >
+| < SHORT: "short" >
+| < SIGNED: "signed" >
+| < SIZEOF: "sizeof" >
+| < STATIC: "static" >
+| < STRUCT: "struct" >
+| < CLASS : "class" >
+| < SWITCH: "switch" >
+| < TEMPLATE: "template" >
+| < THIS: "this" >
+| < TRY: "try" >
+| < TYPEDEF: "typedef" >
+| < UNION: "union" >
+| < UNSIGNED: "unsigned" >
+| < VIRTUAL: "virtual" >
+| < VOID: "void" >
+| < VOLATILE: "volatile" >
+| < WHILE: "while" >
+| < OPERATOR: "operator" >
+| < TRUETOK: "true" >
+| < FALSETOK: "false" >
+| < THROW: "throw" >
+| < NULL: "NULL" >
+| < BACKSLASH: "\\">
+}
+
+TOKEN [IGNORE_CASE] :
+{
+  <  OCTALINT : "0" (["0"-"7"])* >
+| <  OCTALLONG : <OCTALINT> "l" >
+| <  UNSIGNED_OCTALINT : <OCTALINT> "u" >
+| <  UNSIGNED_OCTALLONG : <OCTALINT> ("ul" | "lu") >
+
+| <  DECIMALINT : ["1"-"9"] (["0"-"9"])* >
+| <  DECIMALLONG : <DECIMALINT> ["u","l"] >
+| <  UNSIGNED_DECIMALINT : <DECIMALINT> "u" >
+| <  UNSIGNED_DECIMALLONG : <DECIMALINT> ("ul" | "lu") >
+
+| <  HEXADECIMALINT : "0x" (["0"-"9","a"-"f"])+ >
+| <  HEXADECIMALLONG : <HEXADECIMALINT> (["u","l"])? >
+| <  UNSIGNED_HEXADECIMALINT : <HEXADECIMALINT> "u" >
+| <  UNSIGNED_HEXADECIMALLONG : <HEXADECIMALINT> ("ul" | "lu") >
+
+
+| <  FLOATONE : ((["0"-"9"])+ "." (["0"-"9"])* | (["0"-"9"])* "." (["0"-"9"])+)
+              ("e" (["-","+"])? (["0"-"9"])+)? (["f","l"])? >
+
+| <  FLOATTWO : (["0"-"9"])+ "e" (["-","+"])?  (["0"-"9"])+ (["f","l"])? >
+}
+
+TOKEN :
+{
+  <  CHARACTER : ("L")? "'"
+   (   (~["'","\\","\n","\r"])
+   | ("\\" (
+             ["n","t","v","b","r","f","a","\\","?","'","\""]
+           | "0" (["0"-"7"])*
+           | ["1"-"9"] (["0"-"9"])*
+           | ("0x" | "0X") (["0"-"9","a"-"f","A"-"F"])+
+           )
+     )
+   )
+   "'" >
+
+| <  STRING : ("L")? "\""
+   ( ( ~["\"","\\"])
+   | ("\\" (
+             ["n","t","v","b","r","f","a","\\","?","'","\""]
+           | "0" (["0"-"7"])*
+           | ["1"-"9"] (["0"-"9"])*
+           | ("0")? ("X" | "x" | "u") (["0"-"9","a"-"f","A"-"F"])+
+	   | "\n"
+           )
+     )
+   )*
+   "\"" >
+}
+
+TOKEN :
+{
+  <  ID : ["a"-"z","A"-"Z", "_"] (["a"-"z","A"-"Z","0"-"9","_"])* >
+}
+
+
+
+void scan(): {}
+{
+  (token())* <EOF>
+}
+
+void token(): {}
+{
+  "{"            { scanner2.add(C_BLOCK_BEGIN,token); }
+| "}"            { scanner2.add(C_BLOCK_END,token); }
+| "["
+| "]"
+| "("
+| ")"
+| "::"           { scanner2.add(C_SCOPE,token); }
+| ":"
+| ";"
+| ","
+| "?"            { scanner2.add(C_QUESTIONMARK,token); }
+| "..."          { scanner2.add(C_ELLIPSIS,token); }
+| "="            { scanner2.add(C_ASSIGN,token); }
+| "*="           { scanner2.add(C_ASSIGN,token); }
+| "/="           { scanner2.add(C_ASSIGN,token); }
+| "%="           { scanner2.add(C_ASSIGN,token); }
+| "+="           { scanner2.add(C_ASSIGN,token); }
+| "-="           { scanner2.add(C_ASSIGN,token); }
+| "<<="          { scanner2.add(C_ASSIGN,token); }
+| ">>="          { scanner2.add(C_ASSIGN,token); }
+| "&="           { scanner2.add(C_ASSIGN,token); }
+| "^="           { scanner2.add(C_ASSIGN,token); }
+| "|="           { scanner2.add(C_ASSIGN,token); }
+| "||"
+| "&&"
+| "|"
+| "^"
+| "&"
+| "=="
+| "!="
+| "<"
+| ">"
+| "<="
+| ">="
+| "<<"
+| ">>"
+| "+" 
+| "-" 
+| "*" 
+| "/" 
+| "%" 
+| "++"           { scanner2.add(C_ASSIGN,token); }
+| "--"           { scanner2.add(C_ASSIGN,token); }
+| "~" 
+| "!" 
+| "auto"         { scanner2.add(C_AUTO,token); }
+| "break"        { scanner2.add(C_BREAK,token); }
+| "case"         { scanner2.add(C_CASE,token); }
+| "catch"        { scanner2.add(C_CATCH,token); }
+| "char"         { scanner2.add(C_CHAR,token); }
+| "const"        { scanner2.add(C_CONST,token); }
+| "continue"     { scanner2.add(C_CONTINUE,token); }
+| "default"      { scanner2.add(C_DEFAULT,token); }
+| "delete"       { scanner2.add(C_DELETE,token); }
+| "do"           { scanner2.add(C_DO,token); }
+| "double"       { scanner2.add(C_DOUBLE,token); }
+| "else"         { scanner2.add(C_ELSE,token); }
+| "enum"         { scanner2.add(C_ENUM,token); }
+| "extern"       { scanner2.add(C_EXTERN,token); }
+| "float"        { scanner2.add(C_FLOAT,token); }
+| "for"          { scanner2.add(C_FOR,token); }
+| "friend"       { scanner2.add(C_FRIEND,token); }
+| "goto"         { scanner2.add(C_GOTO,token); }
+| "if"           { scanner2.add(C_IF,token); }
+| "inline"       { scanner2.add(C_INLINE,token); }
+| "int"          { scanner2.add(C_INT,token); }
+| "long"         { scanner2.add(C_LONG,token); }
+| "new"          { scanner2.add(C_NEW,token); }
+| "private"      { scanner2.add(C_PRIVATE,token); }
+| "protected"    { scanner2.add(C_PROTECTED,token); }
+| "public"       { scanner2.add(C_PUBLIC,token); }
+| "redeclared"   { scanner2.add(C_REDECLARED,token); }
+| "register"     { scanner2.add(C_REGISTER,token); }
+| "return"       { scanner2.add(C_RETURN,token); }
+| "short"        { scanner2.add(C_SHORT,token); }
+| "signed"       { scanner2.add(C_SIGNED,token); }
+| "sizeof"       { scanner2.add(C_SIZEOF,token); }
+| "static"       { scanner2.add(C_STATIC,token); }
+| "struct"       { scanner2.add(C_STRUCT,token); }
+| "class"        { scanner2.add(C_CLASS,token); }
+| "switch"       { scanner2.add(C_SWITCH,token); }
+| "template"     { scanner2.add(C_TEMPLATE,token); }
+| "this"         { scanner2.add(C_THIS,token); }
+| "try"          { scanner2.add(C_TRY,token); }
+| "typedef"      { scanner2.add(C_TYPEDEF,token); }
+| "union"        { scanner2.add(C_UNION,token); }
+| "unsigned"     { scanner2.add(C_UNSIGNED,token); }
+| "virtual"      { scanner2.add(C_VIRTUAL,token); }
+| "void"         { scanner2.add(C_VOID,token); }
+| "volatile"     { scanner2.add(C_VOLANTILE,token); }
+| "while"        { scanner2.add(C_WHILE,token); }
+| "operator"     { scanner2.add(C_OPERATOR,token); }
+| "true"         
+| "false"        
+| "throw"        { scanner2.add(C_THROW,token); }
+| "NULL"         { scanner2.add(C_NULL,token); }
+
+| <OCTALINT>                  
+| <OCTALLONG>                 
+| <UNSIGNED_OCTALINT>         
+| <UNSIGNED_OCTALLONG>        
+| <DECIMALINT>                
+| <DECIMALLONG>               
+| <UNSIGNED_DECIMALINT>       
+| <UNSIGNED_DECIMALLONG>      
+
+| <HEXADECIMALINT>            
+| <HEXADECIMALLONG>           
+| <UNSIGNED_HEXADECIMALINT>   
+| <UNSIGNED_HEXADECIMALLONG>  
+
+| <FLOATONE>                  
+| <FLOATTWO>                  
+
+| <CHARACTER>                 
+| <STRING>                    
+
+| <BACKSLASH>
+
+       //| var() [LOOKAHEAD(2) "("        { scanner2.add(C_FUN,token); } ]
+| "."
+| "->" 
+| ".*" 
+| "->*"
+| <ID>
+}
+
+void var(): {}
+{
+    <ID> [LOOKAHEAD(2) "[" [index()] "]"] [var1()]
+}
+
+void var1(): {}
+{
+  ("." | "->" | ".*" | "->*") <ID> [LOOKAHEAD(2) "[" [index()] "]"] [var2()]
+}
+
+void var2(): {}
+{
+  ("." | "->" | ".*" | "->*") <ID> [LOOKAHEAD(2) "[" [index()] "]"] [var3()]
+}
+
+void var3(): {}
+{
+  ("." | "->" | ".*" | "->*") <ID> [LOOKAHEAD(2) "[" [index()] "]"]
+    (("." | "->" | ".*" | "->*") <ID> [LOOKAHEAD(2) "[" [index()] "]"])*
+}
+
+
+void index(): {}
+{
+  var()
+| <OCTALINT>                  
+| <OCTALLONG>                 
+| <UNSIGNED_OCTALINT>         
+| <UNSIGNED_OCTALLONG>        
+| <DECIMALINT>                
+| <DECIMALLONG>               
+| <UNSIGNED_DECIMALINT>       
+| <UNSIGNED_DECIMALLONG>      
+
+| <HEXADECIMALINT>            
+| <HEXADECIMALLONG>           
+| <UNSIGNED_HEXADECIMALINT>   
+| <UNSIGNED_HEXADECIMALLONG>  
+
+}
+
+
+
+
+