Unbekannter Bezeichner : xxx |
Top Previous Next |
Meldungen > Unbekannter Bezeichner : xxx
Die Meldung "Unbekannter Bezeichner : xxx" ist durch einen Fehler im Interpretercode verursacht. Eine Variable wurde verwendet, die nicht zuvor deklariert wurde. Die Ursache dieser Meldung kann bisweilen versteckt sein (s.u.). Die Meldung kann auch als Folge des Auftretens eines anderen, vorhergehenden Fehlers erfolgen.
Beispiel
Die Zuweisung
s = "Hallo";
erzeugt die Fehlermeldung "Unbekannter Bezeichner : s", wenn die Variable s nicht zuvor deklariert wurde. Richtig wäre daher:
str s; s = "Hallo";
oder in einer Anweisung zusammengefasst:
str s = "Hallo";
Für Interpreter unsichtbare Deklaration in Exportcode
Die Fehlermeldung erscheint z.B auch, wenn die Deklaration einer Variablen in den Klammern "{_" und "_} erfolgt:
{_str sComment;_}
die Variable anschließend aber im Interpretercode auftaucht:
( Comment[sComment] )+
sComment wird als unbekannter Bezeichner reklamiert, wenn in den Projektoptionen für Parameter und "{{...}}" interpretierbar aktiviert ist.
versteckte Sichtbarkeitsbereiche
Eine einmal deklarierte Variable existiert, solange ihr Sichtbarkeitsbereich besteht. Ein Sichtbarkeitsbereich ist der gesamte Text einer Produktion/Token oder der Bereich der durch das Klammerpaar '{' und '}' begrenzt ist oder er kann indirekt durch Alternativen definiert sein. Lautet der Text einer Produktion z.B.:
if( xi == 1 ) { str s = "eins"; out << s; } s = "zwei" // Fehler
so kann dem str s in den Zeilen, die der schließenden Klammer '}' folgen, nichts mehr zugewiesen werden, da er nicht mehr existiert.
Achtung: Alternativen definieren Sichtbarkeitsbereiche, die nicht unmittelbar zu erkennen sind.
Beispiel
Die folgende Produktion verursacht die Fehlermeldung "Unbekannter Bezeichener : s", obwohl der str s korrekt deklariert scheint:
{{str s; }} "a" | "b" print[s]
Tatsächlich werden durch die Alternative versteckte Sichtbarkeitsbereiche eingeführt.
{{str s; }} "a"
und
"b" print[s]
stehen jeweils in einem eigenen Bereich. Deutlich wird dies in der Baumdarstellung der Produktion:
Die semantische Aktion, die den str deklariert, wird unmittelbar vor der Erkennung von "a" ausgeführt und nicht vor der gesamten Alternative. Um dieses Ziel zu erreichen, muss die Alternative geklammert werden:
{{str s; }} ( "a" | "b" print[s] )
Die Baumdarstellung sieht nun folgendermaßen aus:
Die Deklaration steht nun vor der gesamten Alternative und auf die Variable s kann in der gesamten Produktion zugegriffen werden. Der Fehler ist behoben. |
Diese Seite gehört zur TextTransformer Dokumentation |
Home Inhalt English |