/**
   * 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;
  }
Exemple #2
0
 /**
  * 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;
   }
 }
Exemple #3
0
 /** BEGIN Bonus Aufgabe 5: Zugriffsschutz */
 void contextAnalysisForMember(Declarations declarations) throws CompileException {
   contextAnalysisForMember(declarations, null);
 }