2014-02-04 16:44:03 +00:00
|
|
|
|
%{
|
2015-04-22 19:40:22 +00:00
|
|
|
|
import de.dhbwstuttgart.typeinference.Menge;
|
2014-02-04 16:44:03 +00:00
|
|
|
|
class JavaParser{
|
2015-04-22 19:40:22 +00:00
|
|
|
|
public Menge path = new Menge();
|
2014-02-04 16:44:03 +00:00
|
|
|
|
%}
|
|
|
|
|
|
|
|
|
|
%token <Token> ABSTRACT
|
|
|
|
|
%token <Token> BOOLEAN
|
|
|
|
|
%token BREAK
|
|
|
|
|
%token CASE
|
|
|
|
|
%token CATCH
|
|
|
|
|
%token <Token> CHAR
|
|
|
|
|
%token CLASS
|
|
|
|
|
%token CONTINUE
|
|
|
|
|
%token DEFAULT
|
|
|
|
|
%token DO
|
|
|
|
|
%token ELSE
|
|
|
|
|
%token <Token> EXTENDS
|
|
|
|
|
%token FINALLY
|
|
|
|
|
%token FOR
|
|
|
|
|
%token IF
|
|
|
|
|
%token <Token> INSTANCEOF
|
|
|
|
|
%token <Token> INT
|
|
|
|
|
%token <Token> NEW
|
|
|
|
|
%token <Token> PRIVATE
|
|
|
|
|
%token <Token> PROTECTED
|
|
|
|
|
%token <Token> PUBLIC
|
|
|
|
|
%token RETURN
|
|
|
|
|
%token <Token> STATIC
|
|
|
|
|
%token SUPER
|
|
|
|
|
%token SWITCH
|
|
|
|
|
%token <Token> THIS
|
|
|
|
|
%token THROW
|
|
|
|
|
%token <Token> THROWS
|
|
|
|
|
%token TRY
|
|
|
|
|
%token <Token> VOID
|
|
|
|
|
%token WHILE
|
|
|
|
|
%token <Token> INTLITERAL
|
|
|
|
|
%token <Token> BOOLLITERAL
|
|
|
|
|
%token JNULL
|
|
|
|
|
%token <Token> CHARLITERAL
|
|
|
|
|
%token <Token> STRINGLITERAL
|
|
|
|
|
%token <Token> IDENTIFIER
|
|
|
|
|
%token EQUAL
|
|
|
|
|
%token LESSEQUAL
|
|
|
|
|
%token GREATEREQUAL
|
|
|
|
|
%token NOTEQUAL
|
|
|
|
|
%token LOGICALOR
|
|
|
|
|
%token LOGICALAND
|
|
|
|
|
%token <Token> INCREMENT
|
|
|
|
|
%token <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 <Class> classdeclaration
|
|
|
|
|
%type <ClassBody> classbody
|
|
|
|
|
%type <InstVarDecl> fielddeclaration
|
|
|
|
|
%type <Method> methodheader
|
|
|
|
|
%type <Method> methoddeclaration
|
|
|
|
|
%type <Method> methoddeclarator
|
|
|
|
|
%type <ClassBody> classbodydeclarations
|
|
|
|
|
%type <FieldDecl> classbodydeclaration
|
|
|
|
|
%type <FieldDecl> classmemberdeclaration
|
|
|
|
|
%type <InstVarDecl> variabledeclarators
|
|
|
|
|
%type <DeclId> variabledeclarator
|
|
|
|
|
%type <DeclId> variabledeclaratorid
|
|
|
|
|
%type <UsedId> simplename
|
|
|
|
|
%type <UsedId> qualifiedname
|
|
|
|
|
%type <UsedId> name
|
|
|
|
|
%type <UsedId> super
|
|
|
|
|
%type <UsedId> classtype
|
|
|
|
|
%type <UsedId> classorinterfacetype
|
|
|
|
|
%type <BaseType> integraltype
|
|
|
|
|
%type <BaseType> numerictype
|
|
|
|
|
%type <BaseType> primitivetype
|
|
|
|
|
%type <RefType> referencetype
|
|
|
|
|
%type <RefType> classtypelist
|
|
|
|
|
%type <Type > type
|
|
|
|
|
%type <Modifiers> modifiers
|
|
|
|
|
%type <Modifier> modifier
|
|
|
|
|
%type <Block> block
|
|
|
|
|
%type <Block> methodbody
|
|
|
|
|
%type <Block> blockstatements
|
|
|
|
|
%type <LocalVarDecl> localvariabledeclarationstatement
|
|
|
|
|
%type <LocalVarDecl> localvariabledeclaration
|
|
|
|
|
%type <ExceptionList> throws
|
|
|
|
|
%type <FormalParameter> formalparameter
|
|
|
|
|
%type <ParameterList> formalparameterlist
|
|
|
|
|
%type <Literal> literal
|
|
|
|
|
%type <Expr> primarynonewarray
|
|
|
|
|
%type <Expr> primary
|
|
|
|
|
%type <Expr> postfixexpression
|
|
|
|
|
%type <Expr> unaryexpressionnotplusminus
|
|
|
|
|
%type <Expr> unaryexpression
|
|
|
|
|
%type <Expr> multiplicativeexpression
|
|
|
|
|
%type <Expr> additiveexpression
|
|
|
|
|
%type <Expr> shiftexpression
|
|
|
|
|
%type <Expr> relationalexpression
|
|
|
|
|
%type <Expr> equalityexpression
|
|
|
|
|
%type <Expr> andexpression
|
|
|
|
|
%type <Expr> exclusiveorexpression
|
|
|
|
|
%type <Expr> inclusiveorexpression
|
|
|
|
|
%type <Expr> conditionalandexpression
|
|
|
|
|
%type <Expr> conditionalorexpression
|
|
|
|
|
%type <Expr> conditionalexpression
|
|
|
|
|
%type <Expr> assignmentexpression
|
|
|
|
|
%type <Expr> expression
|
|
|
|
|
%type <Expr> statementexpression
|
|
|
|
|
%type <Expr> preincrementexpression
|
|
|
|
|
%type <Expr> predecrementexpression
|
|
|
|
|
%type <Expr> postincrementexpression
|
|
|
|
|
%type <Expr> postdecrementexpression
|
|
|
|
|
%type <ExprStmt> expressionstatement
|
|
|
|
|
%type <ExprStmt> variableinitializer
|
|
|
|
|
%type <Statement> statementwithouttrailingsubstatement
|
|
|
|
|
%type <Statement> blockstatement
|
|
|
|
|
%type <Statement> statement
|
|
|
|
|
%type <Statement> statementnoshortif
|
|
|
|
|
%type <WhileStmt> whilestatement
|
|
|
|
|
%type <WhileStmt> whilestatementnoshortif
|
|
|
|
|
%type <IfStmt> ifthenstatement
|
|
|
|
|
%type <IfStmt> ifthenelsestatement
|
|
|
|
|
%type <IfStmt> ifthenelsestatementnoshortif
|
|
|
|
|
%type <EmptyStmt> emptystatement
|
|
|
|
|
%type <Return> returnstatement
|
|
|
|
|
%type <NewClass> classinstancecreationexpression
|
|
|
|
|
%type <SourceFile> compilationunit
|
|
|
|
|
%type <SourceFile> typedeclarations
|
|
|
|
|
%type <Assign> assignment
|
|
|
|
|
%type <Operator> assignmentoperator
|
|
|
|
|
%type <UsedId> lefthandside
|
|
|
|
|
%type <ArgumentList> argumentlist
|
|
|
|
|
%type <MethodCall> methodinvocation
|
|
|
|
|
%type <Class> typedeclaration
|
|
|
|
|
%type <FieldDecl> constructordeclaration
|
|
|
|
|
%type <Constructor> constructordeclarator
|
|
|
|
|
%type <Block> constructorbody
|
|
|
|
|
%type <Statement> explicitconstructorinvocation
|
|
|
|
|
%type <Method> staticinitializer
|
|
|
|
|
%type <CastExpr> castexpression
|
|
|
|
|
%type <ParaList> 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 */
|
2015-04-22 19:40:22 +00:00
|
|
|
|
((UsedId)$1).vParaOrg = new Menge( $3.get_ParaList() );
|
2014-02-04 16:44:03 +00:00
|
|
|
|
|
|
|
|
|
$$ = $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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
%%
|