%{ import de.dhbwstuttgart.typeinference.Menge; class JavaParser{ public Menge path = new Menge(); %} %token ABSTRACT %token BOOLEAN %token BREAK %token CASE %token CATCH %token CHAR %token CLASS %token CONTINUE %token DEFAULT %token DO %token ELSE %token EXTENDS %token FINALLY %token FOR %token IF %token INSTANCEOF %token INT %token NEW %token PRIVATE %token PROTECTED %token PUBLIC %token RETURN %token STATIC %token SUPER %token SWITCH %token THIS %token THROW %token THROWS %token TRY %token VOID %token WHILE %token INTLITERAL %token BOOLLITERAL %token JNULL %token CHARLITERAL %token STRINGLITERAL %token IDENTIFIER %token EQUAL %token LESSEQUAL %token GREATEREQUAL %token NOTEQUAL %token LOGICALOR %token LOGICALAND %token INCREMENT %token DECREMENT %token SHIFTLEFT %token SHIFTRIGHT %token UNSIGNEDSHIFTRIGHT %token SIGNEDSHIFTRIGHT %token PLUSEQUAL %token MINUSEQUAL %token TIMESEQUAL %token DIVIDEEQUAL %token ANDEQUAL %token OREQUAL %token XOREQUAL %token MODULOEQUAL %token SHIFTLEFTEQUAL %token SIGNEDSHIFTRIGHTEQUAL %token UNSIGNEDSHIFTRIGHTEQUAL %token BRACE %token RELOP %token OP %token EOF %type classdeclaration %type classbody %type fielddeclaration %type methodheader %type methoddeclaration %type methoddeclarator %type classbodydeclarations %type classbodydeclaration %type classmemberdeclaration %type variabledeclarators %type variabledeclarator %type variabledeclaratorid %type simplename %type qualifiedname %type name %type super %type classtype %type classorinterfacetype %type integraltype %type numerictype %type primitivetype %type referencetype %type classtypelist %type type %type modifiers %type modifier %type block %type methodbody %type blockstatements %type localvariabledeclarationstatement %type localvariabledeclaration %type throws %type formalparameter %type formalparameterlist %type literal %type primarynonewarray %type primary %type postfixexpression %type unaryexpressionnotplusminus %type unaryexpression %type multiplicativeexpression %type additiveexpression %type shiftexpression %type relationalexpression %type equalityexpression %type andexpression %type exclusiveorexpression %type inclusiveorexpression %type conditionalandexpression %type conditionalorexpression %type conditionalexpression %type assignmentexpression %type expression %type statementexpression %type preincrementexpression %type predecrementexpression %type postincrementexpression %type postdecrementexpression %type expressionstatement %type variableinitializer %type statementwithouttrailingsubstatement %type blockstatement %type statement %type statementnoshortif %type whilestatement %type whilestatementnoshortif %type ifthenstatement %type ifthenelsestatement %type ifthenelsestatementnoshortif %type emptystatement %type returnstatement %type classinstancecreationexpression %type compilationunit %type typedeclarations %type assignment %type assignmentoperator %type lefthandside %type argumentlist %type methodinvocation %type typedeclaration %type constructordeclaration %type constructordeclarator %type constructorbody %type explicitconstructorinvocation %type staticinitializer %type castexpression %type paralist %left ',' %% compilationunit :typedeclarations { $$=$1; } typedeclarations :typedeclaration { SourceFile Scfile = new SourceFile(); Scfile.set_Class($1); $$=Scfile; } |typedeclarations typedeclaration { $1.set_Class($2); $$=$1; } name :qualifiedname { $$=$1; } |simplename { $$=$1; } typedeclaration :classdeclaration { $$=$1; } qualifiedname : name '.' IDENTIFIER { $1.set_Name($3.getLexem()); $$=$1; } simplename : IDENTIFIER { UsedId UI = new UsedId(); UI.set_Name( $1.getLexem() ); $$ = UI; } classdeclaration : CLASS IDENTIFIER classbody { MyCompiler.Debug("P->Neue Klasse: " + $2.getLexem(), 3); Class C = new Class(); ClassDeclId CDI = new ClassDeclId(); CDI.set_classname( $2.getLexem() ); C.set_ClassDeclId( CDI ); C.set_ClassBody($3); $$ = C; } | modifiers CLASS IDENTIFIER classbody { Class Cmod = new Class(); ClassDeclId CDImod = new ClassDeclId(); CDImod.set_Modifiers($1); CDImod.set_classname($3.getLexem()); Cmod.set_ClassDeclId(CDImod); Cmod.set_ClassBody($4); $$ = Cmod; } | CLASS IDENTIFIER super classbody { Class Csup = new Class(); ClassDeclId CDIsup = new ClassDeclId(); CDIsup.set_classname($2.getLexem()); Csup.set_ClassDeclId(CDIsup); Csup.set_UsedId($3); Csup.set_ClassBody($4); $$ = Csup; } |modifiers CLASS IDENTIFIER super classbody { Class Cmodsup = new Class(); ClassDeclId CDImodsup = new ClassDeclId(); CDImodsup.set_Modifiers($1); CDImodsup.set_classname($3.getLexem()); Cmodsup.set_ClassDeclId(CDImodsup); Cmodsup.set_UsedId($4); Cmodsup.set_ClassBody($5); $$ = Cmodsup; } | modifiers CLASS IDENTIFIER '<'paralist'>'classbody { Class Cmod = new Class(); ClassDeclId CDImod = new ClassDeclId(); CDImod.set_Modifiers($1); CDImod.set_classname($3.getLexem()); Cmod.set_ClassDeclId(CDImod); Cmod.set_ParaList($5.get_ParaList()); Cmod.set_ClassBody($7); $$ = Cmod; } |CLASS IDENTIFIER '<' paralist '>'classbody { Class C = new Class(); ClassDeclId CDI = new ClassDeclId(); CDI.set_classname($2.getLexem()); C.set_ClassDeclId(CDI); C.set_ClassBody($6); C.set_ParaList($4.get_ParaList()); $$ = C; } | CLASS IDENTIFIER '<' paralist '>'super classbody { MyCompiler.Debug( "Klassendefinition: Basisklassen-Parameter = " + $4.get_ParaList(), 3 ); MyCompiler.Debug( "Klassendefinition: Superklassen-Parameter = " + $6.get_ParaList(), 3 ); MyCompiler.Debug( "Klassendefinition: Superklassen-Parameter = " + $6.get_ParaList().hashCode(), 3 ); Class Csup = new Class(); ClassDeclId CDIsup = new ClassDeclId(); CDIsup.set_classname($2.getLexem()); Csup.set_ClassDeclId(CDIsup); Csup.set_ParaList($4.get_ParaList()); Csup.set_UsedId($6); Csup.set_ClassBody($7); $$ = Csup; } |modifiers CLASS IDENTIFIER '<'paralist'>'super classbody { Class Cmodsup = new Class(); ClassDeclId CDImodsup = new ClassDeclId(); CDImodsup.set_Modifiers($1); CDImodsup.set_classname($3.getLexem()); Cmodsup.set_ClassDeclId(CDImodsup); Cmodsup.set_ParaList($5.get_ParaList()); Cmodsup.set_UsedId($7); Cmodsup.set_ClassBody($8); $$ = Cmodsup; } paralist : IDENTIFIER { ParaList pl = new ParaList(); pl.paralist.addElement( new TyploseVariable($1.getLexem()) ); MyCompiler.Debug( "IDENTIFIER --> Paralist für " + $1.getLexem() + " TV", 3 ); $$ = pl; } | IDENTIFIER '<' paralist '>' { ParaList pl = new ParaList(); RefType t = new RefType( $1.getLexem() ); t.set_ParaList( $3.get_ParaList() ); pl.paralist.addElement(t); MyCompiler.Debug( "IDENTIFIER '<' paralist '>' --> Paralist für " + $1.getLexem() + ": RefType", 3 ); $$ = pl; } | paralist ',' IDENTIFIER { $1.paralist.addElement(new TyploseVariable($3.getLexem())); MyCompiler.Debug( "paralist ',' IDENTIFIER --> Paralist für " + $3.getLexem() + ": TV", 3 ); MyCompiler.Debug( "paralist: " + $1.paralist, 3 ); $$=$1; } | paralist ',' IDENTIFIER '<' paralist '>' { RefType t = new RefType( $3.getLexem() ); t.set_ParaList( $5.get_ParaList() ); $1.paralist.addElement(t); MyCompiler.Debug( "paralist ',' IDENTIFIER '<' paralist '>' --> Paralist für " + $3.getLexem() + ": RefType", 3 ); $$=$1; } classbody : '{' '}' { ClassBody CB = new ClassBody(); $$ = CB; } | '{'classbodydeclarations '}' { $$ = $2; } modifiers :modifier { Modifiers Mod = new Modifiers(); Mod.modifier.addElement($1); $$ = Mod; } |modifiers modifier { $1.modifier.addElement($2); $$ = $1; } super :EXTENDS classtype { $$ = $2; } classbodydeclarations : classbodydeclaration { ClassBody CB = new ClassBody(); CB.set_FieldDecl( $1 ); $$=CB; } | classbodydeclarations classbodydeclaration { $1.set_FieldDecl($2); $$ = $1; } modifier : PUBLIC { Public Pub = new Public(); $$=Pub; } | PROTECTED { Protected Pro = new Protected(); $$=Pro; } | PRIVATE { Private Pri = new Private(); $$=Pri; } | STATIC { Static Sta = new Static(); $$=Sta; } | ABSTRACT { Abstract Abs = new Abstract(); $$=Abs; } classtype : classorinterfacetype { $$ = $1; } | classorinterfacetype '<'paralist'>' { $1.set_ParaList($3.get_ParaList()); /* otth: originale (also diese) Parameterliste retten */ ((UsedId)$1).vParaOrg = new Menge( $3.get_ParaList() ); $$ = $1; } classbodydeclaration : classmemberdeclaration { $$=$1; } | staticinitializer { $$=$1; } | constructordeclaration { $$=$1; } classorinterfacetype : name { $$=$1; } classmemberdeclaration : fielddeclaration { $$=$1; } | methoddeclaration { $$=$1; } staticinitializer : STATIC block { Method STAT = new Method(); DeclId DST = new DeclId(); DST.set_Name($1.getLexem()); STAT.set_DeclId(DST); Static ST = new Static(); Modifiers MOD = new Modifiers(); MOD.modifier.addElement(ST); STAT.set_Modifiers(MOD); STAT.set_Block($2); $$=STAT; } constructordeclaration : constructordeclarator constructorbody { $1.set_Block($2); $$ = $1; } | modifiers constructordeclarator constructorbody { $2.set_Block($3); $2.set_Modifiers($1); $$ = $2; } fielddeclaration : type variabledeclarators ';' { MyCompiler.Debug("T->Parser->fielddeclaration ...: type " + $1, 5); $2.set_Type($1); $$ = $2; } | modifiers type variabledeclarators ';' { $3.set_Type($2); for(int i=0;i<($3.declid.size());i++) { $3.declid.setElementAt((((DeclId)($3.declid.elementAt(i))).modifiers=$1),i); } $$ = $3; } methoddeclaration : methodheader methodbody { $1.set_Block($2); $$=$1; } block : '{' '}' { Block Bl = new Block(); $$=Bl; } | '{' blockstatements '}' { $$=$2; } constructordeclarator : simplename '(' ')' { Constructor CON = new Constructor(); DeclId DIDCon = new DeclId(); DIDCon.set_Name($1.get_Name_1Element()); CON.set_DeclId(DIDCon); $$=CON; } | simplename '('formalparameterlist')' { Constructor CONpara = new Constructor(); DeclId DIconpara = new DeclId(); DIconpara.set_Name($1.get_Name_1Element()); CONpara.set_DeclId(DIconpara); CONpara.set_ParaList($3); $$=CONpara; } constructorbody : '{' '}' { Block CBL = new Block(); $$=CBL; } | '{' explicitconstructorinvocation '}' { Block CBLexpl = new Block(); CBLexpl.set_Statement($2); $$=CBLexpl; } | '{' blockstatements '}' { $$=$2; } | '{'explicitconstructorinvocation blockstatements '}' { Block CBes = new Block(); CBes.set_Statement($2); for(int j=0;j<$3.statements.size();j++) { CBes.set_Statement((Statement)$3.statements.elementAt(j)); } $$=CBes; } throws : THROWS classtypelist { ExceptionList EL = new ExceptionList(); EL.set_addElem($2); $$=EL; } methodheader : type methoddeclarator { $2.set_ReturnType($1); $$=$2; } | modifiers type methoddeclarator { $3.set_Modifiers($1); $3.set_ReturnType($2); $$=$3; } | type methoddeclarator throws { $2.set_ReturnType($1); $2.set_ExceptionList($3); $$=$2; } | modifiers type methoddeclarator throws { $3.set_Modifiers($1); $3.set_ReturnType($2); $3.set_ExceptionList($4); $$=$3; } | VOID methoddeclarator { Type Voit = new Type(); Voit.set_Type($1.getLexem()); $2.set_ReturnType(Voit); $$=$2; } | modifiers VOID methoddeclarator { Type voit = new Type(); voit.set_Type($2.getLexem()); $3.set_Modifiers($1); $3.set_ReturnType(voit); $$=$3; } | VOID methoddeclarator throws { Type voyt = new Type(); voyt.set_Type($1.getLexem()); $2.set_ReturnType(voyt); $2.set_ExceptionList($3); $$=$2; } | modifiers VOID methoddeclarator throws { Type voyd = new Type(); voyd.set_Type($2.getLexem()); $3.set_Modifiers($1); $3.set_ReturnType(voyd); $3.set_ExceptionList($4); $$=$3; } type : primitivetype { $$=$1; } |referencetype { $$=$1; } variabledeclarators : variabledeclarator { InstVarDecl IVD = new InstVarDecl(); IVD.declid.addElement( $1 ); $$ = IVD; } | variabledeclarators ',' variabledeclarator { $1.declid.addElement($3); $$=$1; } methodbody : block { $$=$1; } blockstatements : blockstatement { Block Blstat = new Block(); Blstat.set_Statement($1); $$=Blstat; } | blockstatements blockstatement { $1.set_Statement($2); $$=$1; } formalparameterlist :formalparameter { ParameterList PL = new ParameterList(); PL.set_AddParameter($1); $$ = PL; } |formalparameterlist ',' formalparameter { $1.set_AddParameter($3); $$ = $1; } explicitconstructorinvocation : THIS '(' ')' ';' { This THCON = new This(); $$=THCON; } |THIS '(' argumentlist ')' ';' { This THCONargl = new This(); THCONargl.set_ArgumentList($3); $$=THCONargl; } // |SUPER '(' ')' ';' // |SUPER '(' argumentlist ')' ';' classtypelist : classtype { RefType RT = new RefType(); RT.set_UsedId($1); RT.set_Type(RT.used.get_Name_1Element()); $$=RT; } | classtypelist ',' classtype { $1.set_UsedId($3); $1.set_Type($1.used.get_Name_1Element()); $$=$1; } methoddeclarator :IDENTIFIER '(' ')' { Method met = new Method(); DeclId DImethod = new DeclId(); DImethod.set_Name($1.getLexem()); met.set_DeclId(DImethod); $$ = met; } |IDENTIFIER '(' formalparameterlist ')' { Method met_para = new Method(); DeclId Dimet_para = new DeclId(); Dimet_para.set_Name($1.getLexem()); met_para.set_DeclId(Dimet_para); met_para.set_ParaList($3); $$ = met_para; } primitivetype :BOOLEAN { BooleanType BT = new BooleanType(); BT.set_Type($1.getLexem()); $$=BT; } |numerictype { $$=$1; } referencetype :classorinterfacetype { MyCompiler.Debug("T->Parser->referenctype: " + $1, 5); RefType RT = new RefType(); RT.set_UsedId($1); RT.set_Type(RT.used.get_Name_1Element()); $$=RT; } variabledeclarator : variabledeclaratorid { $$=$1; } | variabledeclaratorid '=' variableinitializer { $1.set_Wert($3); $$=$1; } | '<' paralist'>' variabledeclaratorid '=' variableinitializer { $4.set_Wert($6); $4.set_Paratyp($2.get_ParaList()); $$=$4; } blockstatement :localvariabledeclarationstatement { $$=$1; } |statement { $$=$1; } funtype : funtypeortype '(' funtypelist ')' { } funtypelist : funtypeortype { } | funtypelist ',' funtypeortype { } funtypeortype : funtype { } | type { $$=$1; } formalparameter : funtype variabledeclaratorid { FormalParameter FP = new FormalParameter(); FP.set_Type($1); FP.set_DeclId($2); $$=FP; } /* otth: Methodenargumente koennen hiermit auch polymorph sein. */ | funtype '<'paralist'>' variabledeclaratorid { /* Parameterliste setzen */ $5.set_Paratyp($3.get_ParaList()); FormalParameter FP = new FormalParameter(); FP.set_Type($1); FP.set_DeclId($5); $$=FP; MyCompiler.Debug("P->Polymorphes Methodenargument hinzugefuegt: Name = " + $5.get_Name() + " Typ = " + $1.get_Type(), 3); } argumentlist : expression { ArgumentList AL = new ArgumentList(); AL.expr.addElement($1); $$=AL; } |argumentlist ',' expression { $1.expr.addElement($3); $$=$1; } numerictype :integraltype { $$=$1; } variabledeclaratorid :IDENTIFIER { DeclId DI = new DeclId(); DI.set_Name($1.getLexem()); $$=DI; } variableinitializer :expression { $$=$1; } localvariabledeclarationstatement :localvariabledeclaration ';' { $$=$1; } statement :statementwithouttrailingsubstatement { $$=$1; } |ifthenstatement { $$=$1; } |ifthenelsestatement { $$=$1; } |whilestatement { $$=$1; } expression :assignmentexpression { $$=$1; } |classinstancecreationexpression { $$=$1; } integraltype :INT { IntegerType IT = new IntegerType(); IT.set_Type($1.getLexem()); $$=IT; } | CHAR { CharacterType CT = new CharacterType(); CT.set_Type($1.getLexem()); $$=CT; } localvariabledeclaration : type variabledeclarators { MyCompiler.Debug("P -> Lokale Variable angelegt!", 3); LocalVarDecl LVD = new LocalVarDecl(); LVD.set_Type($1); LVD.declid=$2.declid; $$ = LVD; } statementwithouttrailingsubstatement : block { $$=$1; } | emptystatement { $$=$1; } | expressionstatement { $$=$1; } | returnstatement { $$=$1; } ifthenstatement : IF '(' expression ')' statement { IfStmt Ifst = new IfStmt(); Ifst.set_Expr($3); Ifst.set_Then_block($5); $$=Ifst; } ifthenelsestatement : IF '('expression ')'statementnoshortif ELSE statement { IfStmt IfstElst = new IfStmt(); IfstElst.set_Expr($3); IfstElst.set_Then_block($5); IfstElst.set_Else_block($7); $$=IfstElst; } whilestatement : WHILE '(' expression ')' statement { WhileStmt Whlst = new WhileStmt(); Whlst.set_Expr($3); Whlst.set_Loop_block($5); $$=Whlst; } assignmentexpression : conditionalexpression { $$=$1; } | assignment { $$=$1; } emptystatement : ';' { EmptyStmt Empst = new EmptyStmt(); $$=Empst; } expressionstatement : statementexpression ';' { $$=$1; } returnstatement : RETURN ';' { Return ret = new Return(); $$= ret; } | RETURN expression ';' { Return retexp = new Return(); retexp.set_ReturnExpr($2); $$=retexp; } statementnoshortif :statementwithouttrailingsubstatement { $$=$1; } | ifthenelsestatementnoshortif { $$=$1; } | whilestatementnoshortif { $$=$1; } conditionalexpression :conditionalorexpression { $$=$1; } // | conditionalorexpression '?' expression ':' conditionalexpression assignment :lefthandside assignmentoperator assignmentexpression { MyCompiler.Debug("\nParser --> Zuweisung1!\n", 3); Assign Ass = new Assign(); LocalOrFieldVar LOFV = new LocalOrFieldVar(); LOFV.set_UsedId($1); if( $2 == null ) { MyCompiler.Debug("\nParser --> Zuweisung1 --> " + $3 + " \n", 3); Ass.set_Expr( LOFV,$3 ); } else { Binary Bin = new Binary(); Bin.set_Expr1(LOFV); Bin.set_Operator($2); Bin.set_Expr2($3); MyCompiler.Debug("\nParser --> Zuweisung1 --> Binary\n", 3); Ass.set_Expr( LOFV, Bin ); } $$=Ass; } | lefthandside assignmentoperator classinstancecreationexpression { Assign Ass =new Assign(); LocalOrFieldVar LOFV = new LocalOrFieldVar(); LOFV.set_UsedId($1); if($2==null) { Ass.set_Expr(LOFV,$3); } else { Binary Bin = new Binary(); Bin.set_Expr1(LOFV); Bin.set_Operator($2); Bin.set_Expr2($3); Ass.set_Expr(LOFV,Bin); } $$=Ass; } statementexpression :assignment { $$=$1; } | preincrementexpression { $$=$1; } | predecrementexpression { $$=$1; } | postincrementexpression { $$=$1; } | postdecrementexpression { $$=$1; } | methodinvocation { $$=$1; } /* | classinstancecreationexpression { $$=$1; } */ ifthenelsestatementnoshortif :IF '(' expression ')' statementnoshortif ELSE statementnoshortif { IfStmt IfElno = new IfStmt(); IfElno.set_Expr($3); IfElno.set_Then_block($5); IfElno.set_Else_block($7); $$=IfElno; } whilestatementnoshortif :WHILE '(' expression ')' statementnoshortif { WhileStmt Whstno = new WhileStmt(); Whstno.set_Expr($3); Whstno.set_Loop_block($5); $$=Whstno; } conditionalorexpression : conditionalandexpression { $$=$1; } | conditionalorexpression LOGICALOR conditionalandexpression { Binary LogOr = new Binary(); OrOp OrO = new OrOp(); LogOr.set_Expr1($1); LogOr.set_Expr2($3); LogOr.set_Operator(OrO); $$=LogOr; } lefthandside :name { $$=$1; } assignmentoperator : '=' { $$=null; } | TIMESEQUAL { TimesOp TEO = new TimesOp(); $$=TEO; } | DIVIDEEQUAL { DivideOp DEO = new DivideOp(); $$=DEO; } | MODULOEQUAL { ModuloOp MEO = new ModuloOp(); $$=MEO; } | PLUSEQUAL { PlusOp PEO = new PlusOp(); $$=PEO; } | MINUSEQUAL { MinusOp MEO = new MinusOp(); $$=MEO; } // | SHIFTLEFTEQUAL // | SIGNEDSHIFTRIGHTEQUAL // | UNSIGNEDSHIFTRIGHTEQUAL // | ANDEQUAL // | XOREQUAL // | OREQUAL preincrementexpression :INCREMENT unaryexpression { PreIncExpr PRINC = new PreIncExpr(); PRINC.set_Expr($2); $$=PRINC; } predecrementexpression :DECREMENT unaryexpression { PreDecExpr PRDEC = new PreDecExpr(); PRDEC.set_Expr($2); $$=PRDEC; } postincrementexpression :postfixexpression INCREMENT { PostIncExpr PIE = new PostIncExpr(); PIE.set_Expr($1); $$=PIE; } postdecrementexpression :postfixexpression DECREMENT { PostDecExpr PDE = new PostDecExpr(); PDE.set_Expr($1); $$=PDE; } methodinvocation :name '(' ')' { MethodCall MC = new MethodCall(); MC.set_UsedId($1); $$=MC; } | name '('argumentlist')' { MethodCall MCarg = new MethodCall(); MCarg.set_UsedId($1); MCarg.set_ArgumentList($3); $$=MCarg; } | primary '.' IDENTIFIER '(' ')' { MethodCall MCpr = new MethodCall(); $1.usedid.set_Name($3.getLexem()); MCpr.set_UsedId($1.get_UsedId()); $$=MCpr; } | primary '.' IDENTIFIER '('argumentlist ')' { MethodCall MCPA = new MethodCall(); $1.usedid.set_Name($3.getLexem()); MCPA.set_UsedId($1.get_UsedId()); MCPA.set_ArgumentList($5); $$=MCPA; } // | SUPER '.' IDENTIFIER '(' ')' // | SUPER '.' IDENTIFIER '('argumentlist')' classinstancecreationexpression : NEW classtype '(' ')' { NewClass NC = new NewClass(); NC.set_UsedId($2); $$=NC; } | NEW classtype '(' argumentlist ')' { NewClass NCarg = new NewClass(); NCarg.set_UsedId($2); NCarg.set_ArgumentList($4); $$=NCarg; } conditionalandexpression : inclusiveorexpression { $$=$1; } | conditionalandexpression LOGICALAND inclusiveorexpression { Binary And = new Binary(); AndOp AndO = new AndOp(); And.set_Expr1($1); And.set_Expr2($3); And.set_Operator(AndO); $$=And; } /* fieldaccess :primary '.' IDENTIFIER | SUPER '.' IDENTIFIER */ unaryexpression : preincrementexpression { $$=$1; } | predecrementexpression { $$=$1; } | '+' unaryexpression { PositivExpr POSEX=new PositivExpr(); UnaryPlus UP= new UnaryPlus(); POSEX.set_UnaryPlus(UP); POSEX.set_Expr($2); $$=POSEX; } | '-' unaryexpression { NegativeExpr NEGEX=new NegativeExpr(); UnaryMinus UM=new UnaryMinus(); NEGEX.set_UnaryMinus(UM); NEGEX.set_Expr($2); $$=NEGEX; } | unaryexpressionnotplusminus { $$=$1; } postfixexpression :primary { $$=$1; } | name { LocalOrFieldVar Postincexpr = new LocalOrFieldVar(); Postincexpr.set_UsedId($1); $$=Postincexpr; } | postincrementexpression { $$=$1; } | postdecrementexpression { $$=$1; } primary : primarynonewarray { $$=$1; } inclusiveorexpression : exclusiveorexpression { $$=$1; } | inclusiveorexpression '|' exclusiveorexpression primarynonewarray : literal { $$=$1; } | THIS { This T = new This(); UsedId UT = new UsedId(); UT.set_Name($1.getLexem()); T.set_UsedId(UT); $$=T; } | '('expression')' { $$=$2; } /* | classinstancecreationexpression { $$=$1; } | fieldaccess */ | methodinvocation { $$=$1; } unaryexpressionnotplusminus : postfixexpression {$$=$1;} // | '~' unaryexpression | '!' unaryexpression {NotExpr NE=new NotExpr(); UnaryNot UN=new UnaryNot(); NE.set_UnaryNot(UN); NE.set_Expr($2); $$=NE; } | castexpression {$$=$1;} exclusiveorexpression :andexpression {$$=$1;} | exclusiveorexpression '^' andexpression //{ // //} literal : INTLITERAL {IntLiteral IL = new IntLiteral(); IL.set_Int($1.String2Int()); $$ = IL; } | BOOLLITERAL {BoolLiteral BL = new BoolLiteral(); BL.set_Bool($1.String2Bool()); $$ = BL; } | CHARLITERAL {CharLiteral CL = new CharLiteral(); CL.set_Char($1.CharInString()); $$=CL; } | STRINGLITERAL { StringLiteral ST = new StringLiteral(); ST.set_String($1.get_String()); $$=ST; } | JNULL; { Null NN = new Null(); $$=NN; } castexpression : '(' primitivetype ')' unaryexpression { CastExpr CaEx=new CastExpr(); CaEx.set_Type($2); CaEx.set_Expr($4); $$=CaEx; } //| '(' expression ')' unaryexpressionnotplusminus andexpression :equalityexpression { $$=$1; } | andexpression '&' equalityexpression { } equalityexpression : relationalexpression { $$=$1; } | equalityexpression EQUAL relationalexpression { Binary EQ = new Binary(); EqualOp EO = new EqualOp(); EQ.set_Expr1($1); EQ.set_Expr2($3); EQ.set_Operator(EO); $$=EQ; } | equalityexpression NOTEQUAL relationalexpression { Binary NEQ = new Binary(); NotEqualOp NEO = new NotEqualOp(); NEQ.set_Expr1($1); NEQ.set_Expr2($3); NEQ.set_Operator(NEO); $$=NEQ; } relationalexpression : shiftexpression { $$=$1; } | relationalexpression '<' shiftexpression { Binary LO = new Binary(); LessOp LOO = new LessOp(); LO.set_Expr1($1); LO.set_Expr2($3); LO.set_Operator(LOO); $$=LO; } | relationalexpression '>' shiftexpression { Binary GO = new Binary(); GreaterOp GOO = new GreaterOp(); GO.set_Expr1($1); GO.set_Expr2($3); GO.set_Operator( GOO ); $$=GO; } | relationalexpression LESSEQUAL shiftexpression { Binary LE = new Binary(); LessEquOp LEO = new LessEquOp(); LE.set_Expr1($1); LE.set_Expr2($3); LE.set_Operator(LEO); $$=LE; } | relationalexpression GREATEREQUAL shiftexpression { Binary GE = new Binary(); GreaterEquOp GEO = new GreaterEquOp(); GE.set_Expr1($1); GE.set_Expr2($3); GE.set_Operator(GEO); $$=GE; } | relationalexpression INSTANCEOF referencetype { InstanceOf ISO=new InstanceOf(); ISO.set_Expr($1); ISO.set_Type($3); $$=ISO; } shiftexpression : additiveexpression { $$=$1; } additiveexpression :multiplicativeexpression { $$=$1; } | additiveexpression '+' multiplicativeexpression { Binary AD = new Binary(); PlusOp PO = new PlusOp(); AD.set_Expr1($1); AD.set_Expr2($3); AD.set_Operator(PO); $$=AD; } | additiveexpression '-' multiplicativeexpression { Binary MI = new Binary(); MinusOp MO = new MinusOp(); MI.set_Expr1($1); MI.set_Expr2($3); MI.set_Operator(MO); $$=MI; } multiplicativeexpression : unaryexpression { $$=$1; } | multiplicativeexpression '*' unaryexpression { Binary ML = new Binary(); TimesOp TO = new TimesOp(); ML.set_Expr1($1); ML.set_Expr2($3); ML.set_Operator(TO); $$=ML; } | multiplicativeexpression '/' unaryexpression { Binary DV = new Binary(); DivideOp DO = new DivideOp(); DV.set_Expr1($1); DV.set_Expr2($3); DV.set_Operator(DO); $$ = DV; } | multiplicativeexpression '%' unaryexpression { Binary MD = new Binary(); ModuloOp MO = new ModuloOp(); MD.set_Expr1($1); MD.set_Expr2($3); MD.set_Operator(MO); $$ =MD; } /* OTTH: Methodenparametertypen müssen nicht mehr angegeben werden */ formalparameter : variabledeclaratorid { MyCompiler.Debug("\nFunktionsdeklaration mit typlosen Parametern: " + $1.name, 3); FormalParameter FP = new FormalParameter(); Type T = new TyploseVariable(""); /* otth: Name wird automatisch berechnet */ MyCompiler.Debug("\n--> berechneter Name: " + T.get_Type(), 3); FP.set_Type( T ); FP.set_DeclId($1); $$=FP; } %%