🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.javascript
4 messages
4 total messages Started by Piotrek Wed, 15 Oct 2014 18:06
Automatyczne wstawianie średników - pytanie
#51473
Author: Piotrek
Date: Wed, 15 Oct 2014 18:06
45 lines
2653 bytes
W 6. edycji "JavaScript The Definitive Guide", w podrozdziale
2.5 (Optional Semicolons), znajduje się takie stwierdzenie:

"JavaScript treats a line break as a semicolon if the next 
nonspace character cannot be interpreted as a continuation of 
the current statement", 

a zaraz pod nim podany jest taki przykład:

var a
a
=
3
console.log(a)

Autor twierdzi, że zostanie on zinterpretowany jako:

var a; a = 3; console.log(a);

tzn. pierwsza linia będzie niejawnie zakończona średnikiem,
bo bez niego interpreter natrafiłby na niezrozumiały dla niego
ciąg "var a a".

Taka argumentacja nie przemawia do mnie z dwóch powodów:

1. Dlaczego niby 2 pierwsze linie miałyby być bez średnika
zinterpretowane jako "var a a", a nie "var aa" (skąd miałaby
się brać spacja między dwoma "a")?

2. Zgodnie z regułką zacytowaną przed przykładem, JavaScript
traktuje koniec linii jako średnik jeśli pierwszy różny 
od spacji znak w nowej linii nie może być zinterpretowany 
jako kontynuacja bieżącej instrukcji (zakładam, że jest to 
równoważność, tzn. jeśli ten warunek nie zachodzi, średnik 
nie zostaje automatycznie dodany). 

Skoro tak, to dlaczego rozważany przykład
nie jest rozumiany jako:

var aa = 3; console.log(a);

tzn. dlaczego 4 pierwsze linie nie mogą składać się 
łącznie na deklarację zmiennej o nazwie "aa", połączoną
z jej inicjalizacją? Pewnie wynika to jakoś z definicji 
języka, ale z zacytowanej regułki nie umiem tego wywnioskować.
Re: Automatyczne wstawianie średników - pytanie
#51474
Author: Jordan Szubert
Date: Wed, 15 Oct 2014 18:11
53 lines
2708 bytes
Dnia 15-10-2014 o 20:06:16 Piotrek <pilarp@poczta.onet.pl> napisał(a):

> W 6. edycji "JavaScript The Definitive Guide", w podrozdziale
> 2.5 (Optional Semicolons), znajduje się takie stwierdzenie:
>
> "JavaScript treats a line break as a semicolon if the next
> nonspace character cannot be interpreted as a continuation of
> the current statement",
>
> a zaraz pod nim podany jest taki przykład:
>
> var a
> a
> =
> 3
> console.log(a)
>
> Autor twierdzi, że zostanie on zinterpretowany jako:
>
> var a; a = 3; console.log(a);
>
> tzn. pierwsza linia będzie niejawnie zakończona średnikiem,
> bo bez niego interpreter natrafiłby na niezrozumiały dla niego
> ciąg "var a a".
>
> Taka argumentacja nie przemawia do mnie z dwóch powodów:
>
> 1. Dlaczego niby 2 pierwsze linie miałyby być bez średnika
> zinterpretowane jako "var a a", a nie "var aa" (skąd miałaby
> się brać spacja między dwoma "a")?
>
> 2. Zgodnie z regułką zacytowaną przed przykładem, JavaScript
> traktuje koniec linii jako średnik jeśli pierwszy różny
> od spacji znak w nowej linii nie może być zinterpretowany
> jako kontynuacja bieżącej instrukcji (zakładam, że jest to
> równoważność, tzn. jeśli ten warunek nie zachodzi, średnik
> nie zostaje automatycznie dodany).
>
> Skoro tak, to dlaczego rozważany przykład
> nie jest rozumiany jako:
>
> var aa = 3; console.log(a);
>
> tzn. dlaczego 4 pierwsze linie nie mogą składać się
> łącznie na deklarację zmiennej o nazwie "aa", połączoną
> z jej inicjalizacją? Pewnie wynika to jakoś z definicji
> języka, ale z zacytowanej regułki nie umiem tego wywnioskować.

zgadywałbym, że wynika to z tej samej reguły, która sprawia że "var a" i  
"vara" to są całkiem inne rzeczy

-- 
Jordan Szubert
Re: Automatyczne wstawianie średników - pytanie
#51475
Author: DeZ
Date: Wed, 15 Oct 2014 18:57
10 lines
1250 bytes
W dniu 15.10.2014 o 20:06, Piotrek pisze:>
> Skoro tak, to dlaczego rozważany przykład
> nie jest rozumiany jako:
>
> var aa = 3; console.log(a);

Zgaduję, że nazwa zmiennej nie może zawierać białych znaków.

-- 
DeZ
Re: Automatyczne wstawianie średników - pytanie
#51476
Author: NotBear
Date: Thu, 16 Oct 2014 11:06
24 lines
2018 bytes
W dniu 2014-10-15 20:06, Piotrek pisze:
> tzn. dlaczego 4 pierwsze linie nie mogą składać się
> łącznie na deklarację zmiennej o nazwie "aa", połączoną
> z jej inicjalizacją? Pewnie wynika to jakoś z definicji
> języka, ale z zacytowanej regułki nie umiem tego wywnioskować.


Bo reguła została nieco uproszczona, a oryginalna brzmi nieco inaczej. W 
tym konkretnym przypadku ma zastosowanie: "1. When, as the program is 
parsed from left to right, a token (called the offending token) is 
encountered that is not allowed by any production of the grammar, then a 
semicolon is automatically inserted before the offending token if one or 
more of the following conditions is true:
- The offending token is separated from the previous token by at least 
one LineTerminator.
- The offending token is }."
Calosc: http://www.ecma-international.org/ecma-262/5.1/#sec-7.9.1

Czyli nie musi byc tam zadnych spacji, bo srednik jest wstawiany gdy 
problematyczny znak jest poprzedzony jednym lub kilkoma <LF>,<CR>,<LS>,<PS>.


-- 
NotBear
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads