/** * Die Methode führt die Kontextanalyse für diesen Ausdruck durch. * * @param declarations Die an dieser Stelle gültigen Deklarationen. * @return Dieser Ausdruck. * @throws CompileException Während der Kontextanylyse wurde ein Fehler gefunden. */ Expression contextAnalysis(Declarations declarations) throws CompileException { leftOperand = leftOperand.contextAnalysis(declarations); // Dereferenzieren. Außerdem könnte man einen Ausdruck wie z.B. 5.print // schreiben, wenn Integer Methoden hätte. leftOperand = leftOperand.box(declarations); /** BEGIN Aufgabe (i): Vererbung */ rightOperand.dynamicBind = leftOperand.bindsDynamically(); /** END Aufgabe (i) */ // Der rechte Operand hat einen Deklarationsraum, der sich aus dem // Ergebnistyp des linken Operanden ergibt. /** BEGIN Bonus Aufgabe 5: Zugriffsscutz */ // rightOperand.contextAnalysisForMember(leftOperand.type.declarations); rightOperand.contextAnalysisForMember(leftOperand.type.declarations, declarations.currentClass); /** END Bonus Aufgabe 5 */ /** BEGIN Aufgabe (f): Methoden Parameter */ rightOperand.contextAnalysisForParameters(declarations); /** END Aufgabe (f) */ // Der Typ dieses Ausdrucks ist immer der des rechten Operanden. type = rightOperand.type; lValue = rightOperand.lValue; return this; }
/** * Die Methode führt die Kontextanalyse für diesen Ausdruck durch. Dabei wird ein Zugriff über * SELF in den Syntaxbaum eingefügt, wenn dieser Ausdruck ein Attribut oder eine Methode * bezeichnet. Diese Methode wird niemals für Ausdrücke aufgerufen, die rechts vom * Objekt-Zugriffsoperator stehen. * * @param declarations Die an dieser Stelle gültigen Deklarationen. * @return Dieser Ausdruck oder ein neuer Ausdruck, falls ein Boxing oder der Zugriff über SELF * eingefügt wurde. * @throws CompileException Während der Kontextanylyse wurde ein Fehler gefunden. */ Expression contextAnalysis(Declarations declarations) throws CompileException { contextAnalysisForMember(declarations); if (identifier.declaration instanceof MethodDeclaration || identifier.declaration instanceof VarDeclaration && ((VarDeclaration) identifier.declaration).isAttribute) { AccessExpression a = new AccessExpression(new VarOrCall(new ResolvableIdentifier("_self", position)), this); a.leftOperand = a.leftOperand.contextAnalysis(declarations); a.leftOperand = a.leftOperand.box(declarations); a.type = type; a.lValue = lValue; /** BEGIN Ausgabe (f): Methoden Parameter */ contextAnalysisForParameters(declarations); /** END Aufgabe (f) */ return a; } else { return this; } }
/** BEGIN Bonus Aufgabe 5: Zugriffsschutz */ void contextAnalysisForMember(Declarations declarations) throws CompileException { contextAnalysisForMember(declarations, null); }