molily: Syntaxfragen

Beitrag lesen

Hallo,

Ich weiß nicht ganz, was hier für Verwirrung sorgt...

a={} b={}; // Fehler: Fehlendes ';' wird bemängelt.
LOL - kann es sein, daß die Object-Literale die *einzige* Ausnahme der "Kann-man-drauf-verzichten-'Regel'" sind (weil sie selbst keine Semikolon beinhalten dürfen)?

Häh? ;) Man kann in einem solchen Fall nie auf ein Semikolon verzichten, wieso sollte ein Object-Literal eine Ausnahme sein?

Nochmal das Beispiel:

a = {} b = {};

Würde man das einer linguistischen Konstituentenanalyse unterziehen :-),
so sind das zwei (fehlerhafte) Expression Statements, in denen ein Identifier und ein Object-Literal mit einem Assignment Operator kombiniert werden.

a = {} b = {};
IWOWLLWIWOWLL
EEEEEEWEEEEEEE
I = Identifier, W = Whitespace, L = Object-Literal, E = Expression Statement

Also letztlich nicht viel mehr als:
a = 3 b = 4;
Das ist genausowenig erlaubt. Object-Literale sind da keine Ausnahme.

Identifier ersetzen wir mal durch andere Literale und den Operator wechseln wir auch. Syntaktisch ändern sich da wenig:
1 + 2  3 + 4;
ist auch aus denselben Gründen fehlerhaft.

Noch einfacher, wir stellen nur zwei Literale/Werte nebeneinander (darauf laufen die obigen Ausdrücke beim auflösen sowieso hinaus):
1 2;
Das zeigt das Grundproblem. Hier gibts eine offene Expression mit einem (numerischen) Literal und danach gehts gleich - ohne verbindenden Operator - weiter mit einem weiteren Literal (oben wars ein Identifier, das kommt aufs selbe heraus). Das kann nur ein Fehler sein.

Bei a = {} b = {}; läuft der Parser ganz normal bis zu m schließenden } des ersten Object-Literals - alle Zeichen werden normal in ihrer Bedeutung erkannt. Dann muss entweder die Expression zuende sein oder ein weiterer Operator folgen. Es folgt aber ein Literal. Zack, Syntaxfehler.

for(i=0;i<5;i++) { if(i==2) { alert(0); } } if(i==5) { alert(1); } else { alert(2); } alert(i);

Hier hast du abgeschlossene Statements, for und if-else. Durch die Klammerung ist ganz klar, wo deren Anweisungsblöcke sind. Zwischen diesen Statements sind selbstverständlich keine Semikola nötig!

Das heißt,
if (true) { alert("äh"); }; if (false) { alert("öh"); };
                          ^
dieses Semikolon wäre Unsinn.

Das wäre syntaktisch nämlich:
1. if-Statement
2. Empty Statement
3. if-Statement

Das wäre zwar zulässig, aber genauso unsinnig wie
;;;;;;;;;;;;alert("Hallo");;;;;;;;;;;;;;alert("Hallo");;;;;;;;;;
Die ganzen überflüssigen Semikola hier sind »leere« Statements. Syntaktisch völlig korrekt und legitim, aber gänzlich überflüssig. ;)

Automatische Einfügung von Semikola tritt vor allem in zwei Fällen ein (ECMAScript):
Voraussetzung: Der Parser tritt auf eine nicht identifizierbare Zeichenkette, die nicht in das vorige Statement/die vorige Expression hineinpassen kann.
Fall 1, in dem ein vor dem Semikolon unidentifizierbaren String eingefügt wird: Vor dem String steht ein Zeilenumbruch.
Fall 2: der String ist das Zeichen »}«.

Das heißt, man kann schreiben (Fall 1)
1 + 2
3 + 4;
wird zu
1 + 2;
3 + 4;
(Um mich zu wiederholen: In einer Zeile geschrieben wäre 1 + 2  3 + 4; jedoch ein Fehler und es würde kein Semikolon eingefügt.)

oder (Fall 2)

if (bla) {
   1 + 2;
   3 + 4
}
wird zu
if (bla) {
   1 + 2;
   3 + 4;
}

Das ist alles. Wenn der ganze Code in einer Zeile steht, kann nur Fall 2 eintreten. In deinem for-if-Beispiel werden gar keine Semikola eingesetzt. Die Syntax ist fehlerfrei und der Parser trifft auf nichts unvorhergesehenes oder zweideutiges.

Letztlich lässt sich alles reduzieren auf:
Mehrere vollständige, korrekte Statements können also ein einer Zeile stehen. for, if usw. bestehen nicht aus einem schließenden Semikolon, ein Expression Statement benötigt ein solches. Statements sind so angelegt, dass sie eindeutig geparst werden können ohne Berücksichtigung des Whitespaces.

Mathias