diff --git a/ast/Ast.jjt b/ast/Ast.jjt old mode 100755 new mode 100644 index fdfed9f121c636915183788df770fd71acf46f49..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 --- a/ast/Ast.jjt +++ b/ast/Ast.jjt @@ -1,488 +0,0 @@ -options { - MULTI=true; - VISITOR=true; - NODE_DEFAULT_VOID=true; - NODE_PACKAGE="ast.AST"; - STATIC=false; - NODE_SCOPE_HOOK= true; //added! -} - -PARSER_BEGIN(Ast) - -package ast.AST; - -import java.util.*; - -public class Ast { - - private LinkedList errorList = new LinkedList(); - public String fileName; - - public Iterator getErrors() { - return errorList.iterator(); - } - - public Collection parseErrors() { - return errorList; - } - - private void error_skipto(int kind) { - ParseException e = generateParseException(); - - StringBuffer msg = new StringBuffer(); - - msg.append(Integer.toString(e.currentToken.next.beginLine)); - msg.append(";"); - msg.append(Integer.toString(e.currentToken.next.beginColumn)); - msg.append(";"); - - /* - - StringBuffer expected = new StringBuffer(); - int maxSize = 0; - for(int i = 0; i < e.expectedTokenSequences.length; i++) { - if(maxSize < e.expectedTokenSequences[i].length) { - maxSize = e.expectedTokenSequences[i].length; - } - for(int j = 0; j < e.expectedTokenSequences[i].length; j++) { - expected.append(e.tokenImage[e.expectedTokenSequences[i][j]] + " "); - } - if(e.expectedTokenSequences[i][e.expectedTokenSequences[i].length - 1] != 0) { - expected.append("..."); - } - expected.append(", "); - } - - Token prev = e.currentToken; - Token tok = e.currentToken.next; - for(int i = 0; i < maxSize; i++) { - prev = tok; - if(tok.kind == 0) { - break; - } - tok = tok.next; - } - - msg.append(Integer.toString(prev.endLine)); - msg.append(";"); - msg.append(Integer.toString(prev.endColumn)); - msg.append(";"); - - msg.append(expected.toString()); - */ - - msg.append(Integer.toString(e.currentToken.next.endLine)); - msg.append(";"); - msg.append(Integer.toString(e.currentToken.next.endColumn)); - msg.append(";"); - msg.append("Syntax error"); - errorList.add(msg.toString()); - - //System.err.println(e.toString()); - Token t; - do { - t = getNextToken(); - } while(t.kind != AstConstants.EOF && t.kind != kind); - } - - /* ------ Added methods for NODE_SCOPE_HOOKS ---------*/ - public void jjtreeOpenNodeScope(Node n) { - ((SimpleNode) n).firstToken = getToken(1); - } - - public void jjtreeCloseNodeScope(Node n) { - ((SimpleNode) n).lastToken = getToken(0); - } - -} - -PARSER_END(Ast) -/* WHITE SPACE */ - -SPECIAL_TOKEN : -{ - " " -| "\t" -| "\n" -| "\r" -| "\f" -} - -/* COMMENTS */ - -MORE : -{ - "//" : IN_SINGLE_LINE_COMMENT -| - <"/**" ~["/"]> { input_stream.backup(1); } : IN_FORMAL_COMMENT -| - "/*" : IN_MULTI_LINE_COMMENT -} -<IN_SINGLE_LINE_COMMENT> -SPECIAL_TOKEN : -{ - <SINGLE_LINE_COMMENT: "\n" | "\r" | "\r\n" > : DEFAULT -} - -<IN_FORMAL_COMMENT> -SPECIAL_TOKEN : -{ - <FORMAL_COMMENT: "*/" > : DEFAULT -} - -<IN_MULTI_LINE_COMMENT> -SPECIAL_TOKEN : -{ - <MULTI_LINE_COMMENT: "*/" > : DEFAULT -} - -<IN_SINGLE_LINE_COMMENT,IN_FORMAL_COMMENT,IN_MULTI_LINE_COMMENT> -MORE : -{ - < ~[] > -} - -/* -SKIP : -{ - " " -| "\t" -| "\n" -| "\r" -| <"//" (~["\n","\r"])* ("\n"|"\r"|"\r\n")> -} -*/ - -TOKEN : /* Reserved words */ -{ - < ABSTRACT: "abstract" > - | < SEMICOLON: ";" > - | < BOOLEAN: "boolean" > - | < CHAR: "char" > - | < BYTE: "byte" > - | < SHORT: "short" > - | < INT: "int" > - | < LONG: "long" > - | < FLOAT: "float" > - | < DOUBLE: "double" > - | < SUPER: "super" > - | < EXTENDS: "extends" > - // EMMA_2011-12-05: Adding words "region" for grammar annotations for coarse dependency tracking - | < REGION: "region" > - // -} - -TOKEN : /* Literals */ -{ < ID: <LETTER> (<LETTER>|<DIGIT>)* > -| < #LETTER: ["_","a"-"z","A"-"Z"] > -| < #DIGIT: ["0"-"9"] > -} - -Grammar Grammar() #Grammar: {} -{ - ClassList() - // EMMA_2011-12-05: Coarse dependency tracking, allow a list of region declarations in the grammar - RegionList() - // - { return jjtThis; } -} - -// EMMA_2011-12-05: Coarse dependency tracking, region declaration list and region declaration -void RegionList() #List : {} -{ - ( RegionDecl() )* -} -void RegionDecl() #RegionDecl : {} -{ - <REGION> IdUse() <SEMICOLON> -} -// - - -void ClassList() #List: {} -{ - ( - try { - Class() - } catch(ParseException e) { - } - )* - // (Class())* -} - -void Class() #ASTDecl : { Token first = null, last; } -{ - try { - ((Abstract() { first = token; } #Opt(1)) | ({} #Opt(0))) -// [Abstract() { first = token; }] #Opt - IdDecl() { if(first == null) first = token; } - OptSuperClass() ComponentsList() Attributes() - <SEMICOLON> { - last = token; - jjtThis.setFileName(fileName); - jjtThis.setStartLine(first.beginLine); - jjtThis.setEndLine(last.endLine); - jjtThis.setComment(jjtThis.unparseComment()); - } - } catch(ParseException e) { - error_skipto(SEMICOLON); - throw e; -// jjtree.clearNodeScope(jjtThis); -// jjtc000 = false; - } -} - -void Attributes() : {} -{ - {} #List(0) // SynAttrDecl - {} #List(0) // SynEq - {} #List(0) // InhAttrDecl - {} #List(0) // InhEq - {} #List(0) // ClassBodyDecl - {} #List(0) // Rewrite - {} #List(0) // CollDecl - {} #List(0) // CollEq -} - -void OptAbstract() #Opt: {} -{ [Abstract()] -} - -void Abstract() #Abstract: {} -{ "abstract" -} - -void OptSuperClass() #Opt: {} -{ [":" IdUse()] -} - -void ComponentsList() #List: {} -{ [ "::=" (Components())* ] -} - -void Components(): {} -{ - - LOOKAHEAD(OptName() IdUse() "*") - ListComponents() -| OptionalComponent() -| TokenComponent() -| AggregateComponents() -| LOOKAHEAD("/" OptName() IdUse() "*") - ListComponentsNTA() -| LOOKAHEAD("/" "[") - OptionalComponentNTA() -| LOOKAHEAD("/" "<") - TokenComponentNTA() -| AggregateComponentsNTA() -} - -void ListComponents() #ListComponents: {} -{ Id() "*" -} - -void ListComponentsNTA() #ListComponentsNTA: {} -{ "/" Id() "*" "/" -} - -void OptionalComponent() #OptionalComponent: {} -{ "[" Id() "]" -} - -void OptionalComponentNTA() #OptionalComponentNTA: {} -{ "/" "[" Id() "]" "/" -} - -void TokenComponent() #TokenComponent:{} -{ "<" TokenId() ">" -} - -void TokenComponentNTA() #TokenComponentNTA:{} -{ "/" "<" TokenId() ">" "/" -} - -void AggregateComponents() #AggregateComponents:{} -{ Id() -} - -void AggregateComponentsNTA() #AggregateComponentsNTA:{} -{ "/" Id() "/" -} - -void Id() #Id: {} -{ OptName() IdUse() -} - -void OptName() #Opt: {} -{ [LOOKAHEAD(NameNode() ":") NameNode() ":"] -} - -void NameNode() #NameNode: -{ Token t; -} -{ t = <ID> - { - jjtThis.setID(t.image); - } -} - -void IdUse() #IdUse(): -{ Token t; -} -{ t = <ID> - { - jjtThis.setID(t.image); - } -} - -void IdDecl() #IdDecl(): -{ Token t; -} -{ t = <ID> - { jjtThis.setID(t.image); - } -} - - -void TokenId() #TokenId(): -{ Token t; - String type = null; - boolean hasType = false; -} -{ t = <ID> [ ":" type = Type() { hasType = true; } ] -// Default type is String for backward compability - { jjtThis.setID(t.image); - jjtThis.setTYPE(hasType ? type : "String"); - } -} -/*Changed to return string */ -String Type(): -{ String s; } -{ - ( - LOOKAHEAD(2) s = ReferenceType() - | - s = PrimitiveType() - ) - { return s; } -} - -String ReferenceType(): -{ String s; } -{ - ( - s = PrimitiveType() ( LOOKAHEAD(2) "[" "]" { s += "[]"; } )+ - | - ( s = ClassOrInterfaceType() ) ( LOOKAHEAD(2) "[" "]" { s += "[]"; } )* - ) - { return s; } -} - -String ClassOrInterfaceType(): -{ Token t; String s; String u; } -{ - t = <ID> { s = t.image; } [ LOOKAHEAD(2) u = TypeArguments() { s += u; } ] - ( LOOKAHEAD(2) "." t = <ID> { s += "." + t.image; } [ LOOKAHEAD(2) u = TypeArguments() { s += u; } ] )* - { return s; } -} - -String TypeArguments(): -{ String s; String t; } -{ - "<" { s = "<"; } t = TypeArgument() { s += t; } ( "," { s += ","; } t = TypeArgument() { s += t; } )* ">" { s+=">"; } - { return s; } -} - -String TypeArgument(): -{ String s; String t; } -{ - ( - s = ReferenceType() - | - "?" { s = "?"; } [ t = WildcardBounds() { s += t; } ] - ) - { return s; } -} - -String WildcardBounds(): -{ String s; String t; } -{ - ( - "extends" t = ReferenceType() { s = " extends " + t; } - | - "super" t = ReferenceType() { s = " super " + t; } - ) - { return s; } -} - -String PrimitiveType(): -{ Token t; } -{ -( - t = "boolean" -| - t = "char" -| - t = "byte" -| - t = "short" -| - t = "int" -| - t = "long" -| - t = "float" -| - t = "double" -) -{ return t.image; } -} - -/* -String Type() : -{ - String t; - StringBuffer b = new StringBuffer(); -} -{ - (( t = PrimitiveType() | t = Name() ) { b.append(t); } ( "[" "]" { b.append("[]");} )*) -{return b.toString();} - -} - -String PrimitiveType() : -{Token t;} -{ - (t = "boolean" -| - t = "char" -| - t = "byte" -| - t = "short" -| - t = "int" -| - t = "long" -| - t = "float" -| - t = "double") -{return t.image; } -} -*/ - -/* Changed to return token */ -String Name() : -/* - * A lookahead of 2 is required below since "Name" can be followed - * by a ".*" when used in the context of an "ImportDeclaration". - */ -{Token t; StringBuffer s = new StringBuffer();} -{ - t = <ID> { s.append(t.image); } - ( LOOKAHEAD(2) "." t = <ID> { s.append("." + t.image); } - )* -{ return s.toString();} -} - diff --git a/build.xml b/build.xml index 4169a34e4092f7e0f9605e23e23dd932bdbeda20..8f4e6b77f7784736db379f92b09b646835bd0c41 100644 --- a/build.xml +++ b/build.xml @@ -1,6 +1,6 @@ <project name="JastAdd2" default="build"> - <property name="spec.dir" location="${basedir}"/> + <property name="spec.dir" location="spec"/> <property name="src.dir" location="src"/> <property name="gen.dir" location="${src.dir}/gen"/> <property name="bin.dir" location="bin"/> @@ -28,23 +28,18 @@ <target name="build" description="generate sources and build JastAdd2" depends="build-resources"> - <mkdir dir="${gen.dir}/ast/AST"/> + <mkdir dir="${gen.dir}/ast"/> <mkdir dir="${gen.dir}/jrag/AST"/> <mkdir dir="${bin.dir}"/> - <copy todir="${gen.dir}/ast"> - <fileset dir="${basedir}/ast"> - <include name="**/*.java"/> - </fileset> - </copy> <copy todir="${gen.dir}/jrag"> - <fileset dir="${basedir}/jrag"> - <include name="**/*.java"/> - </fileset> + <fileset dir="${spec.dir}/javacc/jrag"> + <include name="**/*.java"/> + </fileset> </copy> <jastadd java14="true" jjtree="true" rewrite="true" grammar="Ast" package="ast.AST" outdir="${gen.dir}" lazyMaps="false"> - <fileset dir="ast" includes="*.jrag,*.jadd,*.ast"/> + <fileset dir="${spec.dir}/jastadd/ast" includes="*.jrag,*.jadd,*.ast"/> </jastadd> <mkdir dir="ast/AST"/> <!-- Ast.jjt must be touched, or Ant will not run jjtree --> @@ -52,20 +47,20 @@ <java classpath="${tools.dir}/javacc.jar" classname="org.javacc.jjtree.Main"> <arg value="-OUTPUT_DIRECTORY=${gen.dir}/ast/AST"/> <arg value="-NODE_PREFIX="""/> - <arg value="${spec.dir}/ast/Ast.jjt"/> + <arg value="${spec.dir}/javacc/ast/Ast.jjt"/> </java> <!-- NODE_PREFIX is not set correctly on Windows: --> <!--jjtree javacchome="${tools.dir}" nodeprefix="""" outputdirectory="${gen.dir}/ast/AST" - target="${spec.dir}/ast/Ast.jjt"/--> + target="${spec.dir}/javacc/ast/Ast.jjt"/--> <javacc javacchome="${tools.dir}" jdkversion="1.4" outputdirectory="${gen.dir}/ast/AST" target="${gen.dir}/ast/AST/Ast.jj"/> <!-- Ast.jjt must be touched, or Ant will not run jjtree --> - <touch file="jrag/Jrag.jjt"/> + <touch file="${spec.dir}/javacc/jrag/Jrag.jjt"/> <jjtree javacchome="${tools.dir}" outputdirectory="${gen.dir}/jrag/AST" - target="${spec.dir}/jrag/Jrag.jjt"/> + target="${spec.dir}/javacc/jrag/Jrag.jjt"/> <javacc javacchome="${tools.dir}" jdkversion="1.4" outputdirectory="${gen.dir}/jrag/AST" target="${gen.dir}/jrag/AST/Jrag.jj"/> diff --git a/ast/ASTCopyNode.jadd b/spec/jastadd/ast/ASTCopyNode.jadd similarity index 100% rename from ast/ASTCopyNode.jadd rename to spec/jastadd/ast/ASTCopyNode.jadd diff --git a/ast/ASTErrors.jrag b/spec/jastadd/ast/ASTErrors.jrag similarity index 100% rename from ast/ASTErrors.jrag rename to spec/jastadd/ast/ASTErrors.jrag diff --git a/ast/ASTNameBinding.jrag b/spec/jastadd/ast/ASTNameBinding.jrag similarity index 100% rename from ast/ASTNameBinding.jrag rename to spec/jastadd/ast/ASTNameBinding.jrag diff --git a/ast/Ast.ast b/spec/jastadd/ast/Ast.ast similarity index 100% rename from ast/Ast.ast rename to spec/jastadd/ast/Ast.ast diff --git a/ast/Attributes.jrag b/spec/jastadd/ast/Attributes.jrag similarity index 100% rename from ast/Attributes.jrag rename to spec/jastadd/ast/Attributes.jrag diff --git a/ast/Circular.jrag b/spec/jastadd/ast/Circular.jrag similarity index 100% rename from ast/Circular.jrag rename to spec/jastadd/ast/Circular.jrag diff --git a/ast/ClassRelations.jrag b/spec/jastadd/ast/ClassRelations.jrag similarity index 100% rename from ast/ClassRelations.jrag rename to spec/jastadd/ast/ClassRelations.jrag diff --git a/ast/CollectionAttributes.jrag b/spec/jastadd/ast/CollectionAttributes.jrag similarity index 100% rename from ast/CollectionAttributes.jrag rename to spec/jastadd/ast/CollectionAttributes.jrag diff --git a/ast/ComponentsUtil.jrag b/spec/jastadd/ast/ComponentsUtil.jrag similarity index 100% rename from ast/ComponentsUtil.jrag rename to spec/jastadd/ast/ComponentsUtil.jrag diff --git a/ast/FileNameEscape.jrag b/spec/jastadd/ast/FileNameEscape.jrag similarity index 100% rename from ast/FileNameEscape.jrag rename to spec/jastadd/ast/FileNameEscape.jrag diff --git a/ast/IncrementalDumpCache.jadd b/spec/jastadd/ast/IncrementalDumpCache.jadd similarity index 100% rename from ast/IncrementalDumpCache.jadd rename to spec/jastadd/ast/IncrementalDumpCache.jadd diff --git a/ast/IncrementalEval.jadd b/spec/jastadd/ast/IncrementalEval.jadd similarity index 100% rename from ast/IncrementalEval.jadd rename to spec/jastadd/ast/IncrementalEval.jadd diff --git a/ast/IncrementalTracking.jadd b/spec/jastadd/ast/IncrementalTracking.jadd similarity index 100% rename from ast/IncrementalTracking.jadd rename to spec/jastadd/ast/IncrementalTracking.jadd diff --git a/ast/JaddCodeGen.jrag b/spec/jastadd/ast/JaddCodeGen.jrag similarity index 100% rename from ast/JaddCodeGen.jrag rename to spec/jastadd/ast/JaddCodeGen.jrag diff --git a/ast/JastAddCodeGen.jadd b/spec/jastadd/ast/JastAddCodeGen.jadd similarity index 100% rename from ast/JastAddCodeGen.jadd rename to spec/jastadd/ast/JastAddCodeGen.jadd diff --git a/ast/JragCodeGen.jrag b/spec/jastadd/ast/JragCodeGen.jrag similarity index 100% rename from ast/JragCodeGen.jrag rename to spec/jastadd/ast/JragCodeGen.jrag diff --git a/ast/JragErrors.jrag b/spec/jastadd/ast/JragErrors.jrag similarity index 100% rename from ast/JragErrors.jrag rename to spec/jastadd/ast/JragErrors.jrag diff --git a/ast/NameBinding.jrag b/spec/jastadd/ast/NameBinding.jrag similarity index 100% rename from ast/NameBinding.jrag rename to spec/jastadd/ast/NameBinding.jrag diff --git a/ast/SimpleNode.jadd b/spec/jastadd/ast/SimpleNode.jadd similarity index 100% rename from ast/SimpleNode.jadd rename to spec/jastadd/ast/SimpleNode.jadd diff --git a/ast/Unparse.jadd b/spec/jastadd/ast/Unparse.jadd similarity index 100% rename from ast/Unparse.jadd rename to spec/jastadd/ast/Unparse.jadd diff --git a/spec/javacc/ast/Ast.jjt b/spec/javacc/ast/Ast.jjt new file mode 100755 index 0000000000000000000000000000000000000000..fdfed9f121c636915183788df770fd71acf46f49 --- /dev/null +++ b/spec/javacc/ast/Ast.jjt @@ -0,0 +1,488 @@ +options { + MULTI=true; + VISITOR=true; + NODE_DEFAULT_VOID=true; + NODE_PACKAGE="ast.AST"; + STATIC=false; + NODE_SCOPE_HOOK= true; //added! +} + +PARSER_BEGIN(Ast) + +package ast.AST; + +import java.util.*; + +public class Ast { + + private LinkedList errorList = new LinkedList(); + public String fileName; + + public Iterator getErrors() { + return errorList.iterator(); + } + + public Collection parseErrors() { + return errorList; + } + + private void error_skipto(int kind) { + ParseException e = generateParseException(); + + StringBuffer msg = new StringBuffer(); + + msg.append(Integer.toString(e.currentToken.next.beginLine)); + msg.append(";"); + msg.append(Integer.toString(e.currentToken.next.beginColumn)); + msg.append(";"); + + /* + + StringBuffer expected = new StringBuffer(); + int maxSize = 0; + for(int i = 0; i < e.expectedTokenSequences.length; i++) { + if(maxSize < e.expectedTokenSequences[i].length) { + maxSize = e.expectedTokenSequences[i].length; + } + for(int j = 0; j < e.expectedTokenSequences[i].length; j++) { + expected.append(e.tokenImage[e.expectedTokenSequences[i][j]] + " "); + } + if(e.expectedTokenSequences[i][e.expectedTokenSequences[i].length - 1] != 0) { + expected.append("..."); + } + expected.append(", "); + } + + Token prev = e.currentToken; + Token tok = e.currentToken.next; + for(int i = 0; i < maxSize; i++) { + prev = tok; + if(tok.kind == 0) { + break; + } + tok = tok.next; + } + + msg.append(Integer.toString(prev.endLine)); + msg.append(";"); + msg.append(Integer.toString(prev.endColumn)); + msg.append(";"); + + msg.append(expected.toString()); + */ + + msg.append(Integer.toString(e.currentToken.next.endLine)); + msg.append(";"); + msg.append(Integer.toString(e.currentToken.next.endColumn)); + msg.append(";"); + msg.append("Syntax error"); + errorList.add(msg.toString()); + + //System.err.println(e.toString()); + Token t; + do { + t = getNextToken(); + } while(t.kind != AstConstants.EOF && t.kind != kind); + } + + /* ------ Added methods for NODE_SCOPE_HOOKS ---------*/ + public void jjtreeOpenNodeScope(Node n) { + ((SimpleNode) n).firstToken = getToken(1); + } + + public void jjtreeCloseNodeScope(Node n) { + ((SimpleNode) n).lastToken = getToken(0); + } + +} + +PARSER_END(Ast) +/* WHITE SPACE */ + +SPECIAL_TOKEN : +{ + " " +| "\t" +| "\n" +| "\r" +| "\f" +} + +/* COMMENTS */ + +MORE : +{ + "//" : IN_SINGLE_LINE_COMMENT +| + <"/**" ~["/"]> { input_stream.backup(1); } : IN_FORMAL_COMMENT +| + "/*" : IN_MULTI_LINE_COMMENT +} +<IN_SINGLE_LINE_COMMENT> +SPECIAL_TOKEN : +{ + <SINGLE_LINE_COMMENT: "\n" | "\r" | "\r\n" > : DEFAULT +} + +<IN_FORMAL_COMMENT> +SPECIAL_TOKEN : +{ + <FORMAL_COMMENT: "*/" > : DEFAULT +} + +<IN_MULTI_LINE_COMMENT> +SPECIAL_TOKEN : +{ + <MULTI_LINE_COMMENT: "*/" > : DEFAULT +} + +<IN_SINGLE_LINE_COMMENT,IN_FORMAL_COMMENT,IN_MULTI_LINE_COMMENT> +MORE : +{ + < ~[] > +} + +/* +SKIP : +{ + " " +| "\t" +| "\n" +| "\r" +| <"//" (~["\n","\r"])* ("\n"|"\r"|"\r\n")> +} +*/ + +TOKEN : /* Reserved words */ +{ + < ABSTRACT: "abstract" > + | < SEMICOLON: ";" > + | < BOOLEAN: "boolean" > + | < CHAR: "char" > + | < BYTE: "byte" > + | < SHORT: "short" > + | < INT: "int" > + | < LONG: "long" > + | < FLOAT: "float" > + | < DOUBLE: "double" > + | < SUPER: "super" > + | < EXTENDS: "extends" > + // EMMA_2011-12-05: Adding words "region" for grammar annotations for coarse dependency tracking + | < REGION: "region" > + // +} + +TOKEN : /* Literals */ +{ < ID: <LETTER> (<LETTER>|<DIGIT>)* > +| < #LETTER: ["_","a"-"z","A"-"Z"] > +| < #DIGIT: ["0"-"9"] > +} + +Grammar Grammar() #Grammar: {} +{ + ClassList() + // EMMA_2011-12-05: Coarse dependency tracking, allow a list of region declarations in the grammar + RegionList() + // + { return jjtThis; } +} + +// EMMA_2011-12-05: Coarse dependency tracking, region declaration list and region declaration +void RegionList() #List : {} +{ + ( RegionDecl() )* +} +void RegionDecl() #RegionDecl : {} +{ + <REGION> IdUse() <SEMICOLON> +} +// + + +void ClassList() #List: {} +{ + ( + try { + Class() + } catch(ParseException e) { + } + )* + // (Class())* +} + +void Class() #ASTDecl : { Token first = null, last; } +{ + try { + ((Abstract() { first = token; } #Opt(1)) | ({} #Opt(0))) +// [Abstract() { first = token; }] #Opt + IdDecl() { if(first == null) first = token; } + OptSuperClass() ComponentsList() Attributes() + <SEMICOLON> { + last = token; + jjtThis.setFileName(fileName); + jjtThis.setStartLine(first.beginLine); + jjtThis.setEndLine(last.endLine); + jjtThis.setComment(jjtThis.unparseComment()); + } + } catch(ParseException e) { + error_skipto(SEMICOLON); + throw e; +// jjtree.clearNodeScope(jjtThis); +// jjtc000 = false; + } +} + +void Attributes() : {} +{ + {} #List(0) // SynAttrDecl + {} #List(0) // SynEq + {} #List(0) // InhAttrDecl + {} #List(0) // InhEq + {} #List(0) // ClassBodyDecl + {} #List(0) // Rewrite + {} #List(0) // CollDecl + {} #List(0) // CollEq +} + +void OptAbstract() #Opt: {} +{ [Abstract()] +} + +void Abstract() #Abstract: {} +{ "abstract" +} + +void OptSuperClass() #Opt: {} +{ [":" IdUse()] +} + +void ComponentsList() #List: {} +{ [ "::=" (Components())* ] +} + +void Components(): {} +{ + + LOOKAHEAD(OptName() IdUse() "*") + ListComponents() +| OptionalComponent() +| TokenComponent() +| AggregateComponents() +| LOOKAHEAD("/" OptName() IdUse() "*") + ListComponentsNTA() +| LOOKAHEAD("/" "[") + OptionalComponentNTA() +| LOOKAHEAD("/" "<") + TokenComponentNTA() +| AggregateComponentsNTA() +} + +void ListComponents() #ListComponents: {} +{ Id() "*" +} + +void ListComponentsNTA() #ListComponentsNTA: {} +{ "/" Id() "*" "/" +} + +void OptionalComponent() #OptionalComponent: {} +{ "[" Id() "]" +} + +void OptionalComponentNTA() #OptionalComponentNTA: {} +{ "/" "[" Id() "]" "/" +} + +void TokenComponent() #TokenComponent:{} +{ "<" TokenId() ">" +} + +void TokenComponentNTA() #TokenComponentNTA:{} +{ "/" "<" TokenId() ">" "/" +} + +void AggregateComponents() #AggregateComponents:{} +{ Id() +} + +void AggregateComponentsNTA() #AggregateComponentsNTA:{} +{ "/" Id() "/" +} + +void Id() #Id: {} +{ OptName() IdUse() +} + +void OptName() #Opt: {} +{ [LOOKAHEAD(NameNode() ":") NameNode() ":"] +} + +void NameNode() #NameNode: +{ Token t; +} +{ t = <ID> + { + jjtThis.setID(t.image); + } +} + +void IdUse() #IdUse(): +{ Token t; +} +{ t = <ID> + { + jjtThis.setID(t.image); + } +} + +void IdDecl() #IdDecl(): +{ Token t; +} +{ t = <ID> + { jjtThis.setID(t.image); + } +} + + +void TokenId() #TokenId(): +{ Token t; + String type = null; + boolean hasType = false; +} +{ t = <ID> [ ":" type = Type() { hasType = true; } ] +// Default type is String for backward compability + { jjtThis.setID(t.image); + jjtThis.setTYPE(hasType ? type : "String"); + } +} +/*Changed to return string */ +String Type(): +{ String s; } +{ + ( + LOOKAHEAD(2) s = ReferenceType() + | + s = PrimitiveType() + ) + { return s; } +} + +String ReferenceType(): +{ String s; } +{ + ( + s = PrimitiveType() ( LOOKAHEAD(2) "[" "]" { s += "[]"; } )+ + | + ( s = ClassOrInterfaceType() ) ( LOOKAHEAD(2) "[" "]" { s += "[]"; } )* + ) + { return s; } +} + +String ClassOrInterfaceType(): +{ Token t; String s; String u; } +{ + t = <ID> { s = t.image; } [ LOOKAHEAD(2) u = TypeArguments() { s += u; } ] + ( LOOKAHEAD(2) "." t = <ID> { s += "." + t.image; } [ LOOKAHEAD(2) u = TypeArguments() { s += u; } ] )* + { return s; } +} + +String TypeArguments(): +{ String s; String t; } +{ + "<" { s = "<"; } t = TypeArgument() { s += t; } ( "," { s += ","; } t = TypeArgument() { s += t; } )* ">" { s+=">"; } + { return s; } +} + +String TypeArgument(): +{ String s; String t; } +{ + ( + s = ReferenceType() + | + "?" { s = "?"; } [ t = WildcardBounds() { s += t; } ] + ) + { return s; } +} + +String WildcardBounds(): +{ String s; String t; } +{ + ( + "extends" t = ReferenceType() { s = " extends " + t; } + | + "super" t = ReferenceType() { s = " super " + t; } + ) + { return s; } +} + +String PrimitiveType(): +{ Token t; } +{ +( + t = "boolean" +| + t = "char" +| + t = "byte" +| + t = "short" +| + t = "int" +| + t = "long" +| + t = "float" +| + t = "double" +) +{ return t.image; } +} + +/* +String Type() : +{ + String t; + StringBuffer b = new StringBuffer(); +} +{ + (( t = PrimitiveType() | t = Name() ) { b.append(t); } ( "[" "]" { b.append("[]");} )*) +{return b.toString();} + +} + +String PrimitiveType() : +{Token t;} +{ + (t = "boolean" +| + t = "char" +| + t = "byte" +| + t = "short" +| + t = "int" +| + t = "long" +| + t = "float" +| + t = "double") +{return t.image; } +} +*/ + +/* Changed to return token */ +String Name() : +/* + * A lookahead of 2 is required below since "Name" can be followed + * by a ".*" when used in the context of an "ImportDeclaration". + */ +{Token t; StringBuffer s = new StringBuffer();} +{ + t = <ID> { s.append(t.image); } + ( LOOKAHEAD(2) "." t = <ID> { s.append("." + t.image); } + )* +{ return s.toString();} +} + diff --git a/jrag/AST/SimpleNode.java b/spec/javacc/jrag/AST/SimpleNode.java similarity index 100% rename from jrag/AST/SimpleNode.java rename to spec/javacc/jrag/AST/SimpleNode.java diff --git a/jrag/AST/Token.java b/spec/javacc/jrag/AST/Token.java similarity index 100% rename from jrag/AST/Token.java rename to spec/javacc/jrag/AST/Token.java diff --git a/jrag/ClassBodyDeclUnparser.java b/spec/javacc/jrag/ClassBodyDeclUnparser.java similarity index 100% rename from jrag/ClassBodyDeclUnparser.java rename to spec/javacc/jrag/ClassBodyDeclUnparser.java diff --git a/jrag/ClassBodyObject.java b/spec/javacc/jrag/ClassBodyObject.java similarity index 100% rename from jrag/ClassBodyObject.java rename to spec/javacc/jrag/ClassBodyObject.java diff --git a/jrag/Jrag.jjt b/spec/javacc/jrag/Jrag.jjt similarity index 100% rename from jrag/Jrag.jjt rename to spec/javacc/jrag/Jrag.jjt diff --git a/jrag/SignatureUnparser.java b/spec/javacc/jrag/SignatureUnparser.java similarity index 100% rename from jrag/SignatureUnparser.java rename to spec/javacc/jrag/SignatureUnparser.java diff --git a/jrag/Unparser.java b/spec/javacc/jrag/Unparser.java similarity index 100% rename from jrag/Unparser.java rename to spec/javacc/jrag/Unparser.java diff --git a/jrag/Util.java b/spec/javacc/jrag/Util.java similarity index 100% rename from jrag/Util.java rename to spec/javacc/jrag/Util.java