Geltungsbereiche

Top  Previous  Next

Beispiele > C-Typedef > Geltungsbereiche

 

Der dritte Parameter in dem eben erläuterten Aufruf

 

{{ AddToken(xState.str(), "TYPE", ScopeStr()); }}

 

wurde noch nicht erklärt. Mit diesem Parameter kann der Bereich festgelegt werden, innerhalb dessen, das zusätzliche Token erkannt wird. Wenn dieser optionale Parameter weggelassen wird, gilt die Definition für sämtlichen nachfolgenden Code. Wenn er aber angeben wird, so gilt die Definition nur so lange, wie ein Bereich mit dem entsprechenden Bereichsnamen definiert ist.

So ein Bereich wird gleich am Anfang der Startregel translation_unit definiert und an ihrem Ende wieder aufgelöst:

 

{{

PushScope("external"); 

}}

external_declaration*

{{

PopScope(); 

}}

 

Desgleichen geschieht im compound_statement:

 

"{" 

{{PushScope(ScopeStr() + ".local" + itos(m_iLocalScope++)); }}

  ...

{{PopScope(); }}

"}"

 

Bereichsnamen werden mit einem Stack verwaltet. Der Befehl PushScope packt einen zusätzlichen Bereich auf den schon vorhandenen Stapel von Bereichen und PopScope entfernt den obersten Bereich. (Um eindeutige Namen für diese lokalen Geltungsbereiche erzeugen zu können, werden durchnummeriert.)

Solange wie der Bereich, für den ein dynamisches Token definiert ist sich noch im Stapel befindet, solange wird das Token erkannt.

Im folgenden Beispiel wird innerhalb der ersten  compound_statement der Typ pchar definiert.

 

  if(xi > 0)

  {

    typedef char* pchar;

    pchar p;

  }

  else

  { 

    pchar p;  // error

  }

 

Im zweiten compound_statement gilt diese Definition jedoch nicht mehr, so dass ihre Verwendung zu einem Fehler führt. Damit ist genau der Mechanismus von Typdefinitionen in C nachgebildet.

 

 

 

 



Diese Seite gehört zur TextTransformer Dokumentation

Home  Inhalt  English