From a081de1fc03d7251c9f5fd493f426d3595beb8a4 Mon Sep 17 00:00:00 2001 From: Alexandre Terrasa Date: Wed, 9 Nov 2011 11:59:15 -0500 Subject: [PATCH] MiniGen initial import Signed-off-by: Alexandre Terrasa --- .gitignore | 4 + README | 9 + examples/base_formal.minigen | 10 + examples/base_inheritance.minigen | 48 + examples/base_isa.minigen | 41 + examples/hard_isa.minigen | 32 + examples/nitstdlib.minigen | 87 + examples/test.minigen | 14 + grammar/minigen.sablecc3 | 89 + lib/sablecc.jar | Bin 0 -> 300893 bytes src/minigen/ClassAnalysis.java | 45 + src/minigen/FormalTypeAnalysis.java | 89 + src/minigen/InheritanceAnalysis.java | 255 +++ src/minigen/Interpreter.java | 127 ++ src/minigen/Main.java | 84 + src/minigen/TablesComputation.java | 203 ++ .../exception/InterpreterException.java | 12 + src/minigen/exception/SemanticException.java | 18 + src/minigen/model/Adaptation.java | 94 + src/minigen/model/Class.java | 334 ++++ src/minigen/model/FormalType.java | 28 + src/minigen/model/Model.java | 223 +++ src/minigen/model/ObjectClass.java | 60 + src/minigen/model/ObjectType.java | 28 + src/minigen/model/Type.java | 184 ++ src/minigen/syntax3/analysis/Analysis.java | 44 + .../syntax3/analysis/AnalysisAdapter.java | 216 ++ .../syntax3/analysis/DepthFirstAdapter.java | 491 +++++ .../analysis/ReversedDepthFirstAdapter.java | 498 +++++ src/minigen/syntax3/lexer/Lexer.java | 470 +++++ src/minigen/syntax3/lexer/LexerException.java | 12 + src/minigen/syntax3/lexer/lexer.dat | Bin 0 -> 808 bytes .../syntax3/node/AAdditionalFormalTypes.java | 137 ++ .../syntax3/node/AAdditionalSupers.java | 137 ++ .../syntax3/node/AAdditionalTypes.java | 137 ++ src/minigen/syntax3/node/AClassDecl.java | 266 +++ src/minigen/syntax3/node/AFormalDecl.java | 144 ++ src/minigen/syntax3/node/AFormalDecls.java | 187 ++ src/minigen/syntax3/node/AGenericPart.java | 180 ++ src/minigen/syntax3/node/AGenericTypes.java | 144 ++ src/minigen/syntax3/node/AIsaInstr.java | 180 ++ src/minigen/syntax3/node/AProgram.java | 150 ++ .../syntax3/node/ASuperAdditionalTypes.java | 137 ++ src/minigen/syntax3/node/ASuperDecls.java | 187 ++ .../syntax3/node/ASuperGenericPart.java | 180 ++ .../syntax3/node/ASuperGenericTypes.java | 144 ++ src/minigen/syntax3/node/ASuperType.java | 137 ++ src/minigen/syntax3/node/AType.java | 137 ++ src/minigen/syntax3/node/EOF.java | 32 + src/minigen/syntax3/node/Node.java | 77 + .../syntax3/node/PAdditionalFormalTypes.java | 8 + .../syntax3/node/PAdditionalSupers.java | 8 + .../syntax3/node/PAdditionalTypes.java | 8 + src/minigen/syntax3/node/PClassDecl.java | 8 + src/minigen/syntax3/node/PFormalDecl.java | 8 + src/minigen/syntax3/node/PFormalDecls.java | 8 + src/minigen/syntax3/node/PGenericPart.java | 8 + src/minigen/syntax3/node/PGenericTypes.java | 8 + src/minigen/syntax3/node/PInstr.java | 8 + src/minigen/syntax3/node/PProgram.java | 8 + .../syntax3/node/PSuperAdditionalTypes.java | 8 + src/minigen/syntax3/node/PSuperDecls.java | 8 + .../syntax3/node/PSuperGenericPart.java | 8 + .../syntax3/node/PSuperGenericTypes.java | 8 + src/minigen/syntax3/node/PSuperType.java | 8 + src/minigen/syntax3/node/PType.java | 8 + src/minigen/syntax3/node/Start.java | 132 ++ src/minigen/syntax3/node/Switch.java | 8 + src/minigen/syntax3/node/Switchable.java | 8 + src/minigen/syntax3/node/TBlanks.java | 32 + src/minigen/syntax3/node/TComma.java | 38 + src/minigen/syntax3/node/TComment.java | 32 + src/minigen/syntax3/node/TKclass.java | 38 + src/minigen/syntax3/node/TKend.java | 38 + src/minigen/syntax3/node/TKisa.java | 38 + src/minigen/syntax3/node/TKnew.java | 38 + src/minigen/syntax3/node/TKsuper.java | 38 + src/minigen/syntax3/node/TLb.java | 38 + src/minigen/syntax3/node/TName.java | 32 + src/minigen/syntax3/node/TRb.java | 38 + src/minigen/syntax3/node/Token.java | 59 + src/minigen/syntax3/parser/Parser.java | 1757 +++++++++++++++++ .../syntax3/parser/ParserException.java | 22 + src/minigen/syntax3/parser/State.java | 17 + src/minigen/syntax3/parser/TokenIndex.java | 71 + src/minigen/syntax3/parser/parser.dat | Bin 0 -> 2976 bytes 86 files changed, 9144 insertions(+) create mode 100644 .gitignore create mode 100644 README create mode 100644 examples/base_formal.minigen create mode 100644 examples/base_inheritance.minigen create mode 100644 examples/base_isa.minigen create mode 100644 examples/hard_isa.minigen create mode 100644 examples/nitstdlib.minigen create mode 100644 examples/test.minigen create mode 100644 grammar/minigen.sablecc3 create mode 100644 lib/sablecc.jar create mode 100644 src/minigen/ClassAnalysis.java create mode 100644 src/minigen/FormalTypeAnalysis.java create mode 100644 src/minigen/InheritanceAnalysis.java create mode 100644 src/minigen/Interpreter.java create mode 100644 src/minigen/Main.java create mode 100644 src/minigen/TablesComputation.java create mode 100644 src/minigen/exception/InterpreterException.java create mode 100644 src/minigen/exception/SemanticException.java create mode 100644 src/minigen/model/Adaptation.java create mode 100644 src/minigen/model/Class.java create mode 100644 src/minigen/model/FormalType.java create mode 100644 src/minigen/model/Model.java create mode 100644 src/minigen/model/ObjectClass.java create mode 100644 src/minigen/model/ObjectType.java create mode 100644 src/minigen/model/Type.java create mode 100644 src/minigen/syntax3/analysis/Analysis.java create mode 100644 src/minigen/syntax3/analysis/AnalysisAdapter.java create mode 100644 src/minigen/syntax3/analysis/DepthFirstAdapter.java create mode 100644 src/minigen/syntax3/analysis/ReversedDepthFirstAdapter.java create mode 100644 src/minigen/syntax3/lexer/Lexer.java create mode 100644 src/minigen/syntax3/lexer/LexerException.java create mode 100644 src/minigen/syntax3/lexer/lexer.dat create mode 100644 src/minigen/syntax3/node/AAdditionalFormalTypes.java create mode 100644 src/minigen/syntax3/node/AAdditionalSupers.java create mode 100644 src/minigen/syntax3/node/AAdditionalTypes.java create mode 100644 src/minigen/syntax3/node/AClassDecl.java create mode 100644 src/minigen/syntax3/node/AFormalDecl.java create mode 100644 src/minigen/syntax3/node/AFormalDecls.java create mode 100644 src/minigen/syntax3/node/AGenericPart.java create mode 100644 src/minigen/syntax3/node/AGenericTypes.java create mode 100644 src/minigen/syntax3/node/AIsaInstr.java create mode 100644 src/minigen/syntax3/node/AProgram.java create mode 100644 src/minigen/syntax3/node/ASuperAdditionalTypes.java create mode 100644 src/minigen/syntax3/node/ASuperDecls.java create mode 100644 src/minigen/syntax3/node/ASuperGenericPart.java create mode 100644 src/minigen/syntax3/node/ASuperGenericTypes.java create mode 100644 src/minigen/syntax3/node/ASuperType.java create mode 100644 src/minigen/syntax3/node/AType.java create mode 100644 src/minigen/syntax3/node/EOF.java create mode 100644 src/minigen/syntax3/node/Node.java create mode 100644 src/minigen/syntax3/node/PAdditionalFormalTypes.java create mode 100644 src/minigen/syntax3/node/PAdditionalSupers.java create mode 100644 src/minigen/syntax3/node/PAdditionalTypes.java create mode 100644 src/minigen/syntax3/node/PClassDecl.java create mode 100644 src/minigen/syntax3/node/PFormalDecl.java create mode 100644 src/minigen/syntax3/node/PFormalDecls.java create mode 100644 src/minigen/syntax3/node/PGenericPart.java create mode 100644 src/minigen/syntax3/node/PGenericTypes.java create mode 100644 src/minigen/syntax3/node/PInstr.java create mode 100644 src/minigen/syntax3/node/PProgram.java create mode 100644 src/minigen/syntax3/node/PSuperAdditionalTypes.java create mode 100644 src/minigen/syntax3/node/PSuperDecls.java create mode 100644 src/minigen/syntax3/node/PSuperGenericPart.java create mode 100644 src/minigen/syntax3/node/PSuperGenericTypes.java create mode 100644 src/minigen/syntax3/node/PSuperType.java create mode 100644 src/minigen/syntax3/node/PType.java create mode 100644 src/minigen/syntax3/node/Start.java create mode 100644 src/minigen/syntax3/node/Switch.java create mode 100644 src/minigen/syntax3/node/Switchable.java create mode 100644 src/minigen/syntax3/node/TBlanks.java create mode 100644 src/minigen/syntax3/node/TComma.java create mode 100644 src/minigen/syntax3/node/TComment.java create mode 100644 src/minigen/syntax3/node/TKclass.java create mode 100644 src/minigen/syntax3/node/TKend.java create mode 100644 src/minigen/syntax3/node/TKisa.java create mode 100644 src/minigen/syntax3/node/TKnew.java create mode 100644 src/minigen/syntax3/node/TKsuper.java create mode 100644 src/minigen/syntax3/node/TLb.java create mode 100644 src/minigen/syntax3/node/TName.java create mode 100644 src/minigen/syntax3/node/TRb.java create mode 100644 src/minigen/syntax3/node/Token.java create mode 100644 src/minigen/syntax3/parser/Parser.java create mode 100644 src/minigen/syntax3/parser/ParserException.java create mode 100644 src/minigen/syntax3/parser/State.java create mode 100644 src/minigen/syntax3/parser/TokenIndex.java create mode 100644 src/minigen/syntax3/parser/parser.dat diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6e61ff3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +/bin +.classpath +.project +.settings/ \ No newline at end of file diff --git a/README b/README new file mode 100644 index 0000000..061bb59 --- /dev/null +++ b/README @@ -0,0 +1,9 @@ +MiniGen is a mini object oriented language dedicated to genericity experimentations. + +Features: + +* Simple and generic classes; +* Multiple formal types; +* Simple and multiple inheritance; +* Conservation of generic types at compile time (no erase); +* Comparison of generic types in linear time; \ No newline at end of file diff --git a/examples/base_formal.minigen b/examples/base_formal.minigen new file mode 100644 index 0000000..712fb95 --- /dev/null +++ b/examples/base_formal.minigen @@ -0,0 +1,10 @@ +# Fail : Formal type X already declared +#class B1[X, X] end + +# Fail : Formal type conflict +#class Int end +#class Bool end +#class A[T] end +#class B[T] super A[T] end +#class C super A[Bool] end +#class D super B[Int], C end \ No newline at end of file diff --git a/examples/base_inheritance.minigen b/examples/base_inheritance.minigen new file mode 100644 index 0000000..310c93a --- /dev/null +++ b/examples/base_inheritance.minigen @@ -0,0 +1,48 @@ +# Test simple inheritance +class A end +class B end +class C super A end +#class D super A end +#class F super C, D end +#class G super C, D end + +# Test complex inheritance +#class Y1 end +#class Y2 super Y1 end +#class Y3 super Y2, Y4 end +#class Y4 super Y1 end +#class Y5 super Y4, Y2 end +#class Y6 super Y3, Y5 end + +# Test generic super classes +class X1[X : Object, Y: A, Z:Object] end +class X2[X: Object] super X1[X, C, B] end + +# Must fail: Bad bound +#class C1 end +#class C2 super C1 end +#class C3[T: C1] end +#class C4 super C3[Object] end + + +# Must fail: Herit himself +#class Z1 super Z1 end + +# Must fail: Unknown super class +#class Z2 super Z999 end + +# Must fail: Already declared as parent +#class Z3 super A, A end + +# Must fail: Inheritance loop +#class Z4 super Z5 end +#class Z5 super Z4 end + +# Must fail: Formal type arity +#class F1[X: Object] end +#class F2 super F1 end + +# Must fail: Formal type not declared +#class F1[X: Object] end +#class F2 super F1[X] end + diff --git a/examples/base_isa.minigen b/examples/base_isa.minigen new file mode 100644 index 0000000..e7d7e8b --- /dev/null +++ b/examples/base_isa.minigen @@ -0,0 +1,41 @@ +# For : Simple tests +class A1 end +class A2 super A1 end +class A3 super A2 end +class A4 super A3 end +class A5 end + +# For medium tests +class Bool end +class Int end + +class A[T, U] end +class B[T, U] super A[Object, Object] end +class C[T] super A[Bool, Int] end +class D super C[Object] end + +# Simple tests +A1 isa A1 # prints TRUE +A2 isa A1 # prints TRUE +A4 isa A1 # prints TRUE +A5 isa A1 # prints FALSE +A1 isa A5 # prints FALSE + +# Medium tests +Bool isa Int # prints FALSE +B[Int, Bool] isa A[Object, Object] # prints TRUE +B[Object, Object] isa A[Int, Bool] # prints FALSE +B[Object, Object] isa A[Object, Object] # prints TRUE +C[Int] isa A[Bool, Int] # prints TRUE +D isa A[Object, Object] # prints TRUE +C[Bool] isa A[Bool, Int] # prints TRUE + +# Must fail : type undeclared +#Toto isa Bbb + +# Must fail : type undeclared +#C[Toto] isa B[Int] + +# Must fail : generic arity +#C isa A + diff --git a/examples/hard_isa.minigen b/examples/hard_isa.minigen new file mode 100644 index 0000000..b75b86c --- /dev/null +++ b/examples/hard_isa.minigen @@ -0,0 +1,32 @@ +class Number end +class Int super Number end +class Bool end + +# For: Test 1 +class X[T] end +class A[U] end +class B[V] super A[X[V]] end +class C[W] super B[X[W]] end +class D super C[Int] end + +# For: Test 2 +#class D[T] end +#class E[T] super D[T] end +#class F[T] super E[T], G[Bool] end +#class G[T] super D[T] end + +# Test 1 +Bool isa Int # prints FALSE +B[Int] isa A[Int] # prints FALSE +B[Int] isa A[X[Int]] # prints TRUE +B[Int] isa A[X[Object]] # prints TRUE +B[Int] isa A[X[Bool]] # prints FALSE +C[Int] isa A[X[X[Int]]] # prints TRUE +C[Int] isa A[X[Int]] # prints FALSE +A[X[X[Int]]] isa A[X[X[Int]]] #prints TRUE +A[X[X[Int]]] isa A[X[X[Bool]]] #prints FALSE +A[X[X[Int]]] isa A[X[X[Number]]] #prints TRUE +B[X[X[Int]]] isa A[X[X[Int]]] #prints FALSE + +# Test 2 +#F[Int] isa D[Bool] # prints TRUE \ No newline at end of file diff --git a/examples/nitstdlib.minigen b/examples/nitstdlib.minigen new file mode 100644 index 0000000..10a3f37 --- /dev/null +++ b/examples/nitstdlib.minigen @@ -0,0 +1,87 @@ +class AbstractArray[E] super AbstractArrayRead[E], Sequence[E] end +class AbstractArrayRead[E] super SequenceRead[E] end +class AbstractSorter[E] super Object end +class AbstractString super AbstractArrayRead[Char] end +class ArrayCapable[E] super Object end +class Array[E] super AbstractArray[E], ArrayCapable[E] end +class ArrayIterator[E] super IndexedIterator[E] end +class ArrayMap[K, E] super CoupleMap[K, E] end +class ArraySet[E] super Set[E] end +class ArraySetIterator[E] super Iterator[E] end +class BMPattern super Pattern end +class Bool super Object end +class BufferedIStream super IStream end +class Buffer super AbstractString, Comparable, StringCapable, AbstractArray[Char] end +class Char super Discrete end +class Collection[E] super Object end +class ComparableSorter[E] super AbstractSorter[E] end +class Comparable super Object end +class Container[E] super Collection[E] end +class ContainerIterator[E] super Iterator[E] end +class Couple[F, S] super Object end +class CoupleMapIterator[K, E] super MapIterator[K, E] end +class CoupleMap[K, E] super Map[K, E] end +class Discrete super Comparable end +class FDIOStream super FDIStream, FDOStream, IOStream end +class FDIStream super FDStream, IStream end +class FDOStream super FDStream, OStream end +class FDStream super IOS end +class FileStat super Pointer end +class Float super Object end +class FStream super IOS, NativeFileCapable end +class HashCollection[K, N, E] super Collection[E], ArrayCapable[E] end +class HashMapIterator[K, V] super MapIterator[K, V] end +class HashMap[K, V] super Map[K, V], HashCollection[K, HashMapNode[K, V], V] end +class HashMapNode[K, V] super HashNode[K] end +class HashNode[K] super Object end +class HashSet[E] super Set[E], HashCollection[E, HashSetNode[E], E] end +class HashSetIterator[E] super Iterator[E] end +class HashSetNode[E] super HashNode[E] end +class IFStream super FStream, BufferedIStream end +class IndexedIterator[E] super MapIterator[Int, E] end +class Int super Discrete end +class IOProcess super IProcess, OProcess, IOStream end +class IOS super Object end +class IOStream super IStream, OStream end +class IProcess super Process, IStream end +class IStream super IOS end +class Iterator[E] super Object end +class IteratorRange[E] super Iterator[E] end +class List[E] super Sequence[E] end +class ListIterator[E] super IndexedIterator[E] end +class ListNode[E] super Container[E] end +class MapIterator[K, E] super Iterator[E] end +class Map[K, E] super RemovableCollection[E], MapRead[K, E] end +class MapRead[K, E] super Collection[E] end +class Match super Object end +class NaiveCollection[E] super Collection[E] end +class NativeArray[E] super Object end +class NativeFileCapable super Object end +class NativeFile super Pointer end +class NativeProcess super Pointer end +class NativeString super Object end +class OFStream super FStream, OStream end +class OProcess super Process, OStream end +class OStream super IOS end +class Pattern super Object end +class Pointer super Object end +class Process super Object end +class Range[E] super Collection[E] end +class RemovableCollection[E] super Collection[E] end +class Sequence[E] super SequenceRead[E], Map[Int, E], SimpleCollection[E] end +class SequenceRead[E] super MapRead[Int, E] end +class Set[E] super SimpleCollection[E] end +class SimpleCollection[E] super RemovableCollection[E] end +class Stderr super OFStream end +class Stdin super IFStream end +class Stdout super OFStream end +class StringCapable super Object end +class String super Pattern, Comparable, AbstractString end +class Symbol super Object end +class Sys super Object end + +# Tests + +Int isa Discrete # prints TRUE +AbstractString isa AbstractArrayRead[Char] # prints TRUE +AbstractString isa MapRead[Int, Char] # prints TRUE diff --git a/examples/test.minigen b/examples/test.minigen new file mode 100644 index 0000000..76eefce --- /dev/null +++ b/examples/test.minigen @@ -0,0 +1,14 @@ +class Number end +class Bool end +class Int super Number end + +class A[T, U] end + +class B[V] super A[Object, V] end + +class C[X, Y, Z] super B[Z] end + + + +A[Bool, Bool] isa A[Object, Object] +A[Object, Object] isa A[Bool, Bool] \ No newline at end of file diff --git a/grammar/minigen.sablecc3 b/grammar/minigen.sablecc3 new file mode 100644 index 0000000..0838fe4 --- /dev/null +++ b/grammar/minigen.sablecc3 @@ -0,0 +1,89 @@ +Package minigen.syntax3; + +Helpers + + upper = ['A'..'Z']; + lower = ['a'..'z']; + letter = [upper+lower]; + digit = ['0'..'9']; + + cr = 13; + lf = 10; + tab = 9; + + eol = cr | lf | cr lf; + + blank = ' ' | eol | tab; + + not_eol = [[0..127]-[cr+lf]]; + +Tokens + + comma = ','; + + lb = '['; + rb = ']'; + + kend = 'end'; + kisa = 'isa'; + kclass = 'class'; + ksuper = 'super'; + knew = 'new'; + + name = upper (letter | digit)*; + + blanks = blank+; + comment = '#' not_eol*; + +Ignored Tokens + blanks, comment; + +Productions + + program = + [classes]: class_decl* [instrs]:instr*; + + class_decl = + kclass name formal_decls? super_decls? kend; + + formal_decls = + lb formal_decl+ rb; + + formal_decl = + name additional_formal_types*; + + additional_formal_types = + comma name; + + type = + name generic_part?; + + generic_part = + lb generic_types rb; + + generic_types = + type additional_types*; + + additional_types = + comma type; + + super_decls = + ksuper super_type additional_supers*; + + additional_supers = + comma super_type; + + super_type = + name super_generic_part?; + + super_generic_part = + lb super_generic_types rb; + + super_generic_types = + super_type super_additional_types*; + + super_additional_types = + comma super_type; + + instr = + {isa} [left]:type kisa [right]:type; \ No newline at end of file diff --git a/lib/sablecc.jar b/lib/sablecc.jar new file mode 100644 index 0000000000000000000000000000000000000000..1580cd04bf357f45624d6fc9f3429c4f48abaee9 GIT binary patch literal 300893 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
  • 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 PON0)`N!gYNeA)j2q>B>p literal 0 HcmV?d00001 diff --git a/src/minigen/ClassAnalysis.java b/src/minigen/ClassAnalysis.java new file mode 100644 index 0000000..331bf54 --- /dev/null +++ b/src/minigen/ClassAnalysis.java @@ -0,0 +1,45 @@ +package minigen; + +import minigen.model.Class; +import minigen.model.ObjectClass; +import minigen.model.Model; +import minigen.syntax3.analysis.DepthFirstAdapter; +import minigen.syntax3.node.AClassDecl; + +public class ClassAnalysis extends DepthFirstAdapter { + + private Model model; + private int currentId; + + public ClassAnalysis(Model classScope) { + this.currentId = 0; + this.model = classScope; + + //Reserve id 0 for Object class + reserveCurrentId(); + + // Declare Object class + this.model.declareClass(null, ObjectClass.getInstance()); + } + + @Override + public void caseAClassDecl(AClassDecl node) { + + //Get the class id + int id = reserveCurrentId(); + + //Declare class + model.declareClass(node, new Class(node.getName().getText().trim(), + node.getKclass(), id)); + } + + /* + * Returns and increments the current id + */ + private int reserveCurrentId() { + int id = this.currentId; + this.currentId++; + return id; + } + +} diff --git a/src/minigen/FormalTypeAnalysis.java b/src/minigen/FormalTypeAnalysis.java new file mode 100644 index 0000000..f301166 --- /dev/null +++ b/src/minigen/FormalTypeAnalysis.java @@ -0,0 +1,89 @@ +package minigen; + +import minigen.model.Class; +import minigen.model.FormalType; +import minigen.model.Model; +import minigen.syntax3.analysis.DepthFirstAdapter; +import minigen.syntax3.node.AAdditionalFormalTypes; +import minigen.syntax3.node.AClassDecl; +import minigen.syntax3.node.AFormalDecl; +import minigen.syntax3.node.AFormalDecls; +import minigen.syntax3.node.Node; +import minigen.syntax3.node.PAdditionalFormalTypes; +import minigen.syntax3.node.PFormalDecl; +import minigen.syntax3.node.Token; +import minigen.exception.*; + +public class FormalTypeAnalysis extends DepthFirstAdapter { + + private Model model; + private Class currentClass; + private int currentPos; + + public FormalTypeAnalysis(Model classScope) { + this.model = classScope; + } + + private void visit(Node node) { + if (node != null) { + node.apply(this); + } + } + + @Override + public void caseAClassDecl(AClassDecl node) { + String name = node.getName().getText().trim(); + + this.currentClass = model.getClassByNode(node.getName(), node, name); + + visit(node.getFormalDecls()); + + this.currentClass = null; + } + + @Override + public void caseAFormalDecls(AFormalDecls node) { + this.currentPos = -1; + for (PFormalDecl f : node.getFormalDecl()) { + visit(f); + } + this.currentPos = -1; + } + + @Override + public void caseAFormalDecl(AFormalDecl node) { + String name = node.getName().getText().trim(); + + this.currentPos++; + FormalType ftype = computeFormalType(node.getName(), name); + this.currentClass.addFormalType(ftype); + + for (PAdditionalFormalTypes f : node.getAdditionalFormalTypes()) { + visit(f); + } + } + + @Override + public void caseAAdditionalFormalTypes(AAdditionalFormalTypes node) { + String name = node.getName().getText().trim(); + + this.currentPos++; + FormalType ftype = computeFormalType(node.getName(), name); + this.currentClass.addFormalType(ftype); + } + + /* + * Check formal type validity + */ + private FormalType computeFormalType(Token token, String name) { + + // Not already declared in local class + if (this.currentClass.isFormalTypeDeclared(name)) { + throw new SemanticException(token, "formal type " + name + + " already declared"); + } + + return new FormalType(name, this.currentPos); + } + +} diff --git a/src/minigen/InheritanceAnalysis.java b/src/minigen/InheritanceAnalysis.java new file mode 100644 index 0000000..e1f4725 --- /dev/null +++ b/src/minigen/InheritanceAnalysis.java @@ -0,0 +1,255 @@ +package minigen; + +import java.util.ArrayList; +import java.util.List; + +import minigen.exception.SemanticException; +import minigen.model.Class; +import minigen.model.FormalType; +import minigen.model.Model; +import minigen.model.ObjectClass; +import minigen.model.ObjectType; +import minigen.model.Type; +import minigen.syntax3.analysis.DepthFirstAdapter; +import minigen.syntax3.node.AClassDecl; +import minigen.syntax3.node.ASuperDecls; +import minigen.syntax3.node.ASuperGenericPart; +import minigen.syntax3.node.ASuperGenericTypes; +import minigen.syntax3.node.ASuperType; +import minigen.syntax3.node.EOF; +import minigen.syntax3.node.Node; +import minigen.syntax3.node.PAdditionalSupers; +import minigen.syntax3.node.PSuperAdditionalTypes; + +public class InheritanceAnalysis extends DepthFirstAdapter { + + private Model model; + private Class currentClass = null; + private Type currentType; + + private List currentSuperClasses; + + public InheritanceAnalysis(Model classScope) { + this.model = classScope; + } + + private void visit(Node node) { + + if (node != null) { + node.apply(this); + } + } + + private Type computeType(Node node) { + this.currentType = null; + visit(node); + Type resultType = this.currentType; + this.currentType = null; + return resultType; + } + + @Override + public void caseAClassDecl(AClassDecl node) { + String name = node.getName().getText().trim(); + + this.currentClass = model.getClassByNode(node.getName(), node, name); + this.currentSuperClasses = new ArrayList(); + visit(node.getSuperDecls()); + + this.currentClass = null; + this.currentSuperClasses = null; + } + + @Override + public void caseASuperDecls(ASuperDecls node) { + Type type = computeType(node.getSuperType()); + + Class parent = computeClassParent(node, type); + + this.currentClass.addParent(parent, type.getGenericTypes()); + this.currentSuperClasses.add(parent); + + for (PAdditionalSupers t : node.getAdditionalSupers()) { + type = computeType(t); + + if (!model.containsClassDeclaration(type.getName())) { + throw new SemanticException(node.getKsuper(), "class " + + type.getName() + " not declared"); + } + + parent = computeClassParent(node, type); + + this.currentClass.addParent(parent, type.getGenericTypes()); + this.currentSuperClasses.add(parent); + } + } + + @Override + public void caseASuperType(ASuperType node) { + String name = node.getName().getText().trim(); + + if (name.equals(ObjectType.getInstance().getName())) { + this.currentType = ObjectType.getInstance(); + } else { + Class intro; + FormalType link = null; + if (!model.containsClassDeclaration(name)) { + if (!this.currentClass.isFormalTypeDeclared(name)) { + throw new SemanticException(node.getName(), "class " + name + + " not declared"); + } else { + intro = this.currentClass; + link = this.currentClass.getFormalType(name); + } + } else { + intro = model.getClassByName(node.getName(), name); + } + + this.currentType = new Type(name, intro); + this.currentType.setFormalTypeLink(link); + } + + visit(node.getSuperGenericPart()); + } + + @Override + public void caseASuperGenericPart(ASuperGenericPart node) { + visit(node.getSuperGenericTypes()); + } + + @Override + public void caseASuperGenericTypes(ASuperGenericTypes node) { + + Type savedType = this.currentType; + Type type = computeType(node.getSuperType()); + savedType.addGenericType(type); + + for (PSuperAdditionalTypes t : node.getSuperAdditionalTypes()) { + type = computeType(t); + savedType.addGenericType(type); + } + + this.currentType = savedType; + } + + /** + * Check if a super definition is repeated like: class A super B, B, ... + */ + public boolean checkAlreadyInSuper(Class c) { + return this.currentSuperClasses.contains(c); + } + + /** + * Check if a super definition is not the current class definition like: + * class A super A + */ + public boolean checkIsItSelf(Class c) { + if (this.currentClass.getName().equals(c.getName())) { + return true; + } + return false; + } + + public boolean checkGenericPartArity(Class parent, Type type) { + if (parent.getFormalTypes().size() != type.getArity()) { + return false; + } + return true; + } + + /** + * Check inheritance loops like: A <: B and B <: A + * + * @param type + * @return + */ + public boolean checkInheritanceLoop(Class parent) { + if (parent.isSubClassOf(this.currentClass)) { + return true; + } + return false; + } + + public Class computeClassParent(ASuperDecls node, Type type) { + if (!model.containsClassDeclaration(type.getName())) { + throw new SemanticException(node.getKsuper(), "class " + + type.getName() + " not declared"); + } + + Class parent = model.getClassByName(node.getKsuper(), type.getName()); + + // Check parent is not class it self + if (checkIsItSelf(parent)) { + throw new SemanticException(node.getKsuper(), "Class " + + parent.getName() + " cannot import itself"); + } + + // Check parent not already in current super clause + if (checkAlreadyInSuper(parent)) { + throw new SemanticException(node.getKsuper(), parent.getName() + + " already declared as parent in this super clause"); + } + + // Check inheritance loops + if (checkInheritanceLoop(parent)) { + throw new SemanticException(node.getKsuper(), + "Loop inheritance between class " + + this.currentClass.getName() + " and parent " + + parent.getName()); + } + + // Check generic arity + if (!checkGenericPartArity(parent, type)) { + throw new SemanticException(node.getKsuper(), parent.getName() + + " expects " + parent.getFormalTypes().size() + + " parameter(s) (" + type.getArity() + " are provided)"); + } + + // Check generic types are declared + for (Type t : type.getGenericTypes()) { + if (this.currentClass.isFormalTypeDeclared(t.getName())) { + continue; + } + if (!model.containsClassDeclaration(t.getName())) { + System.out.println(type.getName()); + throw new SemanticException(node.getKsuper(), "class " + + t.getName() + " not declared"); + } + } + + // Check bound conformity + /* + * for( int i = 0; i < type.getArity(); i ++ ) { + * + * String name = type.getGenericTypes().get(i).getName(); Type + * localType; + * + * if(model.containsClassDeclaration(name)) { localType = + * model.getClassByName(node.getKsuper(), name).getType(); } else { + * localType = this.currentClass.getFormalType(name).getBound(); } + * + * Type parentType = parent.getOrderedFormalTypes().get(i).getBound(); + * + * if( !localType.isSubTypeOf(parentType)) { throw new + * SemanticException(node.getKsuper(), "generic type " + + * localType.getName() + " must be a subtype of " + parentType.getName() + * + " formal type bound"); } } + */ + + return parent; + } + + /* + * Add Object as parent for all classes that haven't it yet (except Object + * itself) + */ + @Override + public void caseEOF(EOF node) { + for (Class c : model.getClasses()) { + if (c.getParents().isEmpty() && !c.isObjectIntro()) { + c.addParent(ObjectClass.getInstance(), new ArrayList()); + } + } + } + +} \ No newline at end of file diff --git a/src/minigen/Interpreter.java b/src/minigen/Interpreter.java new file mode 100644 index 0000000..b4fee50 --- /dev/null +++ b/src/minigen/Interpreter.java @@ -0,0 +1,127 @@ +package minigen; + +import minigen.exception.SemanticException; +import minigen.model.Class; +import minigen.model.Model; +import minigen.model.Type; +import minigen.syntax3.analysis.DepthFirstAdapter; +import minigen.syntax3.node.AGenericPart; +import minigen.syntax3.node.AGenericTypes; +import minigen.syntax3.node.AIsaInstr; +import minigen.syntax3.node.AType; +import minigen.syntax3.node.Node; +import minigen.syntax3.node.PAdditionalTypes; + +public class Interpreter extends DepthFirstAdapter { + + private Model model; + private Type currentType; + + public Interpreter(Model model) { + this.model = model; + + System.out.println("------- File Statistics -------"); + System.out.println(); + + System.out.println("Classes found : " + model.getClasses().size()); + System.out.println(); + + System.out.println("Max color : " + model.getMaxColor()); + System.out.println(); + + System.out.println("Inheritance relations found:"); + for (Class c : model.getClasses()) { + System.out.println(" - class " + c.toStringWithParents() + " get " + c.getSubClasses().size() + " subclasses (depth : "+ c.getDepth() +")"); + } + System.out.println(); + + System.out.println("Adaptations tables :"); + for(minigen.model.Class c : model.getClasses()) { + System.out.println(" - For class " + c + "("+ c.getClassId() +") : " + c.toStringWithAdaptationsTable()); + } + System.out.println(); + + System.out.println("-------------------------------"); + + + } + + private Type computeType(Node node) { + this.currentType = null; + visit(node); + Type resultType = this.currentType; + this.currentType = null; + return resultType; + } + + private void visit(Node node) { + if (node != null) { + node.apply(this); + } + } + + /* + * Write result of type comparaison on console + */ + @Override + public void caseAIsaInstr(AIsaInstr node) { + + // Compute types + Type leftType = computeType(node.getLeft()); + Type rightType = computeType(node.getRight()); + + // Check isa and display results + System.out.println(" - " + leftType + " isa " + rightType + " => " + + leftType.isa(rightType, leftType)); + + + } + + @Override + public void caseAType(AType node) { + + String name = node.getName().getText().trim(); + if (!model.containsClassDeclaration(name)) { + throw new SemanticException(node.getName(), "class " + name + + " not declared"); + } + this.currentType = new Type(name, model.getClassByName(node.getName(), + name)); + + visit(node.getGenericPart()); + + if (this.currentType.getIntro().getArity() != this.currentType + .getArity()) { + throw new SemanticException(node.getName(), this.currentType + .getIntro().getName() + + " expects " + + this.currentType.getIntro().getArity() + + " parameter(s) (" + + this.currentType.getArity() + + " are provided)"); + } + } + + @Override + public void caseAGenericPart(AGenericPart node) { + visit(node.getGenericTypes()); + } + + @Override + public void caseAGenericTypes(AGenericTypes node) { + Type savedType = this.currentType; + + Type type = computeType(node.getType()); + savedType.addGenericType(type); + type = null; + + for (PAdditionalTypes t : node.getAdditionalTypes()) { + type = computeType(t); + savedType.addGenericType(type); + type = null; + } + + this.currentType = savedType; + } + +} diff --git a/src/minigen/Main.java b/src/minigen/Main.java new file mode 100644 index 0000000..8e931c9 --- /dev/null +++ b/src/minigen/Main.java @@ -0,0 +1,84 @@ +package minigen; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.io.PushbackReader; + +import minigen.exception.InterpreterException; +import minigen.exception.SemanticException; +import minigen.model.Model; +import minigen.syntax3.lexer.Lexer; +import minigen.syntax3.lexer.LexerException; +import minigen.syntax3.node.Node; +import minigen.syntax3.parser.Parser; +import minigen.syntax3.parser.ParserException; + +public class Main { + + public static void main(String[] args) { + + if (args.length != 1) { + System.out.println("usage:"); + System.out.println(" java miniproc.Main filename"); + return; + } + + try { + FileReader in = new FileReader(args[0]); + Lexer lexer = new Lexer(new PushbackReader(new BufferedReader(in), + 1020)); + Parser parser = new Parser(lexer); + + Node tree = parser.parse(); + + in.close(); + + // Prepare class scope + Model model = new Model(); + + // Check class declarations + tree.apply(new ClassAnalysis(model)); + + // Check formal type declarations + tree.apply(new FormalTypeAnalysis(model)); + + // Check inheritance declarations + tree.apply(new InheritanceAnalysis(model)); + + // Compute tables + new TablesComputation(model); + + // Build type check tables in all classes + model.buildAdaptations(); + + // Run interpreter + tree.apply(new Interpreter(model)); + + System.out.println("\nEXECUTION END SUCCESSFULLY"); + + } catch (IOException e) { + System.out.flush(); + System.err.println("IO ERROR: while reading " + args[0] + ": " + + e.getMessage()); + return; + } catch (LexerException e) { + System.out.flush(); + System.err.println("LEXICAL ERROR: " + e.getMessage()); + return; + } catch (ParserException e) { + System.out.flush(); + System.err.println("SYNTAX ERROR: " + e.getMessage()); + return; + } catch (SemanticException e) { + System.out.flush(); + System.err.println("SEMANTIC ERROR: " + e.getMessage()); + return; + } catch (InterpreterException e) { + System.out.flush(); + System.err.println("INTERPRETER ERROR: " + e.getMessage()); + return; + } + } + +} diff --git a/src/minigen/TablesComputation.java b/src/minigen/TablesComputation.java new file mode 100644 index 0000000..de533d1 --- /dev/null +++ b/src/minigen/TablesComputation.java @@ -0,0 +1,203 @@ +package minigen; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; + +import minigen.model.Class; +import minigen.model.ObjectClass; + +import minigen.model.Model; + +public class TablesComputation implements Comparator { + + private Model model; + private List globalLinearExt; + private Map> linearExts; + + private List core = new ArrayList(); + private List crown = new ArrayList(); + private List border = new ArrayList(); + + public TablesComputation(Model model) { + this.model = model; + + // Compute classes depths + computeClassDepth(ObjectClass.getInstance(), 0); + + // Compute linear extension of model + computeModelLinearExt(); + + // Compute linear ext for each class + this.linearExts = new HashMap>(); + computeClassLinearExt(ObjectClass.getInstance(), new ArrayList()); + + // Compute core, crown and border + computeCoreCrownBorder(); + + // Compute conflict graph on core classes + computeConflicts(); + } + + private void computeConflicts() { + // Sort core by linear order + Collections.sort(core, this); + + for(Class c : core) { + if(c.getSuperClasses().size() == 2) { + + HashSet d = new HashSet(); + + List linC1 = linearExts.get(c.getSuperClasses().get(0)); + List linC2 = linearExts.get(c.getSuperClasses().get(1)); + + // linC1 - linC2 + for(Class p : linC2) { + if(!linC1.contains(p)) { + d.add(p); + } + } + + // linC2 - linC1 + for(Class p : linC1) { + if(!linC2.contains(p)) { + d.add(p); + } + } + + + } + } + + } + + /* + * Compute core, crown and border classes + */ + private void computeCoreCrownBorder() { + HashSet core = new HashSet(); + HashSet crown = new HashSet(); + HashSet border = new HashSet(); + + for(Class c : model.getClasses()) { + // Check crown classes + if(c.getSuperClasses().size() == 1 && !c.getSubClasses().isEmpty()) { + boolean flag = true; + for(Class s : c.getSubClasses()) { + if(s.getSuperClasses().size() != 1) { + flag = false; + } + } + if(flag) { + crown.add(c); + } + + // Check core classes + } else if(c.getSuperClasses().size() > 1 && !c.getSubClasses().isEmpty()) { + core.add(c); + } + } + + for(Class c : core) { + boolean flag = false; + for(Class s : c.getSubClasses()) { + if(crown.contains(s)) { + flag = true; + } + } + + if(flag) { + border.add(c); + } + + } + + this.core.addAll(core); + this.crown.addAll(crown); + this.border.addAll(border); + + System.out.println("crown : " + crown); + System.out.println("core : " + core); + System.out.println("border : " + border); + + } + + /* + * Compute the linear extension of global model + */ + private void computeModelLinearExt() { + this.globalLinearExt = new ArrayList(); + this.globalLinearExt.addAll(this.model.getClasses()); + + // Sort classes by total order + Collections.sort(this.globalLinearExt, this); + + } + + /* + * Compute depth of class in global class tree + */ + private void computeClassDepth(Class toTag, int depth) { + + // Check transitive relations + if(toTag.getDepth() > depth) { + depth = toTag.getDepth(); + } + + // Tag class + toTag.setDepth(depth); + depth++; + + // Explore childs + for(Class child : toTag.getSubClasses()) { + computeClassDepth(child, depth); + } + } + + private void computeClassLinearExt(Class c, List prev) { + + // Merge parent linExt with current + HashSet currentLinExt = new HashSet(); + currentLinExt.addAll(prev); + for(Class p : c.getParents()) { + currentLinExt.add(p); + } + + // Sort by decreasing linear order and store it + List orderedLinExt = new ArrayList(); + orderedLinExt.addAll(currentLinExt); + Collections.sort(orderedLinExt, this); + this.linearExts.put(c, orderedLinExt); + + // Propagate to children + for(Class child : c.getSubClasses()) { + computeClassLinearExt(child, orderedLinExt); + } + } + + + @Override + public int compare(Class o1, Class o2) { + if( o2.isSubClassOf(o1) ) { + return -1; + } + if( o1.isSubClassOf(o2) ) { + return 1; + } + + if(o2.getDepth() - o1.getDepth() != 0) { + return o1.getDepth() - o2.getDepth(); + } + + return o1.getName().compareTo(o2.getName()); + } + + + + + +} diff --git a/src/minigen/exception/InterpreterException.java b/src/minigen/exception/InterpreterException.java new file mode 100644 index 0000000..0a4077b --- /dev/null +++ b/src/minigen/exception/InterpreterException.java @@ -0,0 +1,12 @@ +package minigen.exception; + +public class InterpreterException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public InterpreterException(String message) { + + super("[Internal Error] " + message); + } + +} diff --git a/src/minigen/exception/SemanticException.java b/src/minigen/exception/SemanticException.java new file mode 100644 index 0000000..a695091 --- /dev/null +++ b/src/minigen/exception/SemanticException.java @@ -0,0 +1,18 @@ + +package minigen.exception; + +import minigen.syntax3.node.*; + +public class SemanticException + extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public SemanticException( + Token token, + String message) { + + super("[" + token.getLine() + "," + token.getPos() + "] " + message); + } + +} diff --git a/src/minigen/model/Adaptation.java b/src/minigen/model/Adaptation.java new file mode 100644 index 0000000..75cb33e --- /dev/null +++ b/src/minigen/model/Adaptation.java @@ -0,0 +1,94 @@ +package minigen.model; + +import java.util.ArrayList; +import java.util.List; + +public class Adaptation { + + private List types; + private Class parent; + + public Adaptation(Class parent) { + this.types = new ArrayList(); + this.parent = parent; + } + + public boolean isCompatibleTo(Adaptation a) { + if(this.getTypes().size() != a.getTypes().size()) { + return false; + } + + for(int i = 0; i < this.getTypes().size(); i++) { + Class local = this.get(i).getIntro(); + Class other = a.get(i).getIntro(); + + if(!local.isSameClass(other)) { + return false; + } + } + + + return true; + } + + public void add(Type t) { + this.types.add(t); + } + + public Type get(int index) { + return types.get(index); + } + + public Type get(String name) { + for(Type t : types) { + if( t.getName().equals(name)) { + return t; + } + } + return null; + } + + public List getTypes() { + return types; + } + + public boolean contains(Type ot) { + for(Type t : types) { + if( ot.getName().equals(t.getName())) { + return true; + } + } + return false; + } + + @Override + public String toString() { + String str = this.parent.getName(); + + if(!this.types.isEmpty()) { + str += "["; + } + + int i = 0; + for(Type t : this.types) { + str += t.toString(); + + if(i < this.types.size() - 1) { + str += ", "; + } + + i++; + } + + if(!this.types.isEmpty()) { + str += "]"; + } + + return str; + } + + public boolean isFor(Class c) { + return this.parent.isSameClass(c); + } + +} diff --git a/src/minigen/model/Class.java b/src/minigen/model/Class.java new file mode 100644 index 0000000..3d6b273 --- /dev/null +++ b/src/minigen/model/Class.java @@ -0,0 +1,334 @@ +package minigen.model; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import minigen.exception.InterpreterException; +import minigen.exception.SemanticException; +import minigen.syntax3.node.Token; + +public class Class { + + private int classId; + private int color; + private int depth; + private String name; + private Token location; + + private Map formalTypes = new HashMap(); + + private List orderedFormalTypes = new ArrayList(); + + private Map parents = new HashMap(); + private List subClasses = new ArrayList(); + private List superClasses = new ArrayList(); + + private Map> parentsBounds = new HashMap>(); + + private Adaptation[] adaptationsTable; + + public Class(String name, Token location, int classId) { + super(); + this.classId = classId; + this.name = name; + this.location = location; + this.depth = -1; + } + + /* + * Add a parent class to the current class + */ + public void addParent(Class parent, List bounds) { + this.parents.put(parent.getName(), parent); + this.parentsBounds.put(parent, bounds); + this.superClasses.add(parent); + parent.getSubClasses().add(this); + } + + /* + * Add a formal type to the current class + */ + public void addFormalType(FormalType ftype) { + this.formalTypes.put(ftype.getName(), ftype); + this.orderedFormalTypes.add(ftype); + } + + /* + * Check if a formal type is already declared Checks are based on the formal + * type name + */ + public boolean isFormalTypeDeclared(String name) { + return formalTypes.containsKey(name); + } + + /* + * Retrieve a formal type by is name + */ + public FormalType getFormalType(String name) { + if (!this.formalTypes.containsKey(name)) { + throw new SemanticException(null, name + + "formal type not declared in type " + this.getName()); + } + return this.formalTypes.get(name); + } + + public boolean isGeneric() { + return this.orderedFormalTypes.size() != 0; + } + + /* + * Return the arity of the generic class + */ + public int getArity() { + return this.orderedFormalTypes.size(); + } + + @Override + public String toString() { + String str = this.getName(); + int i = 0; + if (orderedFormalTypes.size() > 0) { + str += '['; + for (FormalType ft : this.orderedFormalTypes) { + str += i < this.orderedFormalTypes.size() - 1 ? ft + ", " : ft; + i++; + } + str += ']'; + } + + return str; + } + + /* + * Rapid isa, constant time execution + */ + public boolean isa(Class c) { + return this.adaptationsTable[c.getClassId()] != null; + } + + /* + * Get the adaptation to specified parent + */ + public Adaptation getAdaptation(Class to) { + return this.adaptationsTable[to.getClassId()]; + } + + /* + * Register adaptation to super class + * Throw Exception if formal type conflict is found + */ + public void addAdaptation(Class to, Adaptation adaptation) { + if(to.getClassId() > this.adaptationsTable.length) { + throw new InterpreterException("Class id for class " + to + " is out of bound for table adaptation of class " + this); + } + + /*if(this.adaptationsTable[to.getClassId()] != null) { + System.out.println(to); + System.out.println(this.adaptationsTable[to.getClassId()]); + if(!adaptation.isCompatibleTo(this.adaptationsTable[to.getClassId()])) { + throw new SemanticException(location, "Formal type definition conflict detected for class " + this + " with parent " + to); + } + }*/ + this.adaptationsTable[to.getClassId()] = adaptation; + } + + /* + * Check if current class is a sub class of c Comparisons are based on + * parents names WARNING : Low efficiency, highly recursive, used only as + * bootstrap for type check. Use isa method instead. + */ + public boolean isSubClassOf(Class c) { + if (c.getName().equals("Object")) { + return true; + } + + if (this.isSameClass(c)) { + return true; + } + + for (Class parent : parents.values()) { + if (parent.isSubClassOf(c)) { + return true; + } + } + return false; + } + + /* + * Display inheritance relations of current class + */ + public String toStringWithParents() { + String str = this.getName(); + int i = 0; + if (orderedFormalTypes.size() > 0) { + str += '['; + for (FormalType ft : this.orderedFormalTypes) { + str += i < this.orderedFormalTypes.size() - 1 ? ft + ", " : ft; + i++; + } + str += ']'; + } + if (parents.size() > 0) { + str += " <: "; + int j = 0; + for (Class c : this.parents.values()) { + String classStr = c.getName(); + + // Disp bounds super relations + if (parentsBounds.get(c).size() > 0) { + classStr += "["; + int k = 0; + for (Type parent : parentsBounds.get(c)) { + classStr += k < this.parentsBounds.get(c).size() - 1 ? parent + + ", " + : parent; + k++; + } + classStr += "]"; + } + str += j < this.parents.size() - 1 ? classStr + ", " : classStr; + j++; + } + } + + return str; + } + + public String toStringWithAdaptationsTable() { + String print = "{"; + for (int i = 0; i < this.adaptationsTable.length; i++) { + print += "[" + i + "]" + " = " + this.adaptationsTable[i]; + + if(i < this.adaptationsTable.length - 1) { + print += ", "; + } + } + print += "}"; + return print; + } + + /* + * Check if current class is same class than c Comparisons are based on name + * and formal type arity + */ + public boolean isSameClass(Class c) { + return this.getName().equals(c.getName()); + } + + /* + * Is the local class introduction for Object ? + */ + public boolean isObjectIntro() { + return false; + } + + /* + * Getters, setters + */ + + public String getName() { + return name; + } + + public Token getLocation() { + return location; + } + + public Map getFormalTypes() { + return formalTypes; + } + + public Collection getParents() { + return parents.values(); + } + + public Class getParentByName(String name) { + return parents.get(name); + } + + public Map> getParentsBounds() { + return parentsBounds; + } + + public List getParentBounds(Class c) { + return parentsBounds.get(c); + } + + public int getClassId() { + return classId; + } + + public Adaptation[] getAdaptationsTable() { + return adaptationsTable; + } + + public void setAdaptationsTable(Adaptation[] adaptationsTable) { + this.adaptationsTable = adaptationsTable; + } + + public List getOrderedFormalTypes() { + return orderedFormalTypes; + } + + public List getSubClasses() { + return subClasses; + } + + public void setSubClasses(List subClasses) { + this.subClasses = subClasses; + } + + public int getDegree() { + return this.subClasses.size() + this.parents.size(); + } + + public void setClassId(int classId) { + this.classId = classId; + } + + public Collection getRelatedTo() { + + Collection result = new ArrayList(); + result.addAll(this.getParents()); + result.addAll(this.getSubClasses()); + + return result; + } + + public boolean isRelatedTo(Class c) { + for(Class p : this.getParents()) { + if(p.isSameClass(c)) { + return true; + } + } + return false; + } + + public List getSuperClasses() { + return superClasses; + } + + public int getColor() { + return color; + } + + public void setColor(int color) { + this.color = color; + } + + public void allocateAdaptationTable(int i) { + this.adaptationsTable = new Adaptation[i]; + } + + public int getDepth() { + return depth; + } + + public void setDepth(int depth) { + this.depth = depth; + } + +} diff --git a/src/minigen/model/FormalType.java b/src/minigen/model/FormalType.java new file mode 100644 index 0000000..64e7508 --- /dev/null +++ b/src/minigen/model/FormalType.java @@ -0,0 +1,28 @@ +package minigen.model; + + +public class FormalType { + + private String name; + private int position; + + public FormalType(String name, int position) { + super(); + this.name = name; + this.position = position; + } + + @Override + public String toString() { + return this.getName(); + } + + public String getName() { + return name; + } + + public int getPosition() { + return position; + } + +} diff --git a/src/minigen/model/Model.java b/src/minigen/model/Model.java new file mode 100644 index 0000000..2f17e04 --- /dev/null +++ b/src/minigen/model/Model.java @@ -0,0 +1,223 @@ +package minigen.model; + +import java.util.Collection; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import minigen.exception.SemanticException; +import minigen.syntax3.node.Node; +import minigen.syntax3.node.Token; + +public class Model implements Comparator { + + private Map classesByNames; + private Map classesByNodes; + private Map colorsByClasses; + private int maxColor; + + public Model() { + this.classesByNodes = new HashMap(); + this.classesByNames = new HashMap(); + } + + /* + * For each class in model, we pre-calculate all possibles adaptations + */ + public void buildAdaptations() { + + for (Class c : this.getClasses()) { + + // Allocate table adaptation in class + c.allocateAdaptationTable(this.getClasses().size()); + + // Computation is based on classe's parents discovery + computeAdaptations(c); + + } + + } + + /* + * Compute adaptations for each class in the model + */ + public void computeAdaptations(Class c) { + + // Build adaptation for self + c.addAdaptation(c, this.getBaseAdaptation(c)); + + // Explore parents + for (Class p : c.getParents()) { + + Adaptation a = new Adaptation(p); + + // Explore generic part + if (p.isGeneric()) { + computeGenericPart(a, c.getParentsBounds().get(p)); + } + + // Add adaptation in table + c.addAdaptation(p, a); + + // Start recursion for parent exploration + computeParents(c, p, a); + + } + } + + /* + * Copy bound definition to adaptation + */ + public void computeGenericPart(Adaptation a, List bounds) { + for (Type bound : bounds) { + a.add(bound); + } + } + + /* + * Compute parents adaptation to add to child table + */ + public void computeParents(Class child, Class parent, Adaptation previous) { + + // Compute parents of parent + for (Class pp : parent.getParents()) { + + Adaptation a = new Adaptation(pp); + + // Adapt generic part (recursively) + if (pp.isGeneric()) { + + List bounds = parent.getParentBounds(pp); + + for (Type bound : bounds) { + Type adaptedBound = adaptBoundRecursively(bound, previous); + a.add(adaptedBound); + } + + } + + child.addAdaptation(pp, a); + + // Explore parents of parent (recursively) + computeParents(child, pp, a); + } + + } + + /* + * Replace current formal type by previous adaptation + */ + private Type adaptBoundRecursively(Type bound, Adaptation previous) { + if (bound.isLinkedToFormalType()) { + int pos = bound.getFormalType().getPosition(); + return previous.get(pos); + } + + if (bound.isGeneric()) { + + // build a new type definition + Type adaptedBound = new Type(bound.getName(), bound.getIntro()); + + for (Type gt : bound.getGenericTypes()) { + // Adapt generic type and replace formal types by previous + // adaptation + Type adaptedGt = adaptBoundRecursively(gt, previous); + adaptedBound.addGenericType(adaptedGt); + } + + return adaptedBound; + } + + return bound; + + } + + /* + * Compute adaptation of a class to itself + */ + public Adaptation getBaseAdaptation(Class child) { + + Adaptation a = new Adaptation(child); + + // For each bounds to this parent + if (child.isGeneric()) { + for (FormalType ft : child.getOrderedFormalTypes()) { + Type adapted = new Type(ft.getName(), child); + adapted.setFormalTypeLink(ft); + a.add(adapted); + } + } + + return a; + + } + + public boolean containsClassDeclaration(Node node) { + if (this.classesByNodes.containsKey(node)) { + return true; + } + return false; + } + + public boolean containsClassDeclaration(String name) { + if (this.classesByNames.containsKey(name)) { + return true; + } + return false; + } + + public void declareClass(Node n, Class c) { + if (containsClassDeclaration(c.getName())) { + if (c.getName().equals("Object")) { + throw new SemanticException(c.getLocation(), + "You cannot redeclare class Object"); + } + throw new SemanticException(c.getLocation(), c + + " is already declared in " + + classesByNames.get(c.getName()).getLocation().getLine() + + ":" + + classesByNames.get(c.getName()).getLocation().getPos()); + } + this.classesByNodes.put(n, c); + this.classesByNames.put(c.getName(), c); + } + + public Class getClassByNode(Token location, Node n, String name) { + if (!containsClassDeclaration(n)) { + throw new SemanticException(location, "class " + name + + " is not declared"); + } + return this.classesByNodes.get(n); + } + + public Class getClassByName(Token location, String name) { + if (!containsClassDeclaration(name)) { + throw new SemanticException(location, "class " + name + + " is not declared"); + } + return this.classesByNames.get(name); + } + + public Collection getClasses() { + return this.classesByNodes.values(); + } + + @Override + public int compare(Class arg0, Class arg1) { + return arg1.getDegree() - arg0.getDegree(); + } + + public Map getColorsByClasses() { + return colorsByClasses; + } + + public void setColorsByClasses(Map colorsByClasses) { + this.colorsByClasses = colorsByClasses; + } + + public int getMaxColor() { + return maxColor; + } + +} diff --git a/src/minigen/model/ObjectClass.java b/src/minigen/model/ObjectClass.java new file mode 100644 index 0000000..fb2ffdb --- /dev/null +++ b/src/minigen/model/ObjectClass.java @@ -0,0 +1,60 @@ +package minigen.model; + +import minigen.exception.*; + +public class ObjectClass extends Class { + + private static Class instance = null; + + private ObjectClass() { + super("Object", null, 0); + } + + public static final Class getInstance() { + if (instance == null) { + instance = new ObjectClass(); + } + return instance; + } + + @Override + public boolean isObjectIntro() { + return true; + } + + @Override + public boolean isSubClassOf(Class c) { + if(c.isObjectIntro()) { + return true; + } + return false; + } + + + @Override + public boolean isFormalTypeDeclared(String name) { + return false; + } + + @Override + public FormalType getFormalType(String name) { + throw new SemanticException(null, name + + "formal type not declared in type " + this.getName()); + } + + @Override + public int getArity() { + return 0; + } + + @Override + public String toString() { + return this.getName(); + } + + @Override + public String toStringWithParents() { + return this.toString(); + } + +} diff --git a/src/minigen/model/ObjectType.java b/src/minigen/model/ObjectType.java new file mode 100644 index 0000000..4fdf1c7 --- /dev/null +++ b/src/minigen/model/ObjectType.java @@ -0,0 +1,28 @@ +package minigen.model; + +public class ObjectType extends Type { + + private static ObjectType instance = null; + + private ObjectType() { + super("Object", ObjectClass.getInstance()); + } + + public static final ObjectType getInstance() { + if (instance == null) { + instance = new ObjectType(); + } + return instance; + } + + @Override + public boolean isGeneric() { + return false; + } + + @Override + public String toString() { + return this.getName(); + } + +} diff --git a/src/minigen/model/Type.java b/src/minigen/model/Type.java new file mode 100644 index 0000000..2e22940 --- /dev/null +++ b/src/minigen/model/Type.java @@ -0,0 +1,184 @@ +package minigen.model; + +import java.util.ArrayList; +import java.util.List; + +public class Type { + + // Type name + private String name; + + // Generic part of Type + private List genericTypes; + + // Type first introduction + private Class intro; + + private FormalType link; + + public Type(String name, Class intro) { + this.name = name; + this.intro = intro; + this.link = null; + + this.genericTypes = new ArrayList(); + } + + /* + * Is the current type a generic type ? + */ + public boolean isGeneric() { + return getArity() > 0; + } + + /* + * Is the type definition linked to a formal type ? + */ + public boolean isLinkedToFormalType() { + return link != null; + } + + /* + * Get the arity of the current type + */ + public int getArity() { + return genericTypes.size(); + } + + /* + * Formal type linked to generic type if any + */ + public FormalType getFormalType() { + return link; + } + + /* + * Check if current type isa a subtype of ot Base is used to formal type + * replacement with concrete type + */ + public boolean isa(Type ot, Type base) { + + // Check rapid subtyping using adaptation table size + if(ot.getIntro().getClassId() >= this.getIntro().getAdaptationsTable().length) { + return false; + } + + // Get adpatation for ot + Adaptation a = this.getIntro().getAdaptationsTable()[ot.getIntro().getClassId()]; + if (a == null) { + return false; + } + + // Check is expected adaptation + if(!a.isFor(ot.getIntro())) { + return false; + } + + // Replace formal type form adaptation with concrete type from type + Type toCheck = this.buildConcreteAdaptation(a, ot, base); + + for (int i = 0; i < toCheck.getGenericTypes().size(); i++) { + if (!toCheck.getGenericTypes().get(i).isa(ot.getGenericTypes().get(i),toCheck.getGenericTypes().get(i))) { + return false; + } + } + return true; + } + + /* + * Build a concrete adaptation from formal adaptation Replace each formal + * type in adaptation by concrete type provided by type to check + */ + public Type buildConcreteAdaptation(Adaptation a, Type to, Type base) { + + Type result = new Type(to.getName(), to.getIntro()); + + for (Type gt : a.getTypes()) { + + if (gt.isLinkedToFormalType()) { + int pos = gt.getFormalType().getPosition(); + Type adapted = base.getGenericTypes().get(pos); + result.addGenericType(adapted); + } else if (gt.isGeneric()) { + Type resultGt = new Type(gt.getName(), gt.getIntro()); + recursiveBuild(gt, resultGt, base); + result.addGenericType(resultGt); + } else { + result.addGenericType(gt); + } + } + + return result; + } + + /* + * Adapt generic part of new concrete adaptation recursively + */ + private void recursiveBuild(Type t, Type toAdapt, Type base) { + + for (Type gt : t.getGenericTypes()) { + if (gt.isLinkedToFormalType()) { + int pos = gt.getFormalType().getPosition(); + Type adapted = base.getGenericTypes().get(pos); + toAdapt.addGenericType(adapted); + } + if (gt.isGeneric()) { + Type resultGt = new Type(gt.getName(), gt.getIntro()); + recursiveBuild(gt, resultGt, base); + toAdapt.addGenericType(resultGt); + } + } + } + + /* + * Add a generic type to current type + */ + public void addGenericType(Type type) { + this.genericTypes.add(type); + } + + /* + * Getters, setters + */ + + @Override + public String toString() { + String str = this.getName(); + + int i = 0; + if (this.isGeneric()) { + str += "["; + for (Type type : genericTypes) { + str += type.toString(); + if (i < genericTypes.size() - 1) { + str += ", "; + } + i++; + } + str += "]"; + } + + if (this.isLinkedToFormalType()) { + str += "*"; + } + + return str; + } + + public String getName() { + return name; + } + + public List getGenericTypes() { + return genericTypes; + } + + public Class getIntro() { + return intro; + } + + public void setFormalTypeLink(FormalType link) { + this.link = link; + } + +} diff --git a/src/minigen/syntax3/analysis/Analysis.java b/src/minigen/syntax3/analysis/Analysis.java new file mode 100644 index 0000000..20c0499 --- /dev/null +++ b/src/minigen/syntax3/analysis/Analysis.java @@ -0,0 +1,44 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.analysis; + +import minigen.syntax3.node.*; + +public interface Analysis extends Switch +{ + Object getIn(Node node); + void setIn(Node node, Object o); + Object getOut(Node node); + void setOut(Node node, Object o); + + void caseStart(Start node); + void caseAProgram(AProgram node); + void caseAClassDecl(AClassDecl node); + void caseAFormalDecls(AFormalDecls node); + void caseAFormalDecl(AFormalDecl node); + void caseAAdditionalFormalTypes(AAdditionalFormalTypes node); + void caseAType(AType node); + void caseAGenericPart(AGenericPart node); + void caseAGenericTypes(AGenericTypes node); + void caseAAdditionalTypes(AAdditionalTypes node); + void caseASuperDecls(ASuperDecls node); + void caseAAdditionalSupers(AAdditionalSupers node); + void caseASuperType(ASuperType node); + void caseASuperGenericPart(ASuperGenericPart node); + void caseASuperGenericTypes(ASuperGenericTypes node); + void caseASuperAdditionalTypes(ASuperAdditionalTypes node); + void caseAIsaInstr(AIsaInstr node); + + void caseTComma(TComma node); + void caseTLb(TLb node); + void caseTRb(TRb node); + void caseTKend(TKend node); + void caseTKisa(TKisa node); + void caseTKclass(TKclass node); + void caseTKsuper(TKsuper node); + void caseTKnew(TKnew node); + void caseTName(TName node); + void caseTBlanks(TBlanks node); + void caseTComment(TComment node); + void caseEOF(EOF node); +} diff --git a/src/minigen/syntax3/analysis/AnalysisAdapter.java b/src/minigen/syntax3/analysis/AnalysisAdapter.java new file mode 100644 index 0000000..546e00b --- /dev/null +++ b/src/minigen/syntax3/analysis/AnalysisAdapter.java @@ -0,0 +1,216 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.analysis; + +import java.util.*; +import minigen.syntax3.node.*; + +public class AnalysisAdapter implements Analysis +{ + private Hashtable in; + private Hashtable out; + + public Object getIn(Node node) + { + if(this.in == null) + { + return null; + } + + return this.in.get(node); + } + + public void setIn(Node node, Object o) + { + if(this.in == null) + { + this.in = new Hashtable(1); + } + + if(o != null) + { + this.in.put(node, o); + } + else + { + this.in.remove(node); + } + } + + public Object getOut(Node node) + { + if(this.out == null) + { + return null; + } + + return this.out.get(node); + } + + public void setOut(Node node, Object o) + { + if(this.out == null) + { + this.out = new Hashtable(1); + } + + if(o != null) + { + this.out.put(node, o); + } + else + { + this.out.remove(node); + } + } + + public void caseStart(Start node) + { + defaultCase(node); + } + + public void caseAProgram(AProgram node) + { + defaultCase(node); + } + + public void caseAClassDecl(AClassDecl node) + { + defaultCase(node); + } + + public void caseAFormalDecls(AFormalDecls node) + { + defaultCase(node); + } + + public void caseAFormalDecl(AFormalDecl node) + { + defaultCase(node); + } + + public void caseAAdditionalFormalTypes(AAdditionalFormalTypes node) + { + defaultCase(node); + } + + public void caseAType(AType node) + { + defaultCase(node); + } + + public void caseAGenericPart(AGenericPart node) + { + defaultCase(node); + } + + public void caseAGenericTypes(AGenericTypes node) + { + defaultCase(node); + } + + public void caseAAdditionalTypes(AAdditionalTypes node) + { + defaultCase(node); + } + + public void caseASuperDecls(ASuperDecls node) + { + defaultCase(node); + } + + public void caseAAdditionalSupers(AAdditionalSupers node) + { + defaultCase(node); + } + + public void caseASuperType(ASuperType node) + { + defaultCase(node); + } + + public void caseASuperGenericPart(ASuperGenericPart node) + { + defaultCase(node); + } + + public void caseASuperGenericTypes(ASuperGenericTypes node) + { + defaultCase(node); + } + + public void caseASuperAdditionalTypes(ASuperAdditionalTypes node) + { + defaultCase(node); + } + + public void caseAIsaInstr(AIsaInstr node) + { + defaultCase(node); + } + + public void caseTComma(TComma node) + { + defaultCase(node); + } + + public void caseTLb(TLb node) + { + defaultCase(node); + } + + public void caseTRb(TRb node) + { + defaultCase(node); + } + + public void caseTKend(TKend node) + { + defaultCase(node); + } + + public void caseTKisa(TKisa node) + { + defaultCase(node); + } + + public void caseTKclass(TKclass node) + { + defaultCase(node); + } + + public void caseTKsuper(TKsuper node) + { + defaultCase(node); + } + + public void caseTKnew(TKnew node) + { + defaultCase(node); + } + + public void caseTName(TName node) + { + defaultCase(node); + } + + public void caseTBlanks(TBlanks node) + { + defaultCase(node); + } + + public void caseTComment(TComment node) + { + defaultCase(node); + } + + public void caseEOF(EOF node) + { + defaultCase(node); + } + + public void defaultCase(@SuppressWarnings("unused") Node node) + { + // do nothing + } +} diff --git a/src/minigen/syntax3/analysis/DepthFirstAdapter.java b/src/minigen/syntax3/analysis/DepthFirstAdapter.java new file mode 100644 index 0000000..baaf384 --- /dev/null +++ b/src/minigen/syntax3/analysis/DepthFirstAdapter.java @@ -0,0 +1,491 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.analysis; + +import java.util.*; +import minigen.syntax3.node.*; + +public class DepthFirstAdapter extends AnalysisAdapter +{ + public void inStart(Start node) + { + defaultIn(node); + } + + public void outStart(Start node) + { + defaultOut(node); + } + + public void defaultIn(@SuppressWarnings("unused") Node node) + { + // Do nothing + } + + public void defaultOut(@SuppressWarnings("unused") Node node) + { + // Do nothing + } + + @Override + public void caseStart(Start node) + { + inStart(node); + node.getPProgram().apply(this); + node.getEOF().apply(this); + outStart(node); + } + + public void inAProgram(AProgram node) + { + defaultIn(node); + } + + public void outAProgram(AProgram node) + { + defaultOut(node); + } + + @Override + public void caseAProgram(AProgram node) + { + inAProgram(node); + { + List copy = new ArrayList(node.getClasses()); + for(PClassDecl e : copy) + { + e.apply(this); + } + } + { + List copy = new ArrayList(node.getInstrs()); + for(PInstr e : copy) + { + e.apply(this); + } + } + outAProgram(node); + } + + public void inAClassDecl(AClassDecl node) + { + defaultIn(node); + } + + public void outAClassDecl(AClassDecl node) + { + defaultOut(node); + } + + @Override + public void caseAClassDecl(AClassDecl node) + { + inAClassDecl(node); + if(node.getKclass() != null) + { + node.getKclass().apply(this); + } + if(node.getName() != null) + { + node.getName().apply(this); + } + if(node.getFormalDecls() != null) + { + node.getFormalDecls().apply(this); + } + if(node.getSuperDecls() != null) + { + node.getSuperDecls().apply(this); + } + if(node.getKend() != null) + { + node.getKend().apply(this); + } + outAClassDecl(node); + } + + public void inAFormalDecls(AFormalDecls node) + { + defaultIn(node); + } + + public void outAFormalDecls(AFormalDecls node) + { + defaultOut(node); + } + + @Override + public void caseAFormalDecls(AFormalDecls node) + { + inAFormalDecls(node); + if(node.getLb() != null) + { + node.getLb().apply(this); + } + { + List copy = new ArrayList(node.getFormalDecl()); + for(PFormalDecl e : copy) + { + e.apply(this); + } + } + if(node.getRb() != null) + { + node.getRb().apply(this); + } + outAFormalDecls(node); + } + + public void inAFormalDecl(AFormalDecl node) + { + defaultIn(node); + } + + public void outAFormalDecl(AFormalDecl node) + { + defaultOut(node); + } + + @Override + public void caseAFormalDecl(AFormalDecl node) + { + inAFormalDecl(node); + if(node.getName() != null) + { + node.getName().apply(this); + } + { + List copy = new ArrayList(node.getAdditionalFormalTypes()); + for(PAdditionalFormalTypes e : copy) + { + e.apply(this); + } + } + outAFormalDecl(node); + } + + public void inAAdditionalFormalTypes(AAdditionalFormalTypes node) + { + defaultIn(node); + } + + public void outAAdditionalFormalTypes(AAdditionalFormalTypes node) + { + defaultOut(node); + } + + @Override + public void caseAAdditionalFormalTypes(AAdditionalFormalTypes node) + { + inAAdditionalFormalTypes(node); + if(node.getComma() != null) + { + node.getComma().apply(this); + } + if(node.getName() != null) + { + node.getName().apply(this); + } + outAAdditionalFormalTypes(node); + } + + public void inAType(AType node) + { + defaultIn(node); + } + + public void outAType(AType node) + { + defaultOut(node); + } + + @Override + public void caseAType(AType node) + { + inAType(node); + if(node.getName() != null) + { + node.getName().apply(this); + } + if(node.getGenericPart() != null) + { + node.getGenericPart().apply(this); + } + outAType(node); + } + + public void inAGenericPart(AGenericPart node) + { + defaultIn(node); + } + + public void outAGenericPart(AGenericPart node) + { + defaultOut(node); + } + + @Override + public void caseAGenericPart(AGenericPart node) + { + inAGenericPart(node); + if(node.getLb() != null) + { + node.getLb().apply(this); + } + if(node.getGenericTypes() != null) + { + node.getGenericTypes().apply(this); + } + if(node.getRb() != null) + { + node.getRb().apply(this); + } + outAGenericPart(node); + } + + public void inAGenericTypes(AGenericTypes node) + { + defaultIn(node); + } + + public void outAGenericTypes(AGenericTypes node) + { + defaultOut(node); + } + + @Override + public void caseAGenericTypes(AGenericTypes node) + { + inAGenericTypes(node); + if(node.getType() != null) + { + node.getType().apply(this); + } + { + List copy = new ArrayList(node.getAdditionalTypes()); + for(PAdditionalTypes e : copy) + { + e.apply(this); + } + } + outAGenericTypes(node); + } + + public void inAAdditionalTypes(AAdditionalTypes node) + { + defaultIn(node); + } + + public void outAAdditionalTypes(AAdditionalTypes node) + { + defaultOut(node); + } + + @Override + public void caseAAdditionalTypes(AAdditionalTypes node) + { + inAAdditionalTypes(node); + if(node.getComma() != null) + { + node.getComma().apply(this); + } + if(node.getType() != null) + { + node.getType().apply(this); + } + outAAdditionalTypes(node); + } + + public void inASuperDecls(ASuperDecls node) + { + defaultIn(node); + } + + public void outASuperDecls(ASuperDecls node) + { + defaultOut(node); + } + + @Override + public void caseASuperDecls(ASuperDecls node) + { + inASuperDecls(node); + if(node.getKsuper() != null) + { + node.getKsuper().apply(this); + } + if(node.getSuperType() != null) + { + node.getSuperType().apply(this); + } + { + List copy = new ArrayList(node.getAdditionalSupers()); + for(PAdditionalSupers e : copy) + { + e.apply(this); + } + } + outASuperDecls(node); + } + + public void inAAdditionalSupers(AAdditionalSupers node) + { + defaultIn(node); + } + + public void outAAdditionalSupers(AAdditionalSupers node) + { + defaultOut(node); + } + + @Override + public void caseAAdditionalSupers(AAdditionalSupers node) + { + inAAdditionalSupers(node); + if(node.getComma() != null) + { + node.getComma().apply(this); + } + if(node.getSuperType() != null) + { + node.getSuperType().apply(this); + } + outAAdditionalSupers(node); + } + + public void inASuperType(ASuperType node) + { + defaultIn(node); + } + + public void outASuperType(ASuperType node) + { + defaultOut(node); + } + + @Override + public void caseASuperType(ASuperType node) + { + inASuperType(node); + if(node.getName() != null) + { + node.getName().apply(this); + } + if(node.getSuperGenericPart() != null) + { + node.getSuperGenericPart().apply(this); + } + outASuperType(node); + } + + public void inASuperGenericPart(ASuperGenericPart node) + { + defaultIn(node); + } + + public void outASuperGenericPart(ASuperGenericPart node) + { + defaultOut(node); + } + + @Override + public void caseASuperGenericPart(ASuperGenericPart node) + { + inASuperGenericPart(node); + if(node.getLb() != null) + { + node.getLb().apply(this); + } + if(node.getSuperGenericTypes() != null) + { + node.getSuperGenericTypes().apply(this); + } + if(node.getRb() != null) + { + node.getRb().apply(this); + } + outASuperGenericPart(node); + } + + public void inASuperGenericTypes(ASuperGenericTypes node) + { + defaultIn(node); + } + + public void outASuperGenericTypes(ASuperGenericTypes node) + { + defaultOut(node); + } + + @Override + public void caseASuperGenericTypes(ASuperGenericTypes node) + { + inASuperGenericTypes(node); + if(node.getSuperType() != null) + { + node.getSuperType().apply(this); + } + { + List copy = new ArrayList(node.getSuperAdditionalTypes()); + for(PSuperAdditionalTypes e : copy) + { + e.apply(this); + } + } + outASuperGenericTypes(node); + } + + public void inASuperAdditionalTypes(ASuperAdditionalTypes node) + { + defaultIn(node); + } + + public void outASuperAdditionalTypes(ASuperAdditionalTypes node) + { + defaultOut(node); + } + + @Override + public void caseASuperAdditionalTypes(ASuperAdditionalTypes node) + { + inASuperAdditionalTypes(node); + if(node.getComma() != null) + { + node.getComma().apply(this); + } + if(node.getSuperType() != null) + { + node.getSuperType().apply(this); + } + outASuperAdditionalTypes(node); + } + + public void inAIsaInstr(AIsaInstr node) + { + defaultIn(node); + } + + public void outAIsaInstr(AIsaInstr node) + { + defaultOut(node); + } + + @Override + public void caseAIsaInstr(AIsaInstr node) + { + inAIsaInstr(node); + if(node.getLeft() != null) + { + node.getLeft().apply(this); + } + if(node.getKisa() != null) + { + node.getKisa().apply(this); + } + if(node.getRight() != null) + { + node.getRight().apply(this); + } + outAIsaInstr(node); + } +} diff --git a/src/minigen/syntax3/analysis/ReversedDepthFirstAdapter.java b/src/minigen/syntax3/analysis/ReversedDepthFirstAdapter.java new file mode 100644 index 0000000..9b28dc5 --- /dev/null +++ b/src/minigen/syntax3/analysis/ReversedDepthFirstAdapter.java @@ -0,0 +1,498 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.analysis; + +import java.util.*; +import minigen.syntax3.node.*; + +public class ReversedDepthFirstAdapter extends AnalysisAdapter +{ + public void inStart(Start node) + { + defaultIn(node); + } + + public void outStart(Start node) + { + defaultOut(node); + } + + public void defaultIn(@SuppressWarnings("unused") Node node) + { + // Do nothing + } + + public void defaultOut(@SuppressWarnings("unused") Node node) + { + // Do nothing + } + + @Override + public void caseStart(Start node) + { + inStart(node); + node.getEOF().apply(this); + node.getPProgram().apply(this); + outStart(node); + } + + public void inAProgram(AProgram node) + { + defaultIn(node); + } + + public void outAProgram(AProgram node) + { + defaultOut(node); + } + + @Override + public void caseAProgram(AProgram node) + { + inAProgram(node); + { + List copy = new ArrayList(node.getInstrs()); + Collections.reverse(copy); + for(PInstr e : copy) + { + e.apply(this); + } + } + { + List copy = new ArrayList(node.getClasses()); + Collections.reverse(copy); + for(PClassDecl e : copy) + { + e.apply(this); + } + } + outAProgram(node); + } + + public void inAClassDecl(AClassDecl node) + { + defaultIn(node); + } + + public void outAClassDecl(AClassDecl node) + { + defaultOut(node); + } + + @Override + public void caseAClassDecl(AClassDecl node) + { + inAClassDecl(node); + if(node.getKend() != null) + { + node.getKend().apply(this); + } + if(node.getSuperDecls() != null) + { + node.getSuperDecls().apply(this); + } + if(node.getFormalDecls() != null) + { + node.getFormalDecls().apply(this); + } + if(node.getName() != null) + { + node.getName().apply(this); + } + if(node.getKclass() != null) + { + node.getKclass().apply(this); + } + outAClassDecl(node); + } + + public void inAFormalDecls(AFormalDecls node) + { + defaultIn(node); + } + + public void outAFormalDecls(AFormalDecls node) + { + defaultOut(node); + } + + @Override + public void caseAFormalDecls(AFormalDecls node) + { + inAFormalDecls(node); + if(node.getRb() != null) + { + node.getRb().apply(this); + } + { + List copy = new ArrayList(node.getFormalDecl()); + Collections.reverse(copy); + for(PFormalDecl e : copy) + { + e.apply(this); + } + } + if(node.getLb() != null) + { + node.getLb().apply(this); + } + outAFormalDecls(node); + } + + public void inAFormalDecl(AFormalDecl node) + { + defaultIn(node); + } + + public void outAFormalDecl(AFormalDecl node) + { + defaultOut(node); + } + + @Override + public void caseAFormalDecl(AFormalDecl node) + { + inAFormalDecl(node); + { + List copy = new ArrayList(node.getAdditionalFormalTypes()); + Collections.reverse(copy); + for(PAdditionalFormalTypes e : copy) + { + e.apply(this); + } + } + if(node.getName() != null) + { + node.getName().apply(this); + } + outAFormalDecl(node); + } + + public void inAAdditionalFormalTypes(AAdditionalFormalTypes node) + { + defaultIn(node); + } + + public void outAAdditionalFormalTypes(AAdditionalFormalTypes node) + { + defaultOut(node); + } + + @Override + public void caseAAdditionalFormalTypes(AAdditionalFormalTypes node) + { + inAAdditionalFormalTypes(node); + if(node.getName() != null) + { + node.getName().apply(this); + } + if(node.getComma() != null) + { + node.getComma().apply(this); + } + outAAdditionalFormalTypes(node); + } + + public void inAType(AType node) + { + defaultIn(node); + } + + public void outAType(AType node) + { + defaultOut(node); + } + + @Override + public void caseAType(AType node) + { + inAType(node); + if(node.getGenericPart() != null) + { + node.getGenericPart().apply(this); + } + if(node.getName() != null) + { + node.getName().apply(this); + } + outAType(node); + } + + public void inAGenericPart(AGenericPart node) + { + defaultIn(node); + } + + public void outAGenericPart(AGenericPart node) + { + defaultOut(node); + } + + @Override + public void caseAGenericPart(AGenericPart node) + { + inAGenericPart(node); + if(node.getRb() != null) + { + node.getRb().apply(this); + } + if(node.getGenericTypes() != null) + { + node.getGenericTypes().apply(this); + } + if(node.getLb() != null) + { + node.getLb().apply(this); + } + outAGenericPart(node); + } + + public void inAGenericTypes(AGenericTypes node) + { + defaultIn(node); + } + + public void outAGenericTypes(AGenericTypes node) + { + defaultOut(node); + } + + @Override + public void caseAGenericTypes(AGenericTypes node) + { + inAGenericTypes(node); + { + List copy = new ArrayList(node.getAdditionalTypes()); + Collections.reverse(copy); + for(PAdditionalTypes e : copy) + { + e.apply(this); + } + } + if(node.getType() != null) + { + node.getType().apply(this); + } + outAGenericTypes(node); + } + + public void inAAdditionalTypes(AAdditionalTypes node) + { + defaultIn(node); + } + + public void outAAdditionalTypes(AAdditionalTypes node) + { + defaultOut(node); + } + + @Override + public void caseAAdditionalTypes(AAdditionalTypes node) + { + inAAdditionalTypes(node); + if(node.getType() != null) + { + node.getType().apply(this); + } + if(node.getComma() != null) + { + node.getComma().apply(this); + } + outAAdditionalTypes(node); + } + + public void inASuperDecls(ASuperDecls node) + { + defaultIn(node); + } + + public void outASuperDecls(ASuperDecls node) + { + defaultOut(node); + } + + @Override + public void caseASuperDecls(ASuperDecls node) + { + inASuperDecls(node); + { + List copy = new ArrayList(node.getAdditionalSupers()); + Collections.reverse(copy); + for(PAdditionalSupers e : copy) + { + e.apply(this); + } + } + if(node.getSuperType() != null) + { + node.getSuperType().apply(this); + } + if(node.getKsuper() != null) + { + node.getKsuper().apply(this); + } + outASuperDecls(node); + } + + public void inAAdditionalSupers(AAdditionalSupers node) + { + defaultIn(node); + } + + public void outAAdditionalSupers(AAdditionalSupers node) + { + defaultOut(node); + } + + @Override + public void caseAAdditionalSupers(AAdditionalSupers node) + { + inAAdditionalSupers(node); + if(node.getSuperType() != null) + { + node.getSuperType().apply(this); + } + if(node.getComma() != null) + { + node.getComma().apply(this); + } + outAAdditionalSupers(node); + } + + public void inASuperType(ASuperType node) + { + defaultIn(node); + } + + public void outASuperType(ASuperType node) + { + defaultOut(node); + } + + @Override + public void caseASuperType(ASuperType node) + { + inASuperType(node); + if(node.getSuperGenericPart() != null) + { + node.getSuperGenericPart().apply(this); + } + if(node.getName() != null) + { + node.getName().apply(this); + } + outASuperType(node); + } + + public void inASuperGenericPart(ASuperGenericPart node) + { + defaultIn(node); + } + + public void outASuperGenericPart(ASuperGenericPart node) + { + defaultOut(node); + } + + @Override + public void caseASuperGenericPart(ASuperGenericPart node) + { + inASuperGenericPart(node); + if(node.getRb() != null) + { + node.getRb().apply(this); + } + if(node.getSuperGenericTypes() != null) + { + node.getSuperGenericTypes().apply(this); + } + if(node.getLb() != null) + { + node.getLb().apply(this); + } + outASuperGenericPart(node); + } + + public void inASuperGenericTypes(ASuperGenericTypes node) + { + defaultIn(node); + } + + public void outASuperGenericTypes(ASuperGenericTypes node) + { + defaultOut(node); + } + + @Override + public void caseASuperGenericTypes(ASuperGenericTypes node) + { + inASuperGenericTypes(node); + { + List copy = new ArrayList(node.getSuperAdditionalTypes()); + Collections.reverse(copy); + for(PSuperAdditionalTypes e : copy) + { + e.apply(this); + } + } + if(node.getSuperType() != null) + { + node.getSuperType().apply(this); + } + outASuperGenericTypes(node); + } + + public void inASuperAdditionalTypes(ASuperAdditionalTypes node) + { + defaultIn(node); + } + + public void outASuperAdditionalTypes(ASuperAdditionalTypes node) + { + defaultOut(node); + } + + @Override + public void caseASuperAdditionalTypes(ASuperAdditionalTypes node) + { + inASuperAdditionalTypes(node); + if(node.getSuperType() != null) + { + node.getSuperType().apply(this); + } + if(node.getComma() != null) + { + node.getComma().apply(this); + } + outASuperAdditionalTypes(node); + } + + public void inAIsaInstr(AIsaInstr node) + { + defaultIn(node); + } + + public void outAIsaInstr(AIsaInstr node) + { + defaultOut(node); + } + + @Override + public void caseAIsaInstr(AIsaInstr node) + { + inAIsaInstr(node); + if(node.getRight() != null) + { + node.getRight().apply(this); + } + if(node.getKisa() != null) + { + node.getKisa().apply(this); + } + if(node.getLeft() != null) + { + node.getLeft().apply(this); + } + outAIsaInstr(node); + } +} diff --git a/src/minigen/syntax3/lexer/Lexer.java b/src/minigen/syntax3/lexer/Lexer.java new file mode 100644 index 0000000..6d783cc --- /dev/null +++ b/src/minigen/syntax3/lexer/Lexer.java @@ -0,0 +1,470 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.lexer; + +import java.io.*; +import minigen.syntax3.node.*; + +@SuppressWarnings("nls") +public class Lexer +{ + protected Token token; + protected State state = State.INITIAL; + + private PushbackReader in; + private int line; + private int pos; + private boolean cr; + private boolean eof; + private final StringBuffer text = new StringBuffer(); + + @SuppressWarnings("unused") + protected void filter() throws LexerException, IOException + { + // Do nothing + } + + public Lexer(@SuppressWarnings("hiding") PushbackReader in) + { + this.in = in; + } + + public Token peek() throws LexerException, IOException + { + while(this.token == null) + { + this.token = getToken(); + filter(); + } + + return this.token; + } + + public Token next() throws LexerException, IOException + { + while(this.token == null) + { + this.token = getToken(); + filter(); + } + + Token result = this.token; + this.token = null; + return result; + } + + protected Token getToken() throws IOException, LexerException + { + int dfa_state = 0; + + int start_pos = this.pos; + int start_line = this.line; + + int accept_state = -1; + int accept_token = -1; + int accept_length = -1; + int accept_pos = -1; + int accept_line = -1; + + @SuppressWarnings("hiding") int[][][] gotoTable = Lexer.gotoTable[this.state.id()]; + @SuppressWarnings("hiding") int[] accept = Lexer.accept[this.state.id()]; + this.text.setLength(0); + + while(true) + { + int c = getChar(); + + if(c != -1) + { + switch(c) + { + case 10: + if(this.cr) + { + this.cr = false; + } + else + { + this.line++; + this.pos = 0; + } + break; + case 13: + this.line++; + this.pos = 0; + this.cr = true; + break; + default: + this.pos++; + this.cr = false; + break; + } + + this.text.append((char) c); + + do + { + int oldState = (dfa_state < -1) ? (-2 -dfa_state) : dfa_state; + + dfa_state = -1; + + int[][] tmp1 = gotoTable[oldState]; + int low = 0; + int high = tmp1.length - 1; + + while(low <= high) + { + int middle = (low + high) / 2; + int[] tmp2 = tmp1[middle]; + + if(c < tmp2[0]) + { + high = middle - 1; + } + else if(c > tmp2[1]) + { + low = middle + 1; + } + else + { + dfa_state = tmp2[2]; + break; + } + } + }while(dfa_state < -1); + } + else + { + dfa_state = -1; + } + + if(dfa_state >= 0) + { + if(accept[dfa_state] != -1) + { + accept_state = dfa_state; + accept_token = accept[dfa_state]; + accept_length = this.text.length(); + accept_pos = this.pos; + accept_line = this.line; + } + } + else + { + if(accept_state != -1) + { + switch(accept_token) + { + case 0: + { + @SuppressWarnings("hiding") Token token = new0( + start_line + 1, + start_pos + 1); + pushBack(accept_length); + this.pos = accept_pos; + this.line = accept_line; + return token; + } + case 1: + { + @SuppressWarnings("hiding") Token token = new1( + start_line + 1, + start_pos + 1); + pushBack(accept_length); + this.pos = accept_pos; + this.line = accept_line; + return token; + } + case 2: + { + @SuppressWarnings("hiding") Token token = new2( + start_line + 1, + start_pos + 1); + pushBack(accept_length); + this.pos = accept_pos; + this.line = accept_line; + return token; + } + case 3: + { + @SuppressWarnings("hiding") Token token = new3( + start_line + 1, + start_pos + 1); + pushBack(accept_length); + this.pos = accept_pos; + this.line = accept_line; + return token; + } + case 4: + { + @SuppressWarnings("hiding") Token token = new4( + start_line + 1, + start_pos + 1); + pushBack(accept_length); + this.pos = accept_pos; + this.line = accept_line; + return token; + } + case 5: + { + @SuppressWarnings("hiding") Token token = new5( + start_line + 1, + start_pos + 1); + pushBack(accept_length); + this.pos = accept_pos; + this.line = accept_line; + return token; + } + case 6: + { + @SuppressWarnings("hiding") Token token = new6( + start_line + 1, + start_pos + 1); + pushBack(accept_length); + this.pos = accept_pos; + this.line = accept_line; + return token; + } + case 7: + { + @SuppressWarnings("hiding") Token token = new7( + start_line + 1, + start_pos + 1); + pushBack(accept_length); + this.pos = accept_pos; + this.line = accept_line; + return token; + } + case 8: + { + @SuppressWarnings("hiding") Token token = new8( + getText(accept_length), + start_line + 1, + start_pos + 1); + pushBack(accept_length); + this.pos = accept_pos; + this.line = accept_line; + return token; + } + case 9: + { + @SuppressWarnings("hiding") Token token = new9( + getText(accept_length), + start_line + 1, + start_pos + 1); + pushBack(accept_length); + this.pos = accept_pos; + this.line = accept_line; + return token; + } + case 10: + { + @SuppressWarnings("hiding") Token token = new10( + getText(accept_length), + start_line + 1, + start_pos + 1); + pushBack(accept_length); + this.pos = accept_pos; + this.line = accept_line; + return token; + } + } + } + else + { + if(this.text.length() > 0) + { + throw new LexerException( + "[" + (start_line + 1) + "," + (start_pos + 1) + "]" + + " Unknown token: " + this.text); + } + + @SuppressWarnings("hiding") EOF token = new EOF( + start_line + 1, + start_pos + 1); + return token; + } + } + } + } + + Token new0(@SuppressWarnings("hiding") int line, @SuppressWarnings("hiding") int pos) { return new TComma(line, pos); } + Token new1(@SuppressWarnings("hiding") int line, @SuppressWarnings("hiding") int pos) { return new TLb(line, pos); } + Token new2(@SuppressWarnings("hiding") int line, @SuppressWarnings("hiding") int pos) { return new TRb(line, pos); } + Token new3(@SuppressWarnings("hiding") int line, @SuppressWarnings("hiding") int pos) { return new TKend(line, pos); } + Token new4(@SuppressWarnings("hiding") int line, @SuppressWarnings("hiding") int pos) { return new TKisa(line, pos); } + Token new5(@SuppressWarnings("hiding") int line, @SuppressWarnings("hiding") int pos) { return new TKclass(line, pos); } + Token new6(@SuppressWarnings("hiding") int line, @SuppressWarnings("hiding") int pos) { return new TKsuper(line, pos); } + Token new7(@SuppressWarnings("hiding") int line, @SuppressWarnings("hiding") int pos) { return new TKnew(line, pos); } + Token new8(@SuppressWarnings("hiding") String text, @SuppressWarnings("hiding") int line, @SuppressWarnings("hiding") int pos) { return new TName(text, line, pos); } + Token new9(@SuppressWarnings("hiding") String text, @SuppressWarnings("hiding") int line, @SuppressWarnings("hiding") int pos) { return new TBlanks(text, line, pos); } + Token new10(@SuppressWarnings("hiding") String text, @SuppressWarnings("hiding") int line, @SuppressWarnings("hiding") int pos) { return new TComment(text, line, pos); } + + private int getChar() throws IOException + { + if(this.eof) + { + return -1; + } + + int result = this.in.read(); + + if(result == -1) + { + this.eof = true; + } + + return result; + } + + private void pushBack(int acceptLength) throws IOException + { + int length = this.text.length(); + for(int i = length - 1; i >= acceptLength; i--) + { + this.eof = false; + + this.in.unread(this.text.charAt(i)); + } + } + + protected void unread(@SuppressWarnings("hiding") Token token) throws IOException + { + @SuppressWarnings("hiding") String text = token.getText(); + int length = text.length(); + + for(int i = length - 1; i >= 0; i--) + { + this.eof = false; + + this.in.unread(text.charAt(i)); + } + + this.pos = token.getPos() - 1; + this.line = token.getLine() - 1; + } + + private String getText(int acceptLength) + { + StringBuffer s = new StringBuffer(acceptLength); + for(int i = 0; i < acceptLength; i++) + { + s.append(this.text.charAt(i)); + } + + return s.toString(); + } + + private static int[][][][] gotoTable; +/* { + { // INITIAL + {{9, 9, 1}, {10, 10, 2}, {13, 13, 3}, {32, 32, 4}, {35, 35, 5}, {44, 44, 6}, {65, 90, 7}, {91, 91, 8}, {93, 93, 9}, {99, 99, 10}, {101, 101, 11}, {105, 105, 12}, {110, 110, 13}, {115, 115, 14}, }, + {{9, 32, -2}, }, + {{9, 32, -2}, }, + {{9, 9, 1}, {10, 10, 15}, {13, 32, -2}, }, + {{9, 32, -2}, }, + {{0, 9, 16}, {11, 12, 16}, {14, 127, 16}, }, + {}, + {{48, 57, 17}, {65, 90, 18}, {97, 122, 18}, }, + {}, + {}, + {{108, 108, 19}, }, + {{110, 110, 20}, }, + {{115, 115, 21}, }, + {{101, 101, 22}, }, + {{117, 117, 23}, }, + {{9, 32, -2}, }, + {{0, 127, -7}, }, + {{48, 122, -9}, }, + {{48, 122, -9}, }, + {{97, 97, 24}, }, + {{100, 100, 25}, }, + {{97, 97, 26}, }, + {{119, 119, 27}, }, + {{112, 112, 28}, }, + {{115, 115, 29}, }, + {}, + {}, + {}, + {{101, 101, 30}, }, + {{115, 115, 31}, }, + {{114, 114, 32}, }, + {}, + {}, + } + };*/ + + private static int[][] accept; +/* { + // INITIAL + {-1, 9, 9, 9, 9, 10, 0, 8, 1, 2, -1, -1, -1, -1, -1, 9, 10, 8, 8, -1, -1, -1, -1, -1, -1, 3, 4, 7, -1, -1, -1, 5, 6, }, + + };*/ + + public static class State + { + public final static State INITIAL = new State(0); + + private int id; + + private State(@SuppressWarnings("hiding") int id) + { + this.id = id; + } + + public int id() + { + return this.id; + } + } + + static + { + try + { + DataInputStream s = new DataInputStream( + new BufferedInputStream( + Lexer.class.getResourceAsStream("lexer.dat"))); + + // read gotoTable + int length = s.readInt(); + gotoTable = new int[length][][][]; + for(int i = 0; i < gotoTable.length; i++) + { + length = s.readInt(); + gotoTable[i] = new int[length][][]; + for(int j = 0; j < gotoTable[i].length; j++) + { + length = s.readInt(); + gotoTable[i][j] = new int[length][3]; + for(int k = 0; k < gotoTable[i][j].length; k++) + { + for(int l = 0; l < 3; l++) + { + gotoTable[i][j][k][l] = s.readInt(); + } + } + } + } + + // read accept + length = s.readInt(); + accept = new int[length][]; + for(int i = 0; i < accept.length; i++) + { + length = s.readInt(); + accept[i] = new int[length]; + for(int j = 0; j < accept[i].length; j++) + { + accept[i][j] = s.readInt(); + } + } + + s.close(); + } + catch(Exception e) + { + throw new RuntimeException("The file \"lexer.dat\" is either missing or corrupted."); + } + } +} diff --git a/src/minigen/syntax3/lexer/LexerException.java b/src/minigen/syntax3/lexer/LexerException.java new file mode 100644 index 0000000..8d2428a --- /dev/null +++ b/src/minigen/syntax3/lexer/LexerException.java @@ -0,0 +1,12 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.lexer; + +@SuppressWarnings("serial") +public class LexerException extends Exception +{ + public LexerException(String message) + { + super(message); + } +} diff --git a/src/minigen/syntax3/lexer/lexer.dat b/src/minigen/syntax3/lexer/lexer.dat new file mode 100644 index 0000000000000000000000000000000000000000..da18cf6e0de629357d0e80a16fee7ed7f1d25ec9 GIT binary patch literal 808 zcmaKqK}$kG6on@(H8U$MQ!9PawnbZ){td-NREr=Y3=!P;v!hL~@5s3j4{PA#%$a-V z&Asy`rL>n)8bK2djn?X>gdUqRnwfp{)*PUBrh-mj3RRey8ag*R=h5h#XLE$UmRhkA`(2F&FncWA#rMFugHH=_O=jsF>{ccY _additionalFormalTypes_ = new LinkedList(); + + public AFormalDecl() + { + // Constructor + } + + public AFormalDecl( + @SuppressWarnings("hiding") TName _name_, + @SuppressWarnings("hiding") List _additionalFormalTypes_) + { + // Constructor + setName(_name_); + + setAdditionalFormalTypes(_additionalFormalTypes_); + + } + + @Override + public Object clone() + { + return new AFormalDecl( + cloneNode(this._name_), + cloneList(this._additionalFormalTypes_)); + } + + public void apply(Switch sw) + { + ((Analysis) sw).caseAFormalDecl(this); + } + + public TName getName() + { + return this._name_; + } + + public void setName(TName node) + { + if(this._name_ != null) + { + this._name_.parent(null); + } + + if(node != null) + { + if(node.parent() != null) + { + node.parent().removeChild(node); + } + + node.parent(this); + } + + this._name_ = node; + } + + public LinkedList getAdditionalFormalTypes() + { + return this._additionalFormalTypes_; + } + + public void setAdditionalFormalTypes(List list) + { + this._additionalFormalTypes_.clear(); + this._additionalFormalTypes_.addAll(list); + for(PAdditionalFormalTypes e : list) + { + if(e.parent() != null) + { + e.parent().removeChild(e); + } + + e.parent(this); + } + } + + @Override + public String toString() + { + return "" + + toString(this._name_) + + toString(this._additionalFormalTypes_); + } + + @Override + void removeChild(@SuppressWarnings("unused") Node child) + { + // Remove child + if(this._name_ == child) + { + this._name_ = null; + return; + } + + if(this._additionalFormalTypes_.remove(child)) + { + return; + } + + throw new RuntimeException("Not a child."); + } + + @Override + void replaceChild(@SuppressWarnings("unused") Node oldChild, @SuppressWarnings("unused") Node newChild) + { + // Replace child + if(this._name_ == oldChild) + { + setName((TName) newChild); + return; + } + + for(ListIterator i = this._additionalFormalTypes_.listIterator(); i.hasNext();) + { + if(i.next() == oldChild) + { + if(newChild != null) + { + i.set((PAdditionalFormalTypes) newChild); + newChild.parent(this); + oldChild.parent(null); + return; + } + + i.remove(); + oldChild.parent(null); + return; + } + } + + throw new RuntimeException("Not a child."); + } +} diff --git a/src/minigen/syntax3/node/AFormalDecls.java b/src/minigen/syntax3/node/AFormalDecls.java new file mode 100644 index 0000000..0eda962 --- /dev/null +++ b/src/minigen/syntax3/node/AFormalDecls.java @@ -0,0 +1,187 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.node; + +import java.util.*; +import minigen.syntax3.analysis.*; + +@SuppressWarnings("nls") +public final class AFormalDecls extends PFormalDecls +{ + private TLb _lb_; + private final LinkedList _formalDecl_ = new LinkedList(); + private TRb _rb_; + + public AFormalDecls() + { + // Constructor + } + + public AFormalDecls( + @SuppressWarnings("hiding") TLb _lb_, + @SuppressWarnings("hiding") List _formalDecl_, + @SuppressWarnings("hiding") TRb _rb_) + { + // Constructor + setLb(_lb_); + + setFormalDecl(_formalDecl_); + + setRb(_rb_); + + } + + @Override + public Object clone() + { + return new AFormalDecls( + cloneNode(this._lb_), + cloneList(this._formalDecl_), + cloneNode(this._rb_)); + } + + public void apply(Switch sw) + { + ((Analysis) sw).caseAFormalDecls(this); + } + + public TLb getLb() + { + return this._lb_; + } + + public void setLb(TLb node) + { + if(this._lb_ != null) + { + this._lb_.parent(null); + } + + if(node != null) + { + if(node.parent() != null) + { + node.parent().removeChild(node); + } + + node.parent(this); + } + + this._lb_ = node; + } + + public LinkedList getFormalDecl() + { + return this._formalDecl_; + } + + public void setFormalDecl(List list) + { + this._formalDecl_.clear(); + this._formalDecl_.addAll(list); + for(PFormalDecl e : list) + { + if(e.parent() != null) + { + e.parent().removeChild(e); + } + + e.parent(this); + } + } + + public TRb getRb() + { + return this._rb_; + } + + public void setRb(TRb node) + { + if(this._rb_ != null) + { + this._rb_.parent(null); + } + + if(node != null) + { + if(node.parent() != null) + { + node.parent().removeChild(node); + } + + node.parent(this); + } + + this._rb_ = node; + } + + @Override + public String toString() + { + return "" + + toString(this._lb_) + + toString(this._formalDecl_) + + toString(this._rb_); + } + + @Override + void removeChild(@SuppressWarnings("unused") Node child) + { + // Remove child + if(this._lb_ == child) + { + this._lb_ = null; + return; + } + + if(this._formalDecl_.remove(child)) + { + return; + } + + if(this._rb_ == child) + { + this._rb_ = null; + return; + } + + throw new RuntimeException("Not a child."); + } + + @Override + void replaceChild(@SuppressWarnings("unused") Node oldChild, @SuppressWarnings("unused") Node newChild) + { + // Replace child + if(this._lb_ == oldChild) + { + setLb((TLb) newChild); + return; + } + + for(ListIterator i = this._formalDecl_.listIterator(); i.hasNext();) + { + if(i.next() == oldChild) + { + if(newChild != null) + { + i.set((PFormalDecl) newChild); + newChild.parent(this); + oldChild.parent(null); + return; + } + + i.remove(); + oldChild.parent(null); + return; + } + } + + if(this._rb_ == oldChild) + { + setRb((TRb) newChild); + return; + } + + throw new RuntimeException("Not a child."); + } +} diff --git a/src/minigen/syntax3/node/AGenericPart.java b/src/minigen/syntax3/node/AGenericPart.java new file mode 100644 index 0000000..85449e4 --- /dev/null +++ b/src/minigen/syntax3/node/AGenericPart.java @@ -0,0 +1,180 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.node; + +import minigen.syntax3.analysis.*; + +@SuppressWarnings("nls") +public final class AGenericPart extends PGenericPart +{ + private TLb _lb_; + private PGenericTypes _genericTypes_; + private TRb _rb_; + + public AGenericPart() + { + // Constructor + } + + public AGenericPart( + @SuppressWarnings("hiding") TLb _lb_, + @SuppressWarnings("hiding") PGenericTypes _genericTypes_, + @SuppressWarnings("hiding") TRb _rb_) + { + // Constructor + setLb(_lb_); + + setGenericTypes(_genericTypes_); + + setRb(_rb_); + + } + + @Override + public Object clone() + { + return new AGenericPart( + cloneNode(this._lb_), + cloneNode(this._genericTypes_), + cloneNode(this._rb_)); + } + + public void apply(Switch sw) + { + ((Analysis) sw).caseAGenericPart(this); + } + + public TLb getLb() + { + return this._lb_; + } + + public void setLb(TLb node) + { + if(this._lb_ != null) + { + this._lb_.parent(null); + } + + if(node != null) + { + if(node.parent() != null) + { + node.parent().removeChild(node); + } + + node.parent(this); + } + + this._lb_ = node; + } + + public PGenericTypes getGenericTypes() + { + return this._genericTypes_; + } + + public void setGenericTypes(PGenericTypes node) + { + if(this._genericTypes_ != null) + { + this._genericTypes_.parent(null); + } + + if(node != null) + { + if(node.parent() != null) + { + node.parent().removeChild(node); + } + + node.parent(this); + } + + this._genericTypes_ = node; + } + + public TRb getRb() + { + return this._rb_; + } + + public void setRb(TRb node) + { + if(this._rb_ != null) + { + this._rb_.parent(null); + } + + if(node != null) + { + if(node.parent() != null) + { + node.parent().removeChild(node); + } + + node.parent(this); + } + + this._rb_ = node; + } + + @Override + public String toString() + { + return "" + + toString(this._lb_) + + toString(this._genericTypes_) + + toString(this._rb_); + } + + @Override + void removeChild(@SuppressWarnings("unused") Node child) + { + // Remove child + if(this._lb_ == child) + { + this._lb_ = null; + return; + } + + if(this._genericTypes_ == child) + { + this._genericTypes_ = null; + return; + } + + if(this._rb_ == child) + { + this._rb_ = null; + return; + } + + throw new RuntimeException("Not a child."); + } + + @Override + void replaceChild(@SuppressWarnings("unused") Node oldChild, @SuppressWarnings("unused") Node newChild) + { + // Replace child + if(this._lb_ == oldChild) + { + setLb((TLb) newChild); + return; + } + + if(this._genericTypes_ == oldChild) + { + setGenericTypes((PGenericTypes) newChild); + return; + } + + if(this._rb_ == oldChild) + { + setRb((TRb) newChild); + return; + } + + throw new RuntimeException("Not a child."); + } +} diff --git a/src/minigen/syntax3/node/AGenericTypes.java b/src/minigen/syntax3/node/AGenericTypes.java new file mode 100644 index 0000000..b459f3c --- /dev/null +++ b/src/minigen/syntax3/node/AGenericTypes.java @@ -0,0 +1,144 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.node; + +import java.util.*; +import minigen.syntax3.analysis.*; + +@SuppressWarnings("nls") +public final class AGenericTypes extends PGenericTypes +{ + private PType _type_; + private final LinkedList _additionalTypes_ = new LinkedList(); + + public AGenericTypes() + { + // Constructor + } + + public AGenericTypes( + @SuppressWarnings("hiding") PType _type_, + @SuppressWarnings("hiding") List _additionalTypes_) + { + // Constructor + setType(_type_); + + setAdditionalTypes(_additionalTypes_); + + } + + @Override + public Object clone() + { + return new AGenericTypes( + cloneNode(this._type_), + cloneList(this._additionalTypes_)); + } + + public void apply(Switch sw) + { + ((Analysis) sw).caseAGenericTypes(this); + } + + public PType getType() + { + return this._type_; + } + + public void setType(PType node) + { + if(this._type_ != null) + { + this._type_.parent(null); + } + + if(node != null) + { + if(node.parent() != null) + { + node.parent().removeChild(node); + } + + node.parent(this); + } + + this._type_ = node; + } + + public LinkedList getAdditionalTypes() + { + return this._additionalTypes_; + } + + public void setAdditionalTypes(List list) + { + this._additionalTypes_.clear(); + this._additionalTypes_.addAll(list); + for(PAdditionalTypes e : list) + { + if(e.parent() != null) + { + e.parent().removeChild(e); + } + + e.parent(this); + } + } + + @Override + public String toString() + { + return "" + + toString(this._type_) + + toString(this._additionalTypes_); + } + + @Override + void removeChild(@SuppressWarnings("unused") Node child) + { + // Remove child + if(this._type_ == child) + { + this._type_ = null; + return; + } + + if(this._additionalTypes_.remove(child)) + { + return; + } + + throw new RuntimeException("Not a child."); + } + + @Override + void replaceChild(@SuppressWarnings("unused") Node oldChild, @SuppressWarnings("unused") Node newChild) + { + // Replace child + if(this._type_ == oldChild) + { + setType((PType) newChild); + return; + } + + for(ListIterator i = this._additionalTypes_.listIterator(); i.hasNext();) + { + if(i.next() == oldChild) + { + if(newChild != null) + { + i.set((PAdditionalTypes) newChild); + newChild.parent(this); + oldChild.parent(null); + return; + } + + i.remove(); + oldChild.parent(null); + return; + } + } + + throw new RuntimeException("Not a child."); + } +} diff --git a/src/minigen/syntax3/node/AIsaInstr.java b/src/minigen/syntax3/node/AIsaInstr.java new file mode 100644 index 0000000..ebc3b9f --- /dev/null +++ b/src/minigen/syntax3/node/AIsaInstr.java @@ -0,0 +1,180 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.node; + +import minigen.syntax3.analysis.*; + +@SuppressWarnings("nls") +public final class AIsaInstr extends PInstr +{ + private PType _left_; + private TKisa _kisa_; + private PType _right_; + + public AIsaInstr() + { + // Constructor + } + + public AIsaInstr( + @SuppressWarnings("hiding") PType _left_, + @SuppressWarnings("hiding") TKisa _kisa_, + @SuppressWarnings("hiding") PType _right_) + { + // Constructor + setLeft(_left_); + + setKisa(_kisa_); + + setRight(_right_); + + } + + @Override + public Object clone() + { + return new AIsaInstr( + cloneNode(this._left_), + cloneNode(this._kisa_), + cloneNode(this._right_)); + } + + public void apply(Switch sw) + { + ((Analysis) sw).caseAIsaInstr(this); + } + + public PType getLeft() + { + return this._left_; + } + + public void setLeft(PType node) + { + if(this._left_ != null) + { + this._left_.parent(null); + } + + if(node != null) + { + if(node.parent() != null) + { + node.parent().removeChild(node); + } + + node.parent(this); + } + + this._left_ = node; + } + + public TKisa getKisa() + { + return this._kisa_; + } + + public void setKisa(TKisa node) + { + if(this._kisa_ != null) + { + this._kisa_.parent(null); + } + + if(node != null) + { + if(node.parent() != null) + { + node.parent().removeChild(node); + } + + node.parent(this); + } + + this._kisa_ = node; + } + + public PType getRight() + { + return this._right_; + } + + public void setRight(PType node) + { + if(this._right_ != null) + { + this._right_.parent(null); + } + + if(node != null) + { + if(node.parent() != null) + { + node.parent().removeChild(node); + } + + node.parent(this); + } + + this._right_ = node; + } + + @Override + public String toString() + { + return "" + + toString(this._left_) + + toString(this._kisa_) + + toString(this._right_); + } + + @Override + void removeChild(@SuppressWarnings("unused") Node child) + { + // Remove child + if(this._left_ == child) + { + this._left_ = null; + return; + } + + if(this._kisa_ == child) + { + this._kisa_ = null; + return; + } + + if(this._right_ == child) + { + this._right_ = null; + return; + } + + throw new RuntimeException("Not a child."); + } + + @Override + void replaceChild(@SuppressWarnings("unused") Node oldChild, @SuppressWarnings("unused") Node newChild) + { + // Replace child + if(this._left_ == oldChild) + { + setLeft((PType) newChild); + return; + } + + if(this._kisa_ == oldChild) + { + setKisa((TKisa) newChild); + return; + } + + if(this._right_ == oldChild) + { + setRight((PType) newChild); + return; + } + + throw new RuntimeException("Not a child."); + } +} diff --git a/src/minigen/syntax3/node/AProgram.java b/src/minigen/syntax3/node/AProgram.java new file mode 100644 index 0000000..7a4d525 --- /dev/null +++ b/src/minigen/syntax3/node/AProgram.java @@ -0,0 +1,150 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.node; + +import java.util.*; +import minigen.syntax3.analysis.*; + +@SuppressWarnings("nls") +public final class AProgram extends PProgram +{ + private final LinkedList _classes_ = new LinkedList(); + private final LinkedList _instrs_ = new LinkedList(); + + public AProgram() + { + // Constructor + } + + public AProgram( + @SuppressWarnings("hiding") List _classes_, + @SuppressWarnings("hiding") List _instrs_) + { + // Constructor + setClasses(_classes_); + + setInstrs(_instrs_); + + } + + @Override + public Object clone() + { + return new AProgram( + cloneList(this._classes_), + cloneList(this._instrs_)); + } + + public void apply(Switch sw) + { + ((Analysis) sw).caseAProgram(this); + } + + public LinkedList getClasses() + { + return this._classes_; + } + + public void setClasses(List list) + { + this._classes_.clear(); + this._classes_.addAll(list); + for(PClassDecl e : list) + { + if(e.parent() != null) + { + e.parent().removeChild(e); + } + + e.parent(this); + } + } + + public LinkedList getInstrs() + { + return this._instrs_; + } + + public void setInstrs(List list) + { + this._instrs_.clear(); + this._instrs_.addAll(list); + for(PInstr e : list) + { + if(e.parent() != null) + { + e.parent().removeChild(e); + } + + e.parent(this); + } + } + + @Override + public String toString() + { + return "" + + toString(this._classes_) + + toString(this._instrs_); + } + + @Override + void removeChild(@SuppressWarnings("unused") Node child) + { + // Remove child + if(this._classes_.remove(child)) + { + return; + } + + if(this._instrs_.remove(child)) + { + return; + } + + throw new RuntimeException("Not a child."); + } + + @Override + void replaceChild(@SuppressWarnings("unused") Node oldChild, @SuppressWarnings("unused") Node newChild) + { + // Replace child + for(ListIterator i = this._classes_.listIterator(); i.hasNext();) + { + if(i.next() == oldChild) + { + if(newChild != null) + { + i.set((PClassDecl) newChild); + newChild.parent(this); + oldChild.parent(null); + return; + } + + i.remove(); + oldChild.parent(null); + return; + } + } + + for(ListIterator i = this._instrs_.listIterator(); i.hasNext();) + { + if(i.next() == oldChild) + { + if(newChild != null) + { + i.set((PInstr) newChild); + newChild.parent(this); + oldChild.parent(null); + return; + } + + i.remove(); + oldChild.parent(null); + return; + } + } + + throw new RuntimeException("Not a child."); + } +} diff --git a/src/minigen/syntax3/node/ASuperAdditionalTypes.java b/src/minigen/syntax3/node/ASuperAdditionalTypes.java new file mode 100644 index 0000000..0615bf6 --- /dev/null +++ b/src/minigen/syntax3/node/ASuperAdditionalTypes.java @@ -0,0 +1,137 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.node; + +import minigen.syntax3.analysis.*; + +@SuppressWarnings("nls") +public final class ASuperAdditionalTypes extends PSuperAdditionalTypes +{ + private TComma _comma_; + private PSuperType _superType_; + + public ASuperAdditionalTypes() + { + // Constructor + } + + public ASuperAdditionalTypes( + @SuppressWarnings("hiding") TComma _comma_, + @SuppressWarnings("hiding") PSuperType _superType_) + { + // Constructor + setComma(_comma_); + + setSuperType(_superType_); + + } + + @Override + public Object clone() + { + return new ASuperAdditionalTypes( + cloneNode(this._comma_), + cloneNode(this._superType_)); + } + + public void apply(Switch sw) + { + ((Analysis) sw).caseASuperAdditionalTypes(this); + } + + public TComma getComma() + { + return this._comma_; + } + + public void setComma(TComma node) + { + if(this._comma_ != null) + { + this._comma_.parent(null); + } + + if(node != null) + { + if(node.parent() != null) + { + node.parent().removeChild(node); + } + + node.parent(this); + } + + this._comma_ = node; + } + + public PSuperType getSuperType() + { + return this._superType_; + } + + public void setSuperType(PSuperType node) + { + if(this._superType_ != null) + { + this._superType_.parent(null); + } + + if(node != null) + { + if(node.parent() != null) + { + node.parent().removeChild(node); + } + + node.parent(this); + } + + this._superType_ = node; + } + + @Override + public String toString() + { + return "" + + toString(this._comma_) + + toString(this._superType_); + } + + @Override + void removeChild(@SuppressWarnings("unused") Node child) + { + // Remove child + if(this._comma_ == child) + { + this._comma_ = null; + return; + } + + if(this._superType_ == child) + { + this._superType_ = null; + return; + } + + throw new RuntimeException("Not a child."); + } + + @Override + void replaceChild(@SuppressWarnings("unused") Node oldChild, @SuppressWarnings("unused") Node newChild) + { + // Replace child + if(this._comma_ == oldChild) + { + setComma((TComma) newChild); + return; + } + + if(this._superType_ == oldChild) + { + setSuperType((PSuperType) newChild); + return; + } + + throw new RuntimeException("Not a child."); + } +} diff --git a/src/minigen/syntax3/node/ASuperDecls.java b/src/minigen/syntax3/node/ASuperDecls.java new file mode 100644 index 0000000..fe4aabf --- /dev/null +++ b/src/minigen/syntax3/node/ASuperDecls.java @@ -0,0 +1,187 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.node; + +import java.util.*; +import minigen.syntax3.analysis.*; + +@SuppressWarnings("nls") +public final class ASuperDecls extends PSuperDecls +{ + private TKsuper _ksuper_; + private PSuperType _superType_; + private final LinkedList _additionalSupers_ = new LinkedList(); + + public ASuperDecls() + { + // Constructor + } + + public ASuperDecls( + @SuppressWarnings("hiding") TKsuper _ksuper_, + @SuppressWarnings("hiding") PSuperType _superType_, + @SuppressWarnings("hiding") List _additionalSupers_) + { + // Constructor + setKsuper(_ksuper_); + + setSuperType(_superType_); + + setAdditionalSupers(_additionalSupers_); + + } + + @Override + public Object clone() + { + return new ASuperDecls( + cloneNode(this._ksuper_), + cloneNode(this._superType_), + cloneList(this._additionalSupers_)); + } + + public void apply(Switch sw) + { + ((Analysis) sw).caseASuperDecls(this); + } + + public TKsuper getKsuper() + { + return this._ksuper_; + } + + public void setKsuper(TKsuper node) + { + if(this._ksuper_ != null) + { + this._ksuper_.parent(null); + } + + if(node != null) + { + if(node.parent() != null) + { + node.parent().removeChild(node); + } + + node.parent(this); + } + + this._ksuper_ = node; + } + + public PSuperType getSuperType() + { + return this._superType_; + } + + public void setSuperType(PSuperType node) + { + if(this._superType_ != null) + { + this._superType_.parent(null); + } + + if(node != null) + { + if(node.parent() != null) + { + node.parent().removeChild(node); + } + + node.parent(this); + } + + this._superType_ = node; + } + + public LinkedList getAdditionalSupers() + { + return this._additionalSupers_; + } + + public void setAdditionalSupers(List list) + { + this._additionalSupers_.clear(); + this._additionalSupers_.addAll(list); + for(PAdditionalSupers e : list) + { + if(e.parent() != null) + { + e.parent().removeChild(e); + } + + e.parent(this); + } + } + + @Override + public String toString() + { + return "" + + toString(this._ksuper_) + + toString(this._superType_) + + toString(this._additionalSupers_); + } + + @Override + void removeChild(@SuppressWarnings("unused") Node child) + { + // Remove child + if(this._ksuper_ == child) + { + this._ksuper_ = null; + return; + } + + if(this._superType_ == child) + { + this._superType_ = null; + return; + } + + if(this._additionalSupers_.remove(child)) + { + return; + } + + throw new RuntimeException("Not a child."); + } + + @Override + void replaceChild(@SuppressWarnings("unused") Node oldChild, @SuppressWarnings("unused") Node newChild) + { + // Replace child + if(this._ksuper_ == oldChild) + { + setKsuper((TKsuper) newChild); + return; + } + + if(this._superType_ == oldChild) + { + setSuperType((PSuperType) newChild); + return; + } + + for(ListIterator i = this._additionalSupers_.listIterator(); i.hasNext();) + { + if(i.next() == oldChild) + { + if(newChild != null) + { + i.set((PAdditionalSupers) newChild); + newChild.parent(this); + oldChild.parent(null); + return; + } + + i.remove(); + oldChild.parent(null); + return; + } + } + + throw new RuntimeException("Not a child."); + } +} diff --git a/src/minigen/syntax3/node/ASuperGenericPart.java b/src/minigen/syntax3/node/ASuperGenericPart.java new file mode 100644 index 0000000..65644fc --- /dev/null +++ b/src/minigen/syntax3/node/ASuperGenericPart.java @@ -0,0 +1,180 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.node; + +import minigen.syntax3.analysis.*; + +@SuppressWarnings("nls") +public final class ASuperGenericPart extends PSuperGenericPart +{ + private TLb _lb_; + private PSuperGenericTypes _superGenericTypes_; + private TRb _rb_; + + public ASuperGenericPart() + { + // Constructor + } + + public ASuperGenericPart( + @SuppressWarnings("hiding") TLb _lb_, + @SuppressWarnings("hiding") PSuperGenericTypes _superGenericTypes_, + @SuppressWarnings("hiding") TRb _rb_) + { + // Constructor + setLb(_lb_); + + setSuperGenericTypes(_superGenericTypes_); + + setRb(_rb_); + + } + + @Override + public Object clone() + { + return new ASuperGenericPart( + cloneNode(this._lb_), + cloneNode(this._superGenericTypes_), + cloneNode(this._rb_)); + } + + public void apply(Switch sw) + { + ((Analysis) sw).caseASuperGenericPart(this); + } + + public TLb getLb() + { + return this._lb_; + } + + public void setLb(TLb node) + { + if(this._lb_ != null) + { + this._lb_.parent(null); + } + + if(node != null) + { + if(node.parent() != null) + { + node.parent().removeChild(node); + } + + node.parent(this); + } + + this._lb_ = node; + } + + public PSuperGenericTypes getSuperGenericTypes() + { + return this._superGenericTypes_; + } + + public void setSuperGenericTypes(PSuperGenericTypes node) + { + if(this._superGenericTypes_ != null) + { + this._superGenericTypes_.parent(null); + } + + if(node != null) + { + if(node.parent() != null) + { + node.parent().removeChild(node); + } + + node.parent(this); + } + + this._superGenericTypes_ = node; + } + + public TRb getRb() + { + return this._rb_; + } + + public void setRb(TRb node) + { + if(this._rb_ != null) + { + this._rb_.parent(null); + } + + if(node != null) + { + if(node.parent() != null) + { + node.parent().removeChild(node); + } + + node.parent(this); + } + + this._rb_ = node; + } + + @Override + public String toString() + { + return "" + + toString(this._lb_) + + toString(this._superGenericTypes_) + + toString(this._rb_); + } + + @Override + void removeChild(@SuppressWarnings("unused") Node child) + { + // Remove child + if(this._lb_ == child) + { + this._lb_ = null; + return; + } + + if(this._superGenericTypes_ == child) + { + this._superGenericTypes_ = null; + return; + } + + if(this._rb_ == child) + { + this._rb_ = null; + return; + } + + throw new RuntimeException("Not a child."); + } + + @Override + void replaceChild(@SuppressWarnings("unused") Node oldChild, @SuppressWarnings("unused") Node newChild) + { + // Replace child + if(this._lb_ == oldChild) + { + setLb((TLb) newChild); + return; + } + + if(this._superGenericTypes_ == oldChild) + { + setSuperGenericTypes((PSuperGenericTypes) newChild); + return; + } + + if(this._rb_ == oldChild) + { + setRb((TRb) newChild); + return; + } + + throw new RuntimeException("Not a child."); + } +} diff --git a/src/minigen/syntax3/node/ASuperGenericTypes.java b/src/minigen/syntax3/node/ASuperGenericTypes.java new file mode 100644 index 0000000..f0515c0 --- /dev/null +++ b/src/minigen/syntax3/node/ASuperGenericTypes.java @@ -0,0 +1,144 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.node; + +import java.util.*; +import minigen.syntax3.analysis.*; + +@SuppressWarnings("nls") +public final class ASuperGenericTypes extends PSuperGenericTypes +{ + private PSuperType _superType_; + private final LinkedList _superAdditionalTypes_ = new LinkedList(); + + public ASuperGenericTypes() + { + // Constructor + } + + public ASuperGenericTypes( + @SuppressWarnings("hiding") PSuperType _superType_, + @SuppressWarnings("hiding") List _superAdditionalTypes_) + { + // Constructor + setSuperType(_superType_); + + setSuperAdditionalTypes(_superAdditionalTypes_); + + } + + @Override + public Object clone() + { + return new ASuperGenericTypes( + cloneNode(this._superType_), + cloneList(this._superAdditionalTypes_)); + } + + public void apply(Switch sw) + { + ((Analysis) sw).caseASuperGenericTypes(this); + } + + public PSuperType getSuperType() + { + return this._superType_; + } + + public void setSuperType(PSuperType node) + { + if(this._superType_ != null) + { + this._superType_.parent(null); + } + + if(node != null) + { + if(node.parent() != null) + { + node.parent().removeChild(node); + } + + node.parent(this); + } + + this._superType_ = node; + } + + public LinkedList getSuperAdditionalTypes() + { + return this._superAdditionalTypes_; + } + + public void setSuperAdditionalTypes(List list) + { + this._superAdditionalTypes_.clear(); + this._superAdditionalTypes_.addAll(list); + for(PSuperAdditionalTypes e : list) + { + if(e.parent() != null) + { + e.parent().removeChild(e); + } + + e.parent(this); + } + } + + @Override + public String toString() + { + return "" + + toString(this._superType_) + + toString(this._superAdditionalTypes_); + } + + @Override + void removeChild(@SuppressWarnings("unused") Node child) + { + // Remove child + if(this._superType_ == child) + { + this._superType_ = null; + return; + } + + if(this._superAdditionalTypes_.remove(child)) + { + return; + } + + throw new RuntimeException("Not a child."); + } + + @Override + void replaceChild(@SuppressWarnings("unused") Node oldChild, @SuppressWarnings("unused") Node newChild) + { + // Replace child + if(this._superType_ == oldChild) + { + setSuperType((PSuperType) newChild); + return; + } + + for(ListIterator i = this._superAdditionalTypes_.listIterator(); i.hasNext();) + { + if(i.next() == oldChild) + { + if(newChild != null) + { + i.set((PSuperAdditionalTypes) newChild); + newChild.parent(this); + oldChild.parent(null); + return; + } + + i.remove(); + oldChild.parent(null); + return; + } + } + + throw new RuntimeException("Not a child."); + } +} diff --git a/src/minigen/syntax3/node/ASuperType.java b/src/minigen/syntax3/node/ASuperType.java new file mode 100644 index 0000000..738c241 --- /dev/null +++ b/src/minigen/syntax3/node/ASuperType.java @@ -0,0 +1,137 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.node; + +import minigen.syntax3.analysis.*; + +@SuppressWarnings("nls") +public final class ASuperType extends PSuperType +{ + private TName _name_; + private PSuperGenericPart _superGenericPart_; + + public ASuperType() + { + // Constructor + } + + public ASuperType( + @SuppressWarnings("hiding") TName _name_, + @SuppressWarnings("hiding") PSuperGenericPart _superGenericPart_) + { + // Constructor + setName(_name_); + + setSuperGenericPart(_superGenericPart_); + + } + + @Override + public Object clone() + { + return new ASuperType( + cloneNode(this._name_), + cloneNode(this._superGenericPart_)); + } + + public void apply(Switch sw) + { + ((Analysis) sw).caseASuperType(this); + } + + public TName getName() + { + return this._name_; + } + + public void setName(TName node) + { + if(this._name_ != null) + { + this._name_.parent(null); + } + + if(node != null) + { + if(node.parent() != null) + { + node.parent().removeChild(node); + } + + node.parent(this); + } + + this._name_ = node; + } + + public PSuperGenericPart getSuperGenericPart() + { + return this._superGenericPart_; + } + + public void setSuperGenericPart(PSuperGenericPart node) + { + if(this._superGenericPart_ != null) + { + this._superGenericPart_.parent(null); + } + + if(node != null) + { + if(node.parent() != null) + { + node.parent().removeChild(node); + } + + node.parent(this); + } + + this._superGenericPart_ = node; + } + + @Override + public String toString() + { + return "" + + toString(this._name_) + + toString(this._superGenericPart_); + } + + @Override + void removeChild(@SuppressWarnings("unused") Node child) + { + // Remove child + if(this._name_ == child) + { + this._name_ = null; + return; + } + + if(this._superGenericPart_ == child) + { + this._superGenericPart_ = null; + return; + } + + throw new RuntimeException("Not a child."); + } + + @Override + void replaceChild(@SuppressWarnings("unused") Node oldChild, @SuppressWarnings("unused") Node newChild) + { + // Replace child + if(this._name_ == oldChild) + { + setName((TName) newChild); + return; + } + + if(this._superGenericPart_ == oldChild) + { + setSuperGenericPart((PSuperGenericPart) newChild); + return; + } + + throw new RuntimeException("Not a child."); + } +} diff --git a/src/minigen/syntax3/node/AType.java b/src/minigen/syntax3/node/AType.java new file mode 100644 index 0000000..ea0fcfe --- /dev/null +++ b/src/minigen/syntax3/node/AType.java @@ -0,0 +1,137 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.node; + +import minigen.syntax3.analysis.*; + +@SuppressWarnings("nls") +public final class AType extends PType +{ + private TName _name_; + private PGenericPart _genericPart_; + + public AType() + { + // Constructor + } + + public AType( + @SuppressWarnings("hiding") TName _name_, + @SuppressWarnings("hiding") PGenericPart _genericPart_) + { + // Constructor + setName(_name_); + + setGenericPart(_genericPart_); + + } + + @Override + public Object clone() + { + return new AType( + cloneNode(this._name_), + cloneNode(this._genericPart_)); + } + + public void apply(Switch sw) + { + ((Analysis) sw).caseAType(this); + } + + public TName getName() + { + return this._name_; + } + + public void setName(TName node) + { + if(this._name_ != null) + { + this._name_.parent(null); + } + + if(node != null) + { + if(node.parent() != null) + { + node.parent().removeChild(node); + } + + node.parent(this); + } + + this._name_ = node; + } + + public PGenericPart getGenericPart() + { + return this._genericPart_; + } + + public void setGenericPart(PGenericPart node) + { + if(this._genericPart_ != null) + { + this._genericPart_.parent(null); + } + + if(node != null) + { + if(node.parent() != null) + { + node.parent().removeChild(node); + } + + node.parent(this); + } + + this._genericPart_ = node; + } + + @Override + public String toString() + { + return "" + + toString(this._name_) + + toString(this._genericPart_); + } + + @Override + void removeChild(@SuppressWarnings("unused") Node child) + { + // Remove child + if(this._name_ == child) + { + this._name_ = null; + return; + } + + if(this._genericPart_ == child) + { + this._genericPart_ = null; + return; + } + + throw new RuntimeException("Not a child."); + } + + @Override + void replaceChild(@SuppressWarnings("unused") Node oldChild, @SuppressWarnings("unused") Node newChild) + { + // Replace child + if(this._name_ == oldChild) + { + setName((TName) newChild); + return; + } + + if(this._genericPart_ == oldChild) + { + setGenericPart((PGenericPart) newChild); + return; + } + + throw new RuntimeException("Not a child."); + } +} diff --git a/src/minigen/syntax3/node/EOF.java b/src/minigen/syntax3/node/EOF.java new file mode 100644 index 0000000..3117e62 --- /dev/null +++ b/src/minigen/syntax3/node/EOF.java @@ -0,0 +1,32 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.node; + +import minigen.syntax3.analysis.*; + +@SuppressWarnings("nls") +public final class EOF extends Token +{ + public EOF() + { + setText(""); + } + + public EOF(int line, int pos) + { + setText(""); + setLine(line); + setPos(pos); + } + + @Override + public Object clone() + { + return new EOF(getLine(), getPos()); + } + + public void apply(Switch sw) + { + ((Analysis) sw).caseEOF(this); + } +} diff --git a/src/minigen/syntax3/node/Node.java b/src/minigen/syntax3/node/Node.java new file mode 100644 index 0000000..5bbe3de --- /dev/null +++ b/src/minigen/syntax3/node/Node.java @@ -0,0 +1,77 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.node; + +import java.util.*; + +@SuppressWarnings("nls") +public abstract class Node implements Switchable, Cloneable +{ + private Node parent; + + @Override + public abstract Object clone(); + + public Node parent() + { + return this.parent; + } + + void parent(@SuppressWarnings("hiding") Node parent) + { + this.parent = parent; + } + + abstract void removeChild(Node child); + abstract void replaceChild(Node oldChild, Node newChild); + + public void replaceBy(Node node) + { + this.parent.replaceChild(this, node); + } + + protected String toString(Node node) + { + if(node != null) + { + return node.toString(); + } + + return ""; + } + + protected String toString(List list) + { + StringBuffer s = new StringBuffer(); + + for(Iterator i = list.iterator(); i.hasNext();) + { + s.append(i.next()); + } + + return s.toString(); + } + + @SuppressWarnings("unchecked") + protected T cloneNode(T node) + { + if(node != null) + { + return (T) node.clone(); + } + + return null; + } + + protected List cloneList(List list) + { + List clone = new LinkedList(); + + for(T n : list) + { + clone.add(n); + } + + return clone; + } +} diff --git a/src/minigen/syntax3/node/PAdditionalFormalTypes.java b/src/minigen/syntax3/node/PAdditionalFormalTypes.java new file mode 100644 index 0000000..cc9b142 --- /dev/null +++ b/src/minigen/syntax3/node/PAdditionalFormalTypes.java @@ -0,0 +1,8 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.node; + +public abstract class PAdditionalFormalTypes extends Node +{ + // Empty body +} diff --git a/src/minigen/syntax3/node/PAdditionalSupers.java b/src/minigen/syntax3/node/PAdditionalSupers.java new file mode 100644 index 0000000..a1be465 --- /dev/null +++ b/src/minigen/syntax3/node/PAdditionalSupers.java @@ -0,0 +1,8 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.node; + +public abstract class PAdditionalSupers extends Node +{ + // Empty body +} diff --git a/src/minigen/syntax3/node/PAdditionalTypes.java b/src/minigen/syntax3/node/PAdditionalTypes.java new file mode 100644 index 0000000..98fe245 --- /dev/null +++ b/src/minigen/syntax3/node/PAdditionalTypes.java @@ -0,0 +1,8 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.node; + +public abstract class PAdditionalTypes extends Node +{ + // Empty body +} diff --git a/src/minigen/syntax3/node/PClassDecl.java b/src/minigen/syntax3/node/PClassDecl.java new file mode 100644 index 0000000..0e7f938 --- /dev/null +++ b/src/minigen/syntax3/node/PClassDecl.java @@ -0,0 +1,8 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.node; + +public abstract class PClassDecl extends Node +{ + // Empty body +} diff --git a/src/minigen/syntax3/node/PFormalDecl.java b/src/minigen/syntax3/node/PFormalDecl.java new file mode 100644 index 0000000..7066aca --- /dev/null +++ b/src/minigen/syntax3/node/PFormalDecl.java @@ -0,0 +1,8 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.node; + +public abstract class PFormalDecl extends Node +{ + // Empty body +} diff --git a/src/minigen/syntax3/node/PFormalDecls.java b/src/minigen/syntax3/node/PFormalDecls.java new file mode 100644 index 0000000..3ea8cac --- /dev/null +++ b/src/minigen/syntax3/node/PFormalDecls.java @@ -0,0 +1,8 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.node; + +public abstract class PFormalDecls extends Node +{ + // Empty body +} diff --git a/src/minigen/syntax3/node/PGenericPart.java b/src/minigen/syntax3/node/PGenericPart.java new file mode 100644 index 0000000..96ca680 --- /dev/null +++ b/src/minigen/syntax3/node/PGenericPart.java @@ -0,0 +1,8 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.node; + +public abstract class PGenericPart extends Node +{ + // Empty body +} diff --git a/src/minigen/syntax3/node/PGenericTypes.java b/src/minigen/syntax3/node/PGenericTypes.java new file mode 100644 index 0000000..e253ed7 --- /dev/null +++ b/src/minigen/syntax3/node/PGenericTypes.java @@ -0,0 +1,8 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.node; + +public abstract class PGenericTypes extends Node +{ + // Empty body +} diff --git a/src/minigen/syntax3/node/PInstr.java b/src/minigen/syntax3/node/PInstr.java new file mode 100644 index 0000000..53ccff7 --- /dev/null +++ b/src/minigen/syntax3/node/PInstr.java @@ -0,0 +1,8 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.node; + +public abstract class PInstr extends Node +{ + // Empty body +} diff --git a/src/minigen/syntax3/node/PProgram.java b/src/minigen/syntax3/node/PProgram.java new file mode 100644 index 0000000..f4340e3 --- /dev/null +++ b/src/minigen/syntax3/node/PProgram.java @@ -0,0 +1,8 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.node; + +public abstract class PProgram extends Node +{ + // Empty body +} diff --git a/src/minigen/syntax3/node/PSuperAdditionalTypes.java b/src/minigen/syntax3/node/PSuperAdditionalTypes.java new file mode 100644 index 0000000..5a32a06 --- /dev/null +++ b/src/minigen/syntax3/node/PSuperAdditionalTypes.java @@ -0,0 +1,8 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.node; + +public abstract class PSuperAdditionalTypes extends Node +{ + // Empty body +} diff --git a/src/minigen/syntax3/node/PSuperDecls.java b/src/minigen/syntax3/node/PSuperDecls.java new file mode 100644 index 0000000..4028d69 --- /dev/null +++ b/src/minigen/syntax3/node/PSuperDecls.java @@ -0,0 +1,8 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.node; + +public abstract class PSuperDecls extends Node +{ + // Empty body +} diff --git a/src/minigen/syntax3/node/PSuperGenericPart.java b/src/minigen/syntax3/node/PSuperGenericPart.java new file mode 100644 index 0000000..2dbff9d --- /dev/null +++ b/src/minigen/syntax3/node/PSuperGenericPart.java @@ -0,0 +1,8 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.node; + +public abstract class PSuperGenericPart extends Node +{ + // Empty body +} diff --git a/src/minigen/syntax3/node/PSuperGenericTypes.java b/src/minigen/syntax3/node/PSuperGenericTypes.java new file mode 100644 index 0000000..2b84061 --- /dev/null +++ b/src/minigen/syntax3/node/PSuperGenericTypes.java @@ -0,0 +1,8 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.node; + +public abstract class PSuperGenericTypes extends Node +{ + // Empty body +} diff --git a/src/minigen/syntax3/node/PSuperType.java b/src/minigen/syntax3/node/PSuperType.java new file mode 100644 index 0000000..c96990e --- /dev/null +++ b/src/minigen/syntax3/node/PSuperType.java @@ -0,0 +1,8 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.node; + +public abstract class PSuperType extends Node +{ + // Empty body +} diff --git a/src/minigen/syntax3/node/PType.java b/src/minigen/syntax3/node/PType.java new file mode 100644 index 0000000..5469583 --- /dev/null +++ b/src/minigen/syntax3/node/PType.java @@ -0,0 +1,8 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.node; + +public abstract class PType extends Node +{ + // Empty body +} diff --git a/src/minigen/syntax3/node/Start.java b/src/minigen/syntax3/node/Start.java new file mode 100644 index 0000000..5b4acc2 --- /dev/null +++ b/src/minigen/syntax3/node/Start.java @@ -0,0 +1,132 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.node; + +import minigen.syntax3.analysis.*; + +@SuppressWarnings("nls") +public final class Start extends Node +{ + private PProgram _pProgram_; + private EOF _eof_; + + public Start() + { + // Empty body + } + + public Start( + @SuppressWarnings("hiding") PProgram _pProgram_, + @SuppressWarnings("hiding") EOF _eof_) + { + setPProgram(_pProgram_); + setEOF(_eof_); + } + + @Override + public Object clone() + { + return new Start( + cloneNode(this._pProgram_), + cloneNode(this._eof_)); + } + + public void apply(Switch sw) + { + ((Analysis) sw).caseStart(this); + } + + public PProgram getPProgram() + { + return this._pProgram_; + } + + public void setPProgram(PProgram node) + { + if(this._pProgram_ != null) + { + this._pProgram_.parent(null); + } + + if(node != null) + { + if(node.parent() != null) + { + node.parent().removeChild(node); + } + + node.parent(this); + } + + this._pProgram_ = node; + } + + public EOF getEOF() + { + return this._eof_; + } + + public void setEOF(EOF node) + { + if(this._eof_ != null) + { + this._eof_.parent(null); + } + + if(node != null) + { + if(node.parent() != null) + { + node.parent().removeChild(node); + } + + node.parent(this); + } + + this._eof_ = node; + } + + @Override + void removeChild(Node child) + { + if(this._pProgram_ == child) + { + this._pProgram_ = null; + return; + } + + if(this._eof_ == child) + { + this._eof_ = null; + return; + } + + throw new RuntimeException("Not a child."); + } + + @Override + void replaceChild(Node oldChild, Node newChild) + { + if(this._pProgram_ == oldChild) + { + setPProgram((PProgram) newChild); + return; + } + + if(this._eof_ == oldChild) + { + setEOF((EOF) newChild); + return; + } + + throw new RuntimeException("Not a child."); + } + + @Override + public String toString() + { + return "" + + toString(this._pProgram_) + + toString(this._eof_); + } +} diff --git a/src/minigen/syntax3/node/Switch.java b/src/minigen/syntax3/node/Switch.java new file mode 100644 index 0000000..a75f207 --- /dev/null +++ b/src/minigen/syntax3/node/Switch.java @@ -0,0 +1,8 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.node; + +public interface Switch +{ + // Empty body +} diff --git a/src/minigen/syntax3/node/Switchable.java b/src/minigen/syntax3/node/Switchable.java new file mode 100644 index 0000000..d2ec7e1 --- /dev/null +++ b/src/minigen/syntax3/node/Switchable.java @@ -0,0 +1,8 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.node; + +public interface Switchable +{ + void apply(Switch sw); +} diff --git a/src/minigen/syntax3/node/TBlanks.java b/src/minigen/syntax3/node/TBlanks.java new file mode 100644 index 0000000..99b5d6a --- /dev/null +++ b/src/minigen/syntax3/node/TBlanks.java @@ -0,0 +1,32 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.node; + +import minigen.syntax3.analysis.*; + +@SuppressWarnings("nls") +public final class TBlanks extends Token +{ + public TBlanks(String text) + { + setText(text); + } + + public TBlanks(String text, int line, int pos) + { + setText(text); + setLine(line); + setPos(pos); + } + + @Override + public Object clone() + { + return new TBlanks(getText(), getLine(), getPos()); + } + + public void apply(Switch sw) + { + ((Analysis) sw).caseTBlanks(this); + } +} diff --git a/src/minigen/syntax3/node/TComma.java b/src/minigen/syntax3/node/TComma.java new file mode 100644 index 0000000..2ab0d71 --- /dev/null +++ b/src/minigen/syntax3/node/TComma.java @@ -0,0 +1,38 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.node; + +import minigen.syntax3.analysis.*; + +@SuppressWarnings("nls") +public final class TComma extends Token +{ + public TComma() + { + super.setText(","); + } + + public TComma(int line, int pos) + { + super.setText(","); + setLine(line); + setPos(pos); + } + + @Override + public Object clone() + { + return new TComma(getLine(), getPos()); + } + + public void apply(Switch sw) + { + ((Analysis) sw).caseTComma(this); + } + + @Override + public void setText(@SuppressWarnings("unused") String text) + { + throw new RuntimeException("Cannot change TComma text."); + } +} diff --git a/src/minigen/syntax3/node/TComment.java b/src/minigen/syntax3/node/TComment.java new file mode 100644 index 0000000..d68a652 --- /dev/null +++ b/src/minigen/syntax3/node/TComment.java @@ -0,0 +1,32 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.node; + +import minigen.syntax3.analysis.*; + +@SuppressWarnings("nls") +public final class TComment extends Token +{ + public TComment(String text) + { + setText(text); + } + + public TComment(String text, int line, int pos) + { + setText(text); + setLine(line); + setPos(pos); + } + + @Override + public Object clone() + { + return new TComment(getText(), getLine(), getPos()); + } + + public void apply(Switch sw) + { + ((Analysis) sw).caseTComment(this); + } +} diff --git a/src/minigen/syntax3/node/TKclass.java b/src/minigen/syntax3/node/TKclass.java new file mode 100644 index 0000000..d5a5e03 --- /dev/null +++ b/src/minigen/syntax3/node/TKclass.java @@ -0,0 +1,38 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.node; + +import minigen.syntax3.analysis.*; + +@SuppressWarnings("nls") +public final class TKclass extends Token +{ + public TKclass() + { + super.setText("class"); + } + + public TKclass(int line, int pos) + { + super.setText("class"); + setLine(line); + setPos(pos); + } + + @Override + public Object clone() + { + return new TKclass(getLine(), getPos()); + } + + public void apply(Switch sw) + { + ((Analysis) sw).caseTKclass(this); + } + + @Override + public void setText(@SuppressWarnings("unused") String text) + { + throw new RuntimeException("Cannot change TKclass text."); + } +} diff --git a/src/minigen/syntax3/node/TKend.java b/src/minigen/syntax3/node/TKend.java new file mode 100644 index 0000000..a8e304f --- /dev/null +++ b/src/minigen/syntax3/node/TKend.java @@ -0,0 +1,38 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.node; + +import minigen.syntax3.analysis.*; + +@SuppressWarnings("nls") +public final class TKend extends Token +{ + public TKend() + { + super.setText("end"); + } + + public TKend(int line, int pos) + { + super.setText("end"); + setLine(line); + setPos(pos); + } + + @Override + public Object clone() + { + return new TKend(getLine(), getPos()); + } + + public void apply(Switch sw) + { + ((Analysis) sw).caseTKend(this); + } + + @Override + public void setText(@SuppressWarnings("unused") String text) + { + throw new RuntimeException("Cannot change TKend text."); + } +} diff --git a/src/minigen/syntax3/node/TKisa.java b/src/minigen/syntax3/node/TKisa.java new file mode 100644 index 0000000..6416e6d --- /dev/null +++ b/src/minigen/syntax3/node/TKisa.java @@ -0,0 +1,38 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.node; + +import minigen.syntax3.analysis.*; + +@SuppressWarnings("nls") +public final class TKisa extends Token +{ + public TKisa() + { + super.setText("isa"); + } + + public TKisa(int line, int pos) + { + super.setText("isa"); + setLine(line); + setPos(pos); + } + + @Override + public Object clone() + { + return new TKisa(getLine(), getPos()); + } + + public void apply(Switch sw) + { + ((Analysis) sw).caseTKisa(this); + } + + @Override + public void setText(@SuppressWarnings("unused") String text) + { + throw new RuntimeException("Cannot change TKisa text."); + } +} diff --git a/src/minigen/syntax3/node/TKnew.java b/src/minigen/syntax3/node/TKnew.java new file mode 100644 index 0000000..fe9122c --- /dev/null +++ b/src/minigen/syntax3/node/TKnew.java @@ -0,0 +1,38 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.node; + +import minigen.syntax3.analysis.*; + +@SuppressWarnings("nls") +public final class TKnew extends Token +{ + public TKnew() + { + super.setText("new"); + } + + public TKnew(int line, int pos) + { + super.setText("new"); + setLine(line); + setPos(pos); + } + + @Override + public Object clone() + { + return new TKnew(getLine(), getPos()); + } + + public void apply(Switch sw) + { + ((Analysis) sw).caseTKnew(this); + } + + @Override + public void setText(@SuppressWarnings("unused") String text) + { + throw new RuntimeException("Cannot change TKnew text."); + } +} diff --git a/src/minigen/syntax3/node/TKsuper.java b/src/minigen/syntax3/node/TKsuper.java new file mode 100644 index 0000000..b2c702a --- /dev/null +++ b/src/minigen/syntax3/node/TKsuper.java @@ -0,0 +1,38 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.node; + +import minigen.syntax3.analysis.*; + +@SuppressWarnings("nls") +public final class TKsuper extends Token +{ + public TKsuper() + { + super.setText("super"); + } + + public TKsuper(int line, int pos) + { + super.setText("super"); + setLine(line); + setPos(pos); + } + + @Override + public Object clone() + { + return new TKsuper(getLine(), getPos()); + } + + public void apply(Switch sw) + { + ((Analysis) sw).caseTKsuper(this); + } + + @Override + public void setText(@SuppressWarnings("unused") String text) + { + throw new RuntimeException("Cannot change TKsuper text."); + } +} diff --git a/src/minigen/syntax3/node/TLb.java b/src/minigen/syntax3/node/TLb.java new file mode 100644 index 0000000..a052219 --- /dev/null +++ b/src/minigen/syntax3/node/TLb.java @@ -0,0 +1,38 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.node; + +import minigen.syntax3.analysis.*; + +@SuppressWarnings("nls") +public final class TLb extends Token +{ + public TLb() + { + super.setText("["); + } + + public TLb(int line, int pos) + { + super.setText("["); + setLine(line); + setPos(pos); + } + + @Override + public Object clone() + { + return new TLb(getLine(), getPos()); + } + + public void apply(Switch sw) + { + ((Analysis) sw).caseTLb(this); + } + + @Override + public void setText(@SuppressWarnings("unused") String text) + { + throw new RuntimeException("Cannot change TLb text."); + } +} diff --git a/src/minigen/syntax3/node/TName.java b/src/minigen/syntax3/node/TName.java new file mode 100644 index 0000000..a675dd6 --- /dev/null +++ b/src/minigen/syntax3/node/TName.java @@ -0,0 +1,32 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.node; + +import minigen.syntax3.analysis.*; + +@SuppressWarnings("nls") +public final class TName extends Token +{ + public TName(String text) + { + setText(text); + } + + public TName(String text, int line, int pos) + { + setText(text); + setLine(line); + setPos(pos); + } + + @Override + public Object clone() + { + return new TName(getText(), getLine(), getPos()); + } + + public void apply(Switch sw) + { + ((Analysis) sw).caseTName(this); + } +} diff --git a/src/minigen/syntax3/node/TRb.java b/src/minigen/syntax3/node/TRb.java new file mode 100644 index 0000000..fc48f37 --- /dev/null +++ b/src/minigen/syntax3/node/TRb.java @@ -0,0 +1,38 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.node; + +import minigen.syntax3.analysis.*; + +@SuppressWarnings("nls") +public final class TRb extends Token +{ + public TRb() + { + super.setText("]"); + } + + public TRb(int line, int pos) + { + super.setText("]"); + setLine(line); + setPos(pos); + } + + @Override + public Object clone() + { + return new TRb(getLine(), getPos()); + } + + public void apply(Switch sw) + { + ((Analysis) sw).caseTRb(this); + } + + @Override + public void setText(@SuppressWarnings("unused") String text) + { + throw new RuntimeException("Cannot change TRb text."); + } +} diff --git a/src/minigen/syntax3/node/Token.java b/src/minigen/syntax3/node/Token.java new file mode 100644 index 0000000..5667929 --- /dev/null +++ b/src/minigen/syntax3/node/Token.java @@ -0,0 +1,59 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.node; + +@SuppressWarnings("nls") +public abstract class Token extends Node +{ + private String text; + private int line; + private int pos; + + public String getText() + { + return this.text; + } + + public void setText(@SuppressWarnings("hiding") String text) + { + this.text = text; + } + + public int getLine() + { + return this.line; + } + + public void setLine(@SuppressWarnings("hiding") int line) + { + this.line = line; + } + + public int getPos() + { + return this.pos; + } + + public void setPos(@SuppressWarnings("hiding") int pos) + { + this.pos = pos; + } + + @Override + public String toString() + { + return this.text + " "; + } + + @Override + void removeChild(@SuppressWarnings("unused") Node child) + { + throw new RuntimeException("Not a child."); + } + + @Override + void replaceChild(@SuppressWarnings("unused") Node oldChild, @SuppressWarnings("unused") Node newChild) + { + throw new RuntimeException("Not a child."); + } +} diff --git a/src/minigen/syntax3/parser/Parser.java b/src/minigen/syntax3/parser/Parser.java new file mode 100644 index 0000000..5aeb779 --- /dev/null +++ b/src/minigen/syntax3/parser/Parser.java @@ -0,0 +1,1757 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.parser; + +import minigen.syntax3.lexer.*; +import minigen.syntax3.node.*; +import minigen.syntax3.analysis.*; +import java.util.*; + +import java.io.DataInputStream; +import java.io.BufferedInputStream; +import java.io.IOException; + +@SuppressWarnings("nls") +public class Parser +{ + public final Analysis ignoredTokens = new AnalysisAdapter(); + + protected ArrayList nodeList; + + private final Lexer lexer; + private final ListIterator stack = new LinkedList().listIterator(); + private int last_pos; + private int last_line; + private Token last_token; + private final TokenIndex converter = new TokenIndex(); + private final int[] action = new int[2]; + + private final static int SHIFT = 0; + private final static int REDUCE = 1; + private final static int ACCEPT = 2; + private final static int ERROR = 3; + + public Parser(@SuppressWarnings("hiding") Lexer lexer) + { + this.lexer = lexer; + } + + protected void filter() throws ParserException, LexerException, IOException + { + // Empty body + } + + private void push(int numstate, ArrayList listNode, boolean hidden) throws ParserException, LexerException, IOException + { + this.nodeList = listNode; + + if(!hidden) + { + filter(); + } + + if(!this.stack.hasNext()) + { + this.stack.add(new State(numstate, this.nodeList)); + return; + } + + State s = (State) this.stack.next(); + s.state = numstate; + s.nodes = this.nodeList; + } + + private int goTo(int index) + { + int state = state(); + int low = 1; + int high = gotoTable[index].length - 1; + int value = gotoTable[index][0][1]; + + while(low <= high) + { + int middle = (low + high) / 2; + + if(state < gotoTable[index][middle][0]) + { + high = middle - 1; + } + else if(state > gotoTable[index][middle][0]) + { + low = middle + 1; + } + else + { + value = gotoTable[index][middle][1]; + break; + } + } + + return value; + } + + private int state() + { + State s = (State) this.stack.previous(); + this.stack.next(); + return s.state; + } + + private ArrayList pop() + { + return ((State) this.stack.previous()).nodes; + } + + private int index(Switchable token) + { + this.converter.index = -1; + token.apply(this.converter); + return this.converter.index; + } + + @SuppressWarnings("unchecked") + public Start parse() throws ParserException, LexerException, IOException + { + push(0, null, true); + List ign = null; + while(true) + { + while(index(this.lexer.peek()) == -1) + { + if(ign == null) + { + ign = new LinkedList(); + } + + ign.add(this.lexer.next()); + } + + if(ign != null) + { + this.ignoredTokens.setIn(this.lexer.peek(), ign); + ign = null; + } + + this.last_pos = this.lexer.peek().getPos(); + this.last_line = this.lexer.peek().getLine(); + this.last_token = this.lexer.peek(); + + int index = index(this.lexer.peek()); + this.action[0] = Parser.actionTable[state()][0][1]; + this.action[1] = Parser.actionTable[state()][0][2]; + + int low = 1; + int high = Parser.actionTable[state()].length - 1; + + while(low <= high) + { + int middle = (low + high) / 2; + + if(index < Parser.actionTable[state()][middle][0]) + { + high = middle - 1; + } + else if(index > Parser.actionTable[state()][middle][0]) + { + low = middle + 1; + } + else + { + this.action[0] = Parser.actionTable[state()][middle][1]; + this.action[1] = Parser.actionTable[state()][middle][2]; + break; + } + } + + switch(this.action[0]) + { + case SHIFT: + { + ArrayList list = new ArrayList(); + list.add(this.lexer.next()); + push(this.action[1], list, false); + } + break; + case REDUCE: + switch(this.action[1]) + { + case 0: /* reduce AAprogram1Program */ + { + ArrayList list = new0(); + push(goTo(0), list, false); + } + break; + case 1: /* reduce AAprogram2Program */ + { + ArrayList list = new1(); + push(goTo(0), list, false); + } + break; + case 2: /* reduce AAprogram3Program */ + { + ArrayList list = new2(); + push(goTo(0), list, false); + } + break; + case 3: /* reduce AAprogram4Program */ + { + ArrayList list = new3(); + push(goTo(0), list, false); + } + break; + case 4: /* reduce AAclassdecl1ClassDecl */ + { + ArrayList list = new4(); + push(goTo(1), list, false); + } + break; + case 5: /* reduce AAclassdecl2ClassDecl */ + { + ArrayList list = new5(); + push(goTo(1), list, false); + } + break; + case 6: /* reduce AAclassdecl3ClassDecl */ + { + ArrayList list = new6(); + push(goTo(1), list, false); + } + break; + case 7: /* reduce AAclassdecl4ClassDecl */ + { + ArrayList list = new7(); + push(goTo(1), list, false); + } + break; + case 8: /* reduce AFormalDecls */ + { + ArrayList list = new8(); + push(goTo(2), list, false); + } + break; + case 9: /* reduce AAformaldecl1FormalDecl */ + { + ArrayList list = new9(); + push(goTo(3), list, false); + } + break; + case 10: /* reduce AAformaldecl2FormalDecl */ + { + ArrayList list = new10(); + push(goTo(3), list, false); + } + break; + case 11: /* reduce AAdditionalFormalTypes */ + { + ArrayList list = new11(); + push(goTo(4), list, false); + } + break; + case 12: /* reduce AAtype1Type */ + { + ArrayList list = new12(); + push(goTo(5), list, false); + } + break; + case 13: /* reduce AAtype2Type */ + { + ArrayList list = new13(); + push(goTo(5), list, false); + } + break; + case 14: /* reduce AGenericPart */ + { + ArrayList list = new14(); + push(goTo(6), list, false); + } + break; + case 15: /* reduce AAgenerictypes1GenericTypes */ + { + ArrayList list = new15(); + push(goTo(7), list, false); + } + break; + case 16: /* reduce AAgenerictypes2GenericTypes */ + { + ArrayList list = new16(); + push(goTo(7), list, false); + } + break; + case 17: /* reduce AAdditionalTypes */ + { + ArrayList list = new17(); + push(goTo(8), list, false); + } + break; + case 18: /* reduce AAsuperdecls1SuperDecls */ + { + ArrayList list = new18(); + push(goTo(9), list, false); + } + break; + case 19: /* reduce AAsuperdecls2SuperDecls */ + { + ArrayList list = new19(); + push(goTo(9), list, false); + } + break; + case 20: /* reduce AAdditionalSupers */ + { + ArrayList list = new20(); + push(goTo(10), list, false); + } + break; + case 21: /* reduce AAsupertype1SuperType */ + { + ArrayList list = new21(); + push(goTo(11), list, false); + } + break; + case 22: /* reduce AAsupertype2SuperType */ + { + ArrayList list = new22(); + push(goTo(11), list, false); + } + break; + case 23: /* reduce ASuperGenericPart */ + { + ArrayList list = new23(); + push(goTo(12), list, false); + } + break; + case 24: /* reduce AAsupergenerictypes1SuperGenericTypes */ + { + ArrayList list = new24(); + push(goTo(13), list, false); + } + break; + case 25: /* reduce AAsupergenerictypes2SuperGenericTypes */ + { + ArrayList list = new25(); + push(goTo(13), list, false); + } + break; + case 26: /* reduce ASuperAdditionalTypes */ + { + ArrayList list = new26(); + push(goTo(14), list, false); + } + break; + case 27: /* reduce AIsaInstr */ + { + ArrayList list = new27(); + push(goTo(15), list, false); + } + break; + case 28: /* reduce ATerminal$ClassDecl */ + { + ArrayList list = new28(); + push(goTo(16), list, true); + } + break; + case 29: /* reduce ANonTerminal$ClassDecl */ + { + ArrayList list = new29(); + push(goTo(16), list, true); + } + break; + case 30: /* reduce ATerminal$Instr */ + { + ArrayList list = new30(); + push(goTo(17), list, true); + } + break; + case 31: /* reduce ANonTerminal$Instr */ + { + ArrayList list = new31(); + push(goTo(17), list, true); + } + break; + case 32: /* reduce ATerminal$FormalDecl */ + { + ArrayList list = new32(); + push(goTo(18), list, true); + } + break; + case 33: /* reduce ANonTerminal$FormalDecl */ + { + ArrayList list = new33(); + push(goTo(18), list, true); + } + break; + case 34: /* reduce ATerminal$AdditionalFormalTypes */ + { + ArrayList list = new34(); + push(goTo(19), list, true); + } + break; + case 35: /* reduce ANonTerminal$AdditionalFormalTypes */ + { + ArrayList list = new35(); + push(goTo(19), list, true); + } + break; + case 36: /* reduce ATerminal$AdditionalTypes */ + { + ArrayList list = new36(); + push(goTo(20), list, true); + } + break; + case 37: /* reduce ANonTerminal$AdditionalTypes */ + { + ArrayList list = new37(); + push(goTo(20), list, true); + } + break; + case 38: /* reduce ATerminal$AdditionalSupers */ + { + ArrayList list = new38(); + push(goTo(21), list, true); + } + break; + case 39: /* reduce ANonTerminal$AdditionalSupers */ + { + ArrayList list = new39(); + push(goTo(21), list, true); + } + break; + case 40: /* reduce ATerminal$SuperAdditionalTypes */ + { + ArrayList list = new40(); + push(goTo(22), list, true); + } + break; + case 41: /* reduce ANonTerminal$SuperAdditionalTypes */ + { + ArrayList list = new41(); + push(goTo(22), list, true); + } + break; + } + break; + case ACCEPT: + { + EOF node2 = (EOF) this.lexer.next(); + PProgram node1 = (PProgram) pop().get(0); + Start node = new Start(node1, node2); + return node; + } + case ERROR: + throw new ParserException(this.last_token, + "[" + this.last_line + "," + this.last_pos + "] " + + Parser.errorMessages[Parser.errors[this.action[1]]]); + } + } + } + + + + @SuppressWarnings("unchecked") + ArrayList new0() /* reduce AAprogram1Program */ + { + @SuppressWarnings("hiding") ArrayList nodeList = new ArrayList(); + + PProgram pprogramNode1; + { + // Block + LinkedList listNode2 = new LinkedList(); + LinkedList listNode3 = new LinkedList(); + { + // Block + } + { + // Block + } + + pprogramNode1 = new AProgram(listNode2, listNode3); + } + nodeList.add(pprogramNode1); + return nodeList; + } + + + + @SuppressWarnings("unchecked") + ArrayList new1() /* reduce AAprogram2Program */ + { + @SuppressWarnings("hiding") ArrayList nodeList = new ArrayList(); + + @SuppressWarnings("unused") ArrayList nodeArrayList1 = pop(); + PProgram pprogramNode1; + { + // Block + LinkedList listNode3 = new LinkedList(); + LinkedList listNode4 = new LinkedList(); + { + // Block + LinkedList listNode2 = new LinkedList(); + listNode2 = (LinkedList)nodeArrayList1.get(0); + if(listNode2 != null) + { + listNode3.addAll(listNode2); + } + } + { + // Block + } + + pprogramNode1 = new AProgram(listNode3, listNode4); + } + nodeList.add(pprogramNode1); + return nodeList; + } + + + + @SuppressWarnings("unchecked") + ArrayList new2() /* reduce AAprogram3Program */ + { + @SuppressWarnings("hiding") ArrayList nodeList = new ArrayList(); + + @SuppressWarnings("unused") ArrayList nodeArrayList1 = pop(); + PProgram pprogramNode1; + { + // Block + LinkedList listNode2 = new LinkedList(); + LinkedList listNode4 = new LinkedList(); + { + // Block + } + { + // Block + LinkedList listNode3 = new LinkedList(); + listNode3 = (LinkedList)nodeArrayList1.get(0); + if(listNode3 != null) + { + listNode4.addAll(listNode3); + } + } + + pprogramNode1 = new AProgram(listNode2, listNode4); + } + nodeList.add(pprogramNode1); + return nodeList; + } + + + + @SuppressWarnings("unchecked") + ArrayList new3() /* reduce AAprogram4Program */ + { + @SuppressWarnings("hiding") ArrayList nodeList = new ArrayList(); + + @SuppressWarnings("unused") ArrayList nodeArrayList2 = pop(); + @SuppressWarnings("unused") ArrayList nodeArrayList1 = pop(); + PProgram pprogramNode1; + { + // Block + LinkedList listNode3 = new LinkedList(); + LinkedList listNode5 = new LinkedList(); + { + // Block + LinkedList listNode2 = new LinkedList(); + listNode2 = (LinkedList)nodeArrayList1.get(0); + if(listNode2 != null) + { + listNode3.addAll(listNode2); + } + } + { + // Block + LinkedList listNode4 = new LinkedList(); + listNode4 = (LinkedList)nodeArrayList2.get(0); + if(listNode4 != null) + { + listNode5.addAll(listNode4); + } + } + + pprogramNode1 = new AProgram(listNode3, listNode5); + } + nodeList.add(pprogramNode1); + return nodeList; + } + + + + @SuppressWarnings("unchecked") + ArrayList new4() /* reduce AAclassdecl1ClassDecl */ + { + @SuppressWarnings("hiding") ArrayList nodeList = new ArrayList(); + + @SuppressWarnings("unused") ArrayList nodeArrayList3 = pop(); + @SuppressWarnings("unused") ArrayList nodeArrayList2 = pop(); + @SuppressWarnings("unused") ArrayList nodeArrayList1 = pop(); + PClassDecl pclassdeclNode1; + { + // Block + TKclass tkclassNode2; + TName tnameNode3; + @SuppressWarnings("unused") Object nullNode4 = null; + @SuppressWarnings("unused") Object nullNode5 = null; + TKend tkendNode6; + tkclassNode2 = (TKclass)nodeArrayList1.get(0); + tnameNode3 = (TName)nodeArrayList2.get(0); + tkendNode6 = (TKend)nodeArrayList3.get(0); + + pclassdeclNode1 = new AClassDecl(tkclassNode2, tnameNode3, null, null, tkendNode6); + } + nodeList.add(pclassdeclNode1); + return nodeList; + } + + + + @SuppressWarnings("unchecked") + ArrayList new5() /* reduce AAclassdecl2ClassDecl */ + { + @SuppressWarnings("hiding") ArrayList nodeList = new ArrayList(); + + @SuppressWarnings("unused") ArrayList nodeArrayList4 = pop(); + @SuppressWarnings("unused") ArrayList nodeArrayList3 = pop(); + @SuppressWarnings("unused") ArrayList nodeArrayList2 = pop(); + @SuppressWarnings("unused") ArrayList nodeArrayList1 = pop(); + PClassDecl pclassdeclNode1; + { + // Block + TKclass tkclassNode2; + TName tnameNode3; + PFormalDecls pformaldeclsNode4; + @SuppressWarnings("unused") Object nullNode5 = null; + TKend tkendNode6; + tkclassNode2 = (TKclass)nodeArrayList1.get(0); + tnameNode3 = (TName)nodeArrayList2.get(0); + pformaldeclsNode4 = (PFormalDecls)nodeArrayList3.get(0); + tkendNode6 = (TKend)nodeArrayList4.get(0); + + pclassdeclNode1 = new AClassDecl(tkclassNode2, tnameNode3, pformaldeclsNode4, null, tkendNode6); + } + nodeList.add(pclassdeclNode1); + return nodeList; + } + + + + @SuppressWarnings("unchecked") + ArrayList new6() /* reduce AAclassdecl3ClassDecl */ + { + @SuppressWarnings("hiding") ArrayList nodeList = new ArrayList(); + + @SuppressWarnings("unused") ArrayList nodeArrayList4 = pop(); + @SuppressWarnings("unused") ArrayList nodeArrayList3 = pop(); + @SuppressWarnings("unused") ArrayList nodeArrayList2 = pop(); + @SuppressWarnings("unused") ArrayList nodeArrayList1 = pop(); + PClassDecl pclassdeclNode1; + { + // Block + TKclass tkclassNode2; + TName tnameNode3; + @SuppressWarnings("unused") Object nullNode4 = null; + PSuperDecls psuperdeclsNode5; + TKend tkendNode6; + tkclassNode2 = (TKclass)nodeArrayList1.get(0); + tnameNode3 = (TName)nodeArrayList2.get(0); + psuperdeclsNode5 = (PSuperDecls)nodeArrayList3.get(0); + tkendNode6 = (TKend)nodeArrayList4.get(0); + + pclassdeclNode1 = new AClassDecl(tkclassNode2, tnameNode3, null, psuperdeclsNode5, tkendNode6); + } + nodeList.add(pclassdeclNode1); + return nodeList; + } + + + + @SuppressWarnings("unchecked") + ArrayList new7() /* reduce AAclassdecl4ClassDecl */ + { + @SuppressWarnings("hiding") ArrayList nodeList = new ArrayList(); + + @SuppressWarnings("unused") ArrayList nodeArrayList5 = pop(); + @SuppressWarnings("unused") ArrayList nodeArrayList4 = pop(); + @SuppressWarnings("unused") ArrayList nodeArrayList3 = pop(); + @SuppressWarnings("unused") ArrayList nodeArrayList2 = pop(); + @SuppressWarnings("unused") ArrayList nodeArrayList1 = pop(); + PClassDecl pclassdeclNode1; + { + // Block + TKclass tkclassNode2; + TName tnameNode3; + PFormalDecls pformaldeclsNode4; + PSuperDecls psuperdeclsNode5; + TKend tkendNode6; + tkclassNode2 = (TKclass)nodeArrayList1.get(0); + tnameNode3 = (TName)nodeArrayList2.get(0); + pformaldeclsNode4 = (PFormalDecls)nodeArrayList3.get(0); + psuperdeclsNode5 = (PSuperDecls)nodeArrayList4.get(0); + tkendNode6 = (TKend)nodeArrayList5.get(0); + + pclassdeclNode1 = new AClassDecl(tkclassNode2, tnameNode3, pformaldeclsNode4, psuperdeclsNode5, tkendNode6); + } + nodeList.add(pclassdeclNode1); + return nodeList; + } + + + + @SuppressWarnings("unchecked") + ArrayList new8() /* reduce AFormalDecls */ + { + @SuppressWarnings("hiding") ArrayList nodeList = new ArrayList(); + + @SuppressWarnings("unused") ArrayList nodeArrayList3 = pop(); + @SuppressWarnings("unused") ArrayList nodeArrayList2 = pop(); + @SuppressWarnings("unused") ArrayList nodeArrayList1 = pop(); + PFormalDecls pformaldeclsNode1; + { + // Block + TLb tlbNode2; + LinkedList listNode4 = new LinkedList(); + TRb trbNode5; + tlbNode2 = (TLb)nodeArrayList1.get(0); + { + // Block + LinkedList listNode3 = new LinkedList(); + listNode3 = (LinkedList)nodeArrayList2.get(0); + if(listNode3 != null) + { + listNode4.addAll(listNode3); + } + } + trbNode5 = (TRb)nodeArrayList3.get(0); + + pformaldeclsNode1 = new AFormalDecls(tlbNode2, listNode4, trbNode5); + } + nodeList.add(pformaldeclsNode1); + return nodeList; + } + + + + @SuppressWarnings("unchecked") + ArrayList new9() /* reduce AAformaldecl1FormalDecl */ + { + @SuppressWarnings("hiding") ArrayList nodeList = new ArrayList(); + + @SuppressWarnings("unused") ArrayList nodeArrayList1 = pop(); + PFormalDecl pformaldeclNode1; + { + // Block + TName tnameNode2; + LinkedList listNode3 = new LinkedList(); + tnameNode2 = (TName)nodeArrayList1.get(0); + { + // Block + } + + pformaldeclNode1 = new AFormalDecl(tnameNode2, listNode3); + } + nodeList.add(pformaldeclNode1); + return nodeList; + } + + + + @SuppressWarnings("unchecked") + ArrayList new10() /* reduce AAformaldecl2FormalDecl */ + { + @SuppressWarnings("hiding") ArrayList nodeList = new ArrayList(); + + @SuppressWarnings("unused") ArrayList nodeArrayList2 = pop(); + @SuppressWarnings("unused") ArrayList nodeArrayList1 = pop(); + PFormalDecl pformaldeclNode1; + { + // Block + TName tnameNode2; + LinkedList listNode4 = new LinkedList(); + tnameNode2 = (TName)nodeArrayList1.get(0); + { + // Block + LinkedList listNode3 = new LinkedList(); + listNode3 = (LinkedList)nodeArrayList2.get(0); + if(listNode3 != null) + { + listNode4.addAll(listNode3); + } + } + + pformaldeclNode1 = new AFormalDecl(tnameNode2, listNode4); + } + nodeList.add(pformaldeclNode1); + return nodeList; + } + + + + @SuppressWarnings("unchecked") + ArrayList new11() /* reduce AAdditionalFormalTypes */ + { + @SuppressWarnings("hiding") ArrayList nodeList = new ArrayList(); + + @SuppressWarnings("unused") ArrayList nodeArrayList2 = pop(); + @SuppressWarnings("unused") ArrayList nodeArrayList1 = pop(); + PAdditionalFormalTypes padditionalformaltypesNode1; + { + // Block + TComma tcommaNode2; + TName tnameNode3; + tcommaNode2 = (TComma)nodeArrayList1.get(0); + tnameNode3 = (TName)nodeArrayList2.get(0); + + padditionalformaltypesNode1 = new AAdditionalFormalTypes(tcommaNode2, tnameNode3); + } + nodeList.add(padditionalformaltypesNode1); + return nodeList; + } + + + + @SuppressWarnings("unchecked") + ArrayList new12() /* reduce AAtype1Type */ + { + @SuppressWarnings("hiding") ArrayList nodeList = new ArrayList(); + + @SuppressWarnings("unused") ArrayList nodeArrayList1 = pop(); + PType ptypeNode1; + { + // Block + TName tnameNode2; + @SuppressWarnings("unused") Object nullNode3 = null; + tnameNode2 = (TName)nodeArrayList1.get(0); + + ptypeNode1 = new AType(tnameNode2, null); + } + nodeList.add(ptypeNode1); + return nodeList; + } + + + + @SuppressWarnings("unchecked") + ArrayList new13() /* reduce AAtype2Type */ + { + @SuppressWarnings("hiding") ArrayList nodeList = new ArrayList(); + + @SuppressWarnings("unused") ArrayList nodeArrayList2 = pop(); + @SuppressWarnings("unused") ArrayList nodeArrayList1 = pop(); + PType ptypeNode1; + { + // Block + TName tnameNode2; + PGenericPart pgenericpartNode3; + tnameNode2 = (TName)nodeArrayList1.get(0); + pgenericpartNode3 = (PGenericPart)nodeArrayList2.get(0); + + ptypeNode1 = new AType(tnameNode2, pgenericpartNode3); + } + nodeList.add(ptypeNode1); + return nodeList; + } + + + + @SuppressWarnings("unchecked") + ArrayList new14() /* reduce AGenericPart */ + { + @SuppressWarnings("hiding") ArrayList nodeList = new ArrayList(); + + @SuppressWarnings("unused") ArrayList nodeArrayList3 = pop(); + @SuppressWarnings("unused") ArrayList nodeArrayList2 = pop(); + @SuppressWarnings("unused") ArrayList nodeArrayList1 = pop(); + PGenericPart pgenericpartNode1; + { + // Block + TLb tlbNode2; + PGenericTypes pgenerictypesNode3; + TRb trbNode4; + tlbNode2 = (TLb)nodeArrayList1.get(0); + pgenerictypesNode3 = (PGenericTypes)nodeArrayList2.get(0); + trbNode4 = (TRb)nodeArrayList3.get(0); + + pgenericpartNode1 = new AGenericPart(tlbNode2, pgenerictypesNode3, trbNode4); + } + nodeList.add(pgenericpartNode1); + return nodeList; + } + + + + @SuppressWarnings("unchecked") + ArrayList new15() /* reduce AAgenerictypes1GenericTypes */ + { + @SuppressWarnings("hiding") ArrayList nodeList = new ArrayList(); + + @SuppressWarnings("unused") ArrayList nodeArrayList1 = pop(); + PGenericTypes pgenerictypesNode1; + { + // Block + PType ptypeNode2; + LinkedList listNode3 = new LinkedList(); + ptypeNode2 = (PType)nodeArrayList1.get(0); + { + // Block + } + + pgenerictypesNode1 = new AGenericTypes(ptypeNode2, listNode3); + } + nodeList.add(pgenerictypesNode1); + return nodeList; + } + + + + @SuppressWarnings("unchecked") + ArrayList new16() /* reduce AAgenerictypes2GenericTypes */ + { + @SuppressWarnings("hiding") ArrayList nodeList = new ArrayList(); + + @SuppressWarnings("unused") ArrayList nodeArrayList2 = pop(); + @SuppressWarnings("unused") ArrayList nodeArrayList1 = pop(); + PGenericTypes pgenerictypesNode1; + { + // Block + PType ptypeNode2; + LinkedList listNode4 = new LinkedList(); + ptypeNode2 = (PType)nodeArrayList1.get(0); + { + // Block + LinkedList listNode3 = new LinkedList(); + listNode3 = (LinkedList)nodeArrayList2.get(0); + if(listNode3 != null) + { + listNode4.addAll(listNode3); + } + } + + pgenerictypesNode1 = new AGenericTypes(ptypeNode2, listNode4); + } + nodeList.add(pgenerictypesNode1); + return nodeList; + } + + + + @SuppressWarnings("unchecked") + ArrayList new17() /* reduce AAdditionalTypes */ + { + @SuppressWarnings("hiding") ArrayList nodeList = new ArrayList(); + + @SuppressWarnings("unused") ArrayList nodeArrayList2 = pop(); + @SuppressWarnings("unused") ArrayList nodeArrayList1 = pop(); + PAdditionalTypes padditionaltypesNode1; + { + // Block + TComma tcommaNode2; + PType ptypeNode3; + tcommaNode2 = (TComma)nodeArrayList1.get(0); + ptypeNode3 = (PType)nodeArrayList2.get(0); + + padditionaltypesNode1 = new AAdditionalTypes(tcommaNode2, ptypeNode3); + } + nodeList.add(padditionaltypesNode1); + return nodeList; + } + + + + @SuppressWarnings("unchecked") + ArrayList new18() /* reduce AAsuperdecls1SuperDecls */ + { + @SuppressWarnings("hiding") ArrayList nodeList = new ArrayList(); + + @SuppressWarnings("unused") ArrayList nodeArrayList2 = pop(); + @SuppressWarnings("unused") ArrayList nodeArrayList1 = pop(); + PSuperDecls psuperdeclsNode1; + { + // Block + TKsuper tksuperNode2; + PSuperType psupertypeNode3; + LinkedList listNode4 = new LinkedList(); + tksuperNode2 = (TKsuper)nodeArrayList1.get(0); + psupertypeNode3 = (PSuperType)nodeArrayList2.get(0); + { + // Block + } + + psuperdeclsNode1 = new ASuperDecls(tksuperNode2, psupertypeNode3, listNode4); + } + nodeList.add(psuperdeclsNode1); + return nodeList; + } + + + + @SuppressWarnings("unchecked") + ArrayList new19() /* reduce AAsuperdecls2SuperDecls */ + { + @SuppressWarnings("hiding") ArrayList nodeList = new ArrayList(); + + @SuppressWarnings("unused") ArrayList nodeArrayList3 = pop(); + @SuppressWarnings("unused") ArrayList nodeArrayList2 = pop(); + @SuppressWarnings("unused") ArrayList nodeArrayList1 = pop(); + PSuperDecls psuperdeclsNode1; + { + // Block + TKsuper tksuperNode2; + PSuperType psupertypeNode3; + LinkedList listNode5 = new LinkedList(); + tksuperNode2 = (TKsuper)nodeArrayList1.get(0); + psupertypeNode3 = (PSuperType)nodeArrayList2.get(0); + { + // Block + LinkedList listNode4 = new LinkedList(); + listNode4 = (LinkedList)nodeArrayList3.get(0); + if(listNode4 != null) + { + listNode5.addAll(listNode4); + } + } + + psuperdeclsNode1 = new ASuperDecls(tksuperNode2, psupertypeNode3, listNode5); + } + nodeList.add(psuperdeclsNode1); + return nodeList; + } + + + + @SuppressWarnings("unchecked") + ArrayList new20() /* reduce AAdditionalSupers */ + { + @SuppressWarnings("hiding") ArrayList nodeList = new ArrayList(); + + @SuppressWarnings("unused") ArrayList nodeArrayList2 = pop(); + @SuppressWarnings("unused") ArrayList nodeArrayList1 = pop(); + PAdditionalSupers padditionalsupersNode1; + { + // Block + TComma tcommaNode2; + PSuperType psupertypeNode3; + tcommaNode2 = (TComma)nodeArrayList1.get(0); + psupertypeNode3 = (PSuperType)nodeArrayList2.get(0); + + padditionalsupersNode1 = new AAdditionalSupers(tcommaNode2, psupertypeNode3); + } + nodeList.add(padditionalsupersNode1); + return nodeList; + } + + + + @SuppressWarnings("unchecked") + ArrayList new21() /* reduce AAsupertype1SuperType */ + { + @SuppressWarnings("hiding") ArrayList nodeList = new ArrayList(); + + @SuppressWarnings("unused") ArrayList nodeArrayList1 = pop(); + PSuperType psupertypeNode1; + { + // Block + TName tnameNode2; + @SuppressWarnings("unused") Object nullNode3 = null; + tnameNode2 = (TName)nodeArrayList1.get(0); + + psupertypeNode1 = new ASuperType(tnameNode2, null); + } + nodeList.add(psupertypeNode1); + return nodeList; + } + + + + @SuppressWarnings("unchecked") + ArrayList new22() /* reduce AAsupertype2SuperType */ + { + @SuppressWarnings("hiding") ArrayList nodeList = new ArrayList(); + + @SuppressWarnings("unused") ArrayList nodeArrayList2 = pop(); + @SuppressWarnings("unused") ArrayList nodeArrayList1 = pop(); + PSuperType psupertypeNode1; + { + // Block + TName tnameNode2; + PSuperGenericPart psupergenericpartNode3; + tnameNode2 = (TName)nodeArrayList1.get(0); + psupergenericpartNode3 = (PSuperGenericPart)nodeArrayList2.get(0); + + psupertypeNode1 = new ASuperType(tnameNode2, psupergenericpartNode3); + } + nodeList.add(psupertypeNode1); + return nodeList; + } + + + + @SuppressWarnings("unchecked") + ArrayList new23() /* reduce ASuperGenericPart */ + { + @SuppressWarnings("hiding") ArrayList nodeList = new ArrayList(); + + @SuppressWarnings("unused") ArrayList nodeArrayList3 = pop(); + @SuppressWarnings("unused") ArrayList nodeArrayList2 = pop(); + @SuppressWarnings("unused") ArrayList nodeArrayList1 = pop(); + PSuperGenericPart psupergenericpartNode1; + { + // Block + TLb tlbNode2; + PSuperGenericTypes psupergenerictypesNode3; + TRb trbNode4; + tlbNode2 = (TLb)nodeArrayList1.get(0); + psupergenerictypesNode3 = (PSuperGenericTypes)nodeArrayList2.get(0); + trbNode4 = (TRb)nodeArrayList3.get(0); + + psupergenericpartNode1 = new ASuperGenericPart(tlbNode2, psupergenerictypesNode3, trbNode4); + } + nodeList.add(psupergenericpartNode1); + return nodeList; + } + + + + @SuppressWarnings("unchecked") + ArrayList new24() /* reduce AAsupergenerictypes1SuperGenericTypes */ + { + @SuppressWarnings("hiding") ArrayList nodeList = new ArrayList(); + + @SuppressWarnings("unused") ArrayList nodeArrayList1 = pop(); + PSuperGenericTypes psupergenerictypesNode1; + { + // Block + PSuperType psupertypeNode2; + LinkedList listNode3 = new LinkedList(); + psupertypeNode2 = (PSuperType)nodeArrayList1.get(0); + { + // Block + } + + psupergenerictypesNode1 = new ASuperGenericTypes(psupertypeNode2, listNode3); + } + nodeList.add(psupergenerictypesNode1); + return nodeList; + } + + + + @SuppressWarnings("unchecked") + ArrayList new25() /* reduce AAsupergenerictypes2SuperGenericTypes */ + { + @SuppressWarnings("hiding") ArrayList nodeList = new ArrayList(); + + @SuppressWarnings("unused") ArrayList nodeArrayList2 = pop(); + @SuppressWarnings("unused") ArrayList nodeArrayList1 = pop(); + PSuperGenericTypes psupergenerictypesNode1; + { + // Block + PSuperType psupertypeNode2; + LinkedList listNode4 = new LinkedList(); + psupertypeNode2 = (PSuperType)nodeArrayList1.get(0); + { + // Block + LinkedList listNode3 = new LinkedList(); + listNode3 = (LinkedList)nodeArrayList2.get(0); + if(listNode3 != null) + { + listNode4.addAll(listNode3); + } + } + + psupergenerictypesNode1 = new ASuperGenericTypes(psupertypeNode2, listNode4); + } + nodeList.add(psupergenerictypesNode1); + return nodeList; + } + + + + @SuppressWarnings("unchecked") + ArrayList new26() /* reduce ASuperAdditionalTypes */ + { + @SuppressWarnings("hiding") ArrayList nodeList = new ArrayList(); + + @SuppressWarnings("unused") ArrayList nodeArrayList2 = pop(); + @SuppressWarnings("unused") ArrayList nodeArrayList1 = pop(); + PSuperAdditionalTypes psuperadditionaltypesNode1; + { + // Block + TComma tcommaNode2; + PSuperType psupertypeNode3; + tcommaNode2 = (TComma)nodeArrayList1.get(0); + psupertypeNode3 = (PSuperType)nodeArrayList2.get(0); + + psuperadditionaltypesNode1 = new ASuperAdditionalTypes(tcommaNode2, psupertypeNode3); + } + nodeList.add(psuperadditionaltypesNode1); + return nodeList; + } + + + + @SuppressWarnings("unchecked") + ArrayList new27() /* reduce AIsaInstr */ + { + @SuppressWarnings("hiding") ArrayList nodeList = new ArrayList(); + + @SuppressWarnings("unused") ArrayList nodeArrayList3 = pop(); + @SuppressWarnings("unused") ArrayList nodeArrayList2 = pop(); + @SuppressWarnings("unused") ArrayList nodeArrayList1 = pop(); + PInstr pinstrNode1; + { + // Block + PType ptypeNode2; + TKisa tkisaNode3; + PType ptypeNode4; + ptypeNode2 = (PType)nodeArrayList1.get(0); + tkisaNode3 = (TKisa)nodeArrayList2.get(0); + ptypeNode4 = (PType)nodeArrayList3.get(0); + + pinstrNode1 = new AIsaInstr(ptypeNode2, tkisaNode3, ptypeNode4); + } + nodeList.add(pinstrNode1); + return nodeList; + } + + + + @SuppressWarnings("unchecked") + ArrayList new28() /* reduce ATerminal$ClassDecl */ + { + @SuppressWarnings("hiding") ArrayList nodeList = new ArrayList(); + + @SuppressWarnings("unused") ArrayList nodeArrayList1 = pop(); + LinkedList listNode2 = new LinkedList(); + { + // Block + PClassDecl pclassdeclNode1; + pclassdeclNode1 = (PClassDecl)nodeArrayList1.get(0); + if(pclassdeclNode1 != null) + { + listNode2.add(pclassdeclNode1); + } + } + nodeList.add(listNode2); + return nodeList; + } + + + + @SuppressWarnings("unchecked") + ArrayList new29() /* reduce ANonTerminal$ClassDecl */ + { + @SuppressWarnings("hiding") ArrayList nodeList = new ArrayList(); + + @SuppressWarnings("unused") ArrayList nodeArrayList2 = pop(); + @SuppressWarnings("unused") ArrayList nodeArrayList1 = pop(); + LinkedList listNode3 = new LinkedList(); + { + // Block + LinkedList listNode1 = new LinkedList(); + PClassDecl pclassdeclNode2; + listNode1 = (LinkedList)nodeArrayList1.get(0); + pclassdeclNode2 = (PClassDecl)nodeArrayList2.get(0); + if(listNode1 != null) + { + listNode3.addAll(listNode1); + } + if(pclassdeclNode2 != null) + { + listNode3.add(pclassdeclNode2); + } + } + nodeList.add(listNode3); + return nodeList; + } + + + + @SuppressWarnings("unchecked") + ArrayList new30() /* reduce ATerminal$Instr */ + { + @SuppressWarnings("hiding") ArrayList nodeList = new ArrayList(); + + @SuppressWarnings("unused") ArrayList nodeArrayList1 = pop(); + LinkedList listNode2 = new LinkedList(); + { + // Block + PInstr pinstrNode1; + pinstrNode1 = (PInstr)nodeArrayList1.get(0); + if(pinstrNode1 != null) + { + listNode2.add(pinstrNode1); + } + } + nodeList.add(listNode2); + return nodeList; + } + + + + @SuppressWarnings("unchecked") + ArrayList new31() /* reduce ANonTerminal$Instr */ + { + @SuppressWarnings("hiding") ArrayList nodeList = new ArrayList(); + + @SuppressWarnings("unused") ArrayList nodeArrayList2 = pop(); + @SuppressWarnings("unused") ArrayList nodeArrayList1 = pop(); + LinkedList listNode3 = new LinkedList(); + { + // Block + LinkedList listNode1 = new LinkedList(); + PInstr pinstrNode2; + listNode1 = (LinkedList)nodeArrayList1.get(0); + pinstrNode2 = (PInstr)nodeArrayList2.get(0); + if(listNode1 != null) + { + listNode3.addAll(listNode1); + } + if(pinstrNode2 != null) + { + listNode3.add(pinstrNode2); + } + } + nodeList.add(listNode3); + return nodeList; + } + + + + @SuppressWarnings("unchecked") + ArrayList new32() /* reduce ATerminal$FormalDecl */ + { + @SuppressWarnings("hiding") ArrayList nodeList = new ArrayList(); + + @SuppressWarnings("unused") ArrayList nodeArrayList1 = pop(); + LinkedList listNode2 = new LinkedList(); + { + // Block + PFormalDecl pformaldeclNode1; + pformaldeclNode1 = (PFormalDecl)nodeArrayList1.get(0); + if(pformaldeclNode1 != null) + { + listNode2.add(pformaldeclNode1); + } + } + nodeList.add(listNode2); + return nodeList; + } + + + + @SuppressWarnings("unchecked") + ArrayList new33() /* reduce ANonTerminal$FormalDecl */ + { + @SuppressWarnings("hiding") ArrayList nodeList = new ArrayList(); + + @SuppressWarnings("unused") ArrayList nodeArrayList2 = pop(); + @SuppressWarnings("unused") ArrayList nodeArrayList1 = pop(); + LinkedList listNode3 = new LinkedList(); + { + // Block + LinkedList listNode1 = new LinkedList(); + PFormalDecl pformaldeclNode2; + listNode1 = (LinkedList)nodeArrayList1.get(0); + pformaldeclNode2 = (PFormalDecl)nodeArrayList2.get(0); + if(listNode1 != null) + { + listNode3.addAll(listNode1); + } + if(pformaldeclNode2 != null) + { + listNode3.add(pformaldeclNode2); + } + } + nodeList.add(listNode3); + return nodeList; + } + + + + @SuppressWarnings("unchecked") + ArrayList new34() /* reduce ATerminal$AdditionalFormalTypes */ + { + @SuppressWarnings("hiding") ArrayList nodeList = new ArrayList(); + + @SuppressWarnings("unused") ArrayList nodeArrayList1 = pop(); + LinkedList listNode2 = new LinkedList(); + { + // Block + PAdditionalFormalTypes padditionalformaltypesNode1; + padditionalformaltypesNode1 = (PAdditionalFormalTypes)nodeArrayList1.get(0); + if(padditionalformaltypesNode1 != null) + { + listNode2.add(padditionalformaltypesNode1); + } + } + nodeList.add(listNode2); + return nodeList; + } + + + + @SuppressWarnings("unchecked") + ArrayList new35() /* reduce ANonTerminal$AdditionalFormalTypes */ + { + @SuppressWarnings("hiding") ArrayList nodeList = new ArrayList(); + + @SuppressWarnings("unused") ArrayList nodeArrayList2 = pop(); + @SuppressWarnings("unused") ArrayList nodeArrayList1 = pop(); + LinkedList listNode3 = new LinkedList(); + { + // Block + LinkedList listNode1 = new LinkedList(); + PAdditionalFormalTypes padditionalformaltypesNode2; + listNode1 = (LinkedList)nodeArrayList1.get(0); + padditionalformaltypesNode2 = (PAdditionalFormalTypes)nodeArrayList2.get(0); + if(listNode1 != null) + { + listNode3.addAll(listNode1); + } + if(padditionalformaltypesNode2 != null) + { + listNode3.add(padditionalformaltypesNode2); + } + } + nodeList.add(listNode3); + return nodeList; + } + + + + @SuppressWarnings("unchecked") + ArrayList new36() /* reduce ATerminal$AdditionalTypes */ + { + @SuppressWarnings("hiding") ArrayList nodeList = new ArrayList(); + + @SuppressWarnings("unused") ArrayList nodeArrayList1 = pop(); + LinkedList listNode2 = new LinkedList(); + { + // Block + PAdditionalTypes padditionaltypesNode1; + padditionaltypesNode1 = (PAdditionalTypes)nodeArrayList1.get(0); + if(padditionaltypesNode1 != null) + { + listNode2.add(padditionaltypesNode1); + } + } + nodeList.add(listNode2); + return nodeList; + } + + + + @SuppressWarnings("unchecked") + ArrayList new37() /* reduce ANonTerminal$AdditionalTypes */ + { + @SuppressWarnings("hiding") ArrayList nodeList = new ArrayList(); + + @SuppressWarnings("unused") ArrayList nodeArrayList2 = pop(); + @SuppressWarnings("unused") ArrayList nodeArrayList1 = pop(); + LinkedList listNode3 = new LinkedList(); + { + // Block + LinkedList listNode1 = new LinkedList(); + PAdditionalTypes padditionaltypesNode2; + listNode1 = (LinkedList)nodeArrayList1.get(0); + padditionaltypesNode2 = (PAdditionalTypes)nodeArrayList2.get(0); + if(listNode1 != null) + { + listNode3.addAll(listNode1); + } + if(padditionaltypesNode2 != null) + { + listNode3.add(padditionaltypesNode2); + } + } + nodeList.add(listNode3); + return nodeList; + } + + + + @SuppressWarnings("unchecked") + ArrayList new38() /* reduce ATerminal$AdditionalSupers */ + { + @SuppressWarnings("hiding") ArrayList nodeList = new ArrayList(); + + @SuppressWarnings("unused") ArrayList nodeArrayList1 = pop(); + LinkedList listNode2 = new LinkedList(); + { + // Block + PAdditionalSupers padditionalsupersNode1; + padditionalsupersNode1 = (PAdditionalSupers)nodeArrayList1.get(0); + if(padditionalsupersNode1 != null) + { + listNode2.add(padditionalsupersNode1); + } + } + nodeList.add(listNode2); + return nodeList; + } + + + + @SuppressWarnings("unchecked") + ArrayList new39() /* reduce ANonTerminal$AdditionalSupers */ + { + @SuppressWarnings("hiding") ArrayList nodeList = new ArrayList(); + + @SuppressWarnings("unused") ArrayList nodeArrayList2 = pop(); + @SuppressWarnings("unused") ArrayList nodeArrayList1 = pop(); + LinkedList listNode3 = new LinkedList(); + { + // Block + LinkedList listNode1 = new LinkedList(); + PAdditionalSupers padditionalsupersNode2; + listNode1 = (LinkedList)nodeArrayList1.get(0); + padditionalsupersNode2 = (PAdditionalSupers)nodeArrayList2.get(0); + if(listNode1 != null) + { + listNode3.addAll(listNode1); + } + if(padditionalsupersNode2 != null) + { + listNode3.add(padditionalsupersNode2); + } + } + nodeList.add(listNode3); + return nodeList; + } + + + + @SuppressWarnings("unchecked") + ArrayList new40() /* reduce ATerminal$SuperAdditionalTypes */ + { + @SuppressWarnings("hiding") ArrayList nodeList = new ArrayList(); + + @SuppressWarnings("unused") ArrayList nodeArrayList1 = pop(); + LinkedList listNode2 = new LinkedList(); + { + // Block + PSuperAdditionalTypes psuperadditionaltypesNode1; + psuperadditionaltypesNode1 = (PSuperAdditionalTypes)nodeArrayList1.get(0); + if(psuperadditionaltypesNode1 != null) + { + listNode2.add(psuperadditionaltypesNode1); + } + } + nodeList.add(listNode2); + return nodeList; + } + + + + @SuppressWarnings("unchecked") + ArrayList new41() /* reduce ANonTerminal$SuperAdditionalTypes */ + { + @SuppressWarnings("hiding") ArrayList nodeList = new ArrayList(); + + @SuppressWarnings("unused") ArrayList nodeArrayList2 = pop(); + @SuppressWarnings("unused") ArrayList nodeArrayList1 = pop(); + LinkedList listNode3 = new LinkedList(); + { + // Block + LinkedList listNode1 = new LinkedList(); + PSuperAdditionalTypes psuperadditionaltypesNode2; + listNode1 = (LinkedList)nodeArrayList1.get(0); + psuperadditionaltypesNode2 = (PSuperAdditionalTypes)nodeArrayList2.get(0); + if(listNode1 != null) + { + listNode3.addAll(listNode1); + } + if(psuperadditionaltypesNode2 != null) + { + listNode3.add(psuperadditionaltypesNode2); + } + } + nodeList.add(listNode3); + return nodeList; + } + + + + private static int[][][] actionTable; +/* { + {{-1, REDUCE, 0}, {5, SHIFT, 1}, {8, SHIFT, 2}, }, + {{-1, ERROR, 1}, {8, SHIFT, 9}, }, + {{-1, REDUCE, 12}, {1, SHIFT, 10}, }, + {{-1, ERROR, 3}, {9, ACCEPT, -1}, }, + {{-1, REDUCE, 28}, }, + {{-1, ERROR, 5}, {4, SHIFT, 12}, }, + {{-1, REDUCE, 30}, }, + {{-1, REDUCE, 1}, {5, SHIFT, 1}, {8, SHIFT, 2}, }, + {{-1, REDUCE, 2}, {8, SHIFT, 2}, }, + {{-1, ERROR, 9}, {1, SHIFT, 16}, {3, SHIFT, 17}, {6, SHIFT, 18}, }, + {{-1, ERROR, 10}, {8, SHIFT, 2}, }, + {{-1, REDUCE, 13}, }, + {{-1, ERROR, 12}, {8, SHIFT, 2}, }, + {{-1, REDUCE, 29}, }, + {{-1, REDUCE, 3}, {8, SHIFT, 2}, }, + {{-1, REDUCE, 31}, }, + {{-1, ERROR, 16}, {8, SHIFT, 24}, }, + {{-1, REDUCE, 4}, }, + {{-1, ERROR, 18}, {8, SHIFT, 27}, }, + {{-1, ERROR, 19}, {3, SHIFT, 29}, {6, SHIFT, 18}, }, + {{-1, ERROR, 20}, {3, SHIFT, 31}, }, + {{-1, REDUCE, 15}, {0, SHIFT, 32}, }, + {{-1, ERROR, 22}, {2, SHIFT, 35}, }, + {{-1, REDUCE, 27}, }, + {{-1, REDUCE, 9}, {0, SHIFT, 36}, }, + {{-1, REDUCE, 32}, }, + {{-1, ERROR, 26}, {2, SHIFT, 39}, {8, SHIFT, 24}, }, + {{-1, REDUCE, 21}, {1, SHIFT, 41}, }, + {{-1, REDUCE, 18}, {0, SHIFT, 43}, }, + {{-1, REDUCE, 5}, }, + {{-1, ERROR, 30}, {3, SHIFT, 46}, }, + {{-1, REDUCE, 6}, }, + {{-1, ERROR, 32}, {8, SHIFT, 2}, }, + {{-1, REDUCE, 36}, }, + {{-1, REDUCE, 16}, {0, SHIFT, 32}, }, + {{-1, REDUCE, 14}, }, + {{-1, ERROR, 36}, {8, SHIFT, 49}, }, + {{-1, REDUCE, 34}, }, + {{-1, REDUCE, 10}, {0, SHIFT, 36}, }, + {{-1, REDUCE, 8}, }, + {{-1, REDUCE, 33}, }, + {{-1, ERROR, 41}, {8, SHIFT, 27}, }, + {{-1, REDUCE, 22}, }, + {{-1, ERROR, 43}, {8, SHIFT, 27}, }, + {{-1, REDUCE, 38}, }, + {{-1, REDUCE, 19}, {0, SHIFT, 43}, }, + {{-1, REDUCE, 7}, }, + {{-1, REDUCE, 17}, }, + {{-1, REDUCE, 37}, }, + {{-1, REDUCE, 11}, }, + {{-1, REDUCE, 35}, }, + {{-1, REDUCE, 24}, {0, SHIFT, 55}, }, + {{-1, ERROR, 52}, {2, SHIFT, 58}, }, + {{-1, REDUCE, 20}, }, + {{-1, REDUCE, 39}, }, + {{-1, ERROR, 55}, {8, SHIFT, 27}, }, + {{-1, REDUCE, 40}, }, + {{-1, REDUCE, 25}, {0, SHIFT, 55}, }, + {{-1, REDUCE, 23}, }, + {{-1, REDUCE, 26}, }, + {{-1, REDUCE, 41}, }, + };*/ + private static int[][][] gotoTable; +/* { + {{-1, 3}, }, + {{-1, 4}, {7, 13}, }, + {{-1, 19}, }, + {{-1, 25}, {26, 40}, }, + {{-1, 37}, {38, 50}, }, + {{-1, 5}, {10, 21}, {12, 23}, {32, 47}, }, + {{-1, 11}, }, + {{-1, 22}, }, + {{-1, 33}, {34, 48}, }, + {{-1, 20}, {19, 30}, }, + {{-1, 44}, {45, 54}, }, + {{-1, 28}, {41, 51}, {43, 53}, {55, 59}, }, + {{-1, 42}, }, + {{-1, 52}, }, + {{-1, 56}, {57, 60}, }, + {{-1, 6}, {8, 15}, {14, 15}, }, + {{-1, 7}, }, + {{-1, 8}, {7, 14}, }, + {{-1, 26}, }, + {{-1, 38}, }, + {{-1, 34}, }, + {{-1, 45}, }, + {{-1, 57}, }, + };*/ + private static String[] errorMessages; +/* { + "expecting: 'class', name, EOF", + "expecting: name", + "expecting: ',', '[', ']', 'isa', name, EOF", + "expecting: EOF", + "expecting: 'isa'", + "expecting: name, EOF", + "expecting: '[', 'end', 'super'", + "expecting: ',', ']', 'isa', name, EOF", + "expecting: 'end', 'super'", + "expecting: 'end'", + "expecting: ',', ']'", + "expecting: ']'", + "expecting: ',', ']', name", + "expecting: ']', name", + "expecting: ',', '[', ']', 'end'", + "expecting: ',', 'end'", + "expecting: ',', ']', 'end'", + };*/ + private static int[] errors; +/* { + 0, 1, 2, 3, 0, 4, 5, 0, 5, 6, 1, 7, 1, 0, 5, 5, 1, 0, 1, 8, 9, 10, 11, 5, 12, 13, 13, 14, 15, 0, 9, 0, 1, 10, 10, 7, 1, 12, 12, 8, 13, 1, 16, 1, 15, 15, 0, 10, 10, 12, 12, 10, 11, 15, 15, 1, 10, 10, 16, 10, 10, + };*/ + + static + { + try + { + DataInputStream s = new DataInputStream( + new BufferedInputStream( + Parser.class.getResourceAsStream("parser.dat"))); + + // read actionTable + int length = s.readInt(); + Parser.actionTable = new int[length][][]; + for(int i = 0; i < Parser.actionTable.length; i++) + { + length = s.readInt(); + Parser.actionTable[i] = new int[length][3]; + for(int j = 0; j < Parser.actionTable[i].length; j++) + { + for(int k = 0; k < 3; k++) + { + Parser.actionTable[i][j][k] = s.readInt(); + } + } + } + + // read gotoTable + length = s.readInt(); + gotoTable = new int[length][][]; + for(int i = 0; i < gotoTable.length; i++) + { + length = s.readInt(); + gotoTable[i] = new int[length][2]; + for(int j = 0; j < gotoTable[i].length; j++) + { + for(int k = 0; k < 2; k++) + { + gotoTable[i][j][k] = s.readInt(); + } + } + } + + // read errorMessages + length = s.readInt(); + errorMessages = new String[length]; + for(int i = 0; i < errorMessages.length; i++) + { + length = s.readInt(); + StringBuffer buffer = new StringBuffer(); + + for(int j = 0; j < length; j++) + { + buffer.append(s.readChar()); + } + errorMessages[i] = buffer.toString(); + } + + // read errors + length = s.readInt(); + errors = new int[length]; + for(int i = 0; i < errors.length; i++) + { + errors[i] = s.readInt(); + } + + s.close(); + } + catch(Exception e) + { + throw new RuntimeException("The file \"parser.dat\" is either missing or corrupted."); + } + } +} diff --git a/src/minigen/syntax3/parser/ParserException.java b/src/minigen/syntax3/parser/ParserException.java new file mode 100644 index 0000000..95ee7bc --- /dev/null +++ b/src/minigen/syntax3/parser/ParserException.java @@ -0,0 +1,22 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.parser; + +import minigen.syntax3.node.*; + +@SuppressWarnings("serial") +public class ParserException extends Exception +{ + Token token; + + public ParserException(@SuppressWarnings("hiding") Token token, String message) + { + super(message); + this.token = token; + } + + public Token getToken() + { + return this.token; + } +} diff --git a/src/minigen/syntax3/parser/State.java b/src/minigen/syntax3/parser/State.java new file mode 100644 index 0000000..0471b34 --- /dev/null +++ b/src/minigen/syntax3/parser/State.java @@ -0,0 +1,17 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.parser; + +import java.util.ArrayList; + +final class State +{ + int state; + ArrayList nodes; + + State(@SuppressWarnings("hiding") int state, @SuppressWarnings("hiding") ArrayList nodes) + { + this.state = state; + this.nodes = nodes; + } +} diff --git a/src/minigen/syntax3/parser/TokenIndex.java b/src/minigen/syntax3/parser/TokenIndex.java new file mode 100644 index 0000000..d7bc986 --- /dev/null +++ b/src/minigen/syntax3/parser/TokenIndex.java @@ -0,0 +1,71 @@ +/* This file was generated by SableCC (http://www.sablecc.org/). */ + +package minigen.syntax3.parser; + +import minigen.syntax3.node.*; +import minigen.syntax3.analysis.*; + +class TokenIndex extends AnalysisAdapter +{ + int index; + + @Override + public void caseTComma(@SuppressWarnings("unused") TComma node) + { + this.index = 0; + } + + @Override + public void caseTLb(@SuppressWarnings("unused") TLb node) + { + this.index = 1; + } + + @Override + public void caseTRb(@SuppressWarnings("unused") TRb node) + { + this.index = 2; + } + + @Override + public void caseTKend(@SuppressWarnings("unused") TKend node) + { + this.index = 3; + } + + @Override + public void caseTKisa(@SuppressWarnings("unused") TKisa node) + { + this.index = 4; + } + + @Override + public void caseTKclass(@SuppressWarnings("unused") TKclass node) + { + this.index = 5; + } + + @Override + public void caseTKsuper(@SuppressWarnings("unused") TKsuper node) + { + this.index = 6; + } + + @Override + public void caseTKnew(@SuppressWarnings("unused") TKnew node) + { + this.index = 7; + } + + @Override + public void caseTName(@SuppressWarnings("unused") TName node) + { + this.index = 8; + } + + @Override + public void caseEOF(@SuppressWarnings("unused") EOF node) + { + this.index = 9; + } +} diff --git a/src/minigen/syntax3/parser/parser.dat b/src/minigen/syntax3/parser/parser.dat new file mode 100644 index 0000000000000000000000000000000000000000..7e7e97e01c6792140d543d0e7ba6a0d031a4105a GIT binary patch literal 2976 zcma);TTc{05QS@Dz2F58chpCH^#>Rq2oOV}#E2&Tdp+OmoZZ@qjoYN? zs_D~Jr>d(PBH~>{O#ji)+>!bg*8VNo#yR*RE@dGm^ZIy<_+k z`+5fpkG_P__)OSUeapOw`#;`b$iuwR`za@Qfnm%`;L5llIoW6t7d7X6$S?crC64Di zSaK*~R}vNu#4cgi5*8d>jlC*8bD(~iFZ_+YCfzl}&n0XL13smk7qn(v<^u0IiANCJhyJ@-oAUrXLf{2p-sI1}C>?hLd2P$zQ%gAK;(x$e}*-^tB7 z{H+t4-du_O_#NN%dpCZ@K^(@H*jDvw*$P$mc#c>oV9Y*ex>~?y_WP>Q-Y|os_|??) zhrUE?6!(wnFnRV%MQ_J(DA&Zh==)MXjPs=XN=WkH)hMlxd&<34K9f3J9iL9b+5{2) z)mx)%7boyALN8B%Hp^PrK{pKkPgOyhzu&yqynzhfKi)0|GxxtI;chcC_>S0S=Kjw} xc=LGISm)j29Yy?hNFDw!!aneb{j&$bAN#=Ycbu8G2Vr=h@s4Xu_RanV{}