2015-03-28 9 views
9

W ECMAScript grammar specification język JavaScript, istnieją określone bloki z podwójnym dwukropkiem jak ten:Jaka jest różnica między: i :: ::: w JavaScript i gramatyki

Literal :: 
    NullLiteral 
    BooleanLiteral 
    NumericLiteral 
    StringLiteral 
    RegularExpressionLiteral 

i blokuje zdefiniowane za pomocą jednego okrężnicy jak to:

PrimaryExpression : 
    this 
    Identifier 
    Literal 
    ArrayLiteral 
    ObjectLiteral 
    (Expression) 

i nawet bloki z potrójnym okrężnicy:

uriCharacter ::: 
    uriReserved 
    uriUnescaped 
    uriEscaped 

Jaka jest różnica między pojedynczym a podwójnym i potrójnym dwukropkiem?

+1

Zostało to wyjaśnione w [Sekcja 5.1: Gramatyki syntaktyczne i leksykalne] (http://www.ecma-international.org/ecma-262/5.1/#sec-5.1). –

+0

Patrz podrozdziały 5.1.1 do 5.1.5. –

+0

@LeonidBeschastny - Widziałem i czytałem tę sekcję, ale nie wiem, co to znaczy. Jeśli możesz wyjaśnić, co to znaczy, proszę, umieść to w odpowiedzi. – jfriend00

Odpowiedz

2

Gramatyka leksykalna JSON służy do tłumaczenia sekwencji znaków na żetony i jest podobna do części gramatyki leksykalnej ECMAScript. Gramatyka składniowa JSON opisuje, w jaki sposób sekwencje tokenów z gramatyki leksykalnej JSON mogą tworzyć syntaktycznie poprawne opisy obiektów JSON.

Zasady leksykalne ("::") oznaczają, że tokeny oznaczają "jak wyglądają poszczególne części języka". Definiuje reguły takie jak "5.5 to liczba".

Reguły syntaktyczne (":") dla wyrażenia oznaczają "sposób wzajemnego oddziaływania części". Określa zasady takie jak "5.5 abc nie ma sensu".

Potrójny dwukropek (":::") wydaje się być zarezerwowany specjalnie do definiowania reguł konwersji łańcuchów na liczby. Ciąg " 0x1235 " (z białymi znakami) jest prawidłową liczbą. Reguły potrójnego definiują to.

Potrójnie-dwukropek (":::") również wydaje się być używany do gramatyki uri string. Najczęściej używane w ten sposób: "f%20o%20o" dekoduje do "f o o". Reguły te definiują strukturę "numerycznej" części łańcuchów.

+4

Chociaż jestem pewien, że to prawda, nie jest jasne, w jaki sposób to rozróżnienie ma zastosowanie do podanych przykładów. Czy możesz wyjaśnić, jaka jest różnica między przykładami? – Vitruvius

+0

Czy możesz wyjaśnić, jak to, co napisałeś, odnosi się do trzech przykładów, o których wspomniałem w moim pytaniu, ponieważ nie stosuję się do twoich wyjaśnień w obecnej formie. Na przykład, dlaczego Literal użyje '::'? Pozycje wymienione po '::' nie dotyczą interakcji z częściami - są listą przedmiotów, które same mogą być Literałami. – jfriend00

+0

@ jfriend00, wymyśliłeś to? Sądzę, że ':' oznacza gramatykę używaną podczas analizy leksykalnej do generowania strumienia tokenów wejściowych, podczas gdy gramatura '::' jest używana podczas analizy składni do utworzenia drzewa parse. –

1

Zobacz Standard ECMA-262 5.1 Edition/June 2011/

5.1.1 gramatyk bezkontekstowych

gramatyki bezkontekstowych składa się z kilku produkcjach. Każda produkcja ma symbol abstrakcyjny zwany nieterminalnym jako jego lewa strona , a sekwencja zero lub więcej nieterminalnych i symboli końcowych jako prawa strona. Dla każdej gramatyki symbole terminalu są rysowane z określonego alfabetu.

Od zdania obejmującej jeden odróżnić nieterminalowi, nazywany symbolem cel, dany kontekst wolne gramatyki określa się język, a mianowicie (może nieskończony) zestaw możliwych sekwencji symboli terminali, które mogą prowadzić od wielokrotnego zastępowania dowolnego nieterminalnego w sekwencji po po prawej stronie produkcji , dla której nieterminalna jest po lewej stronie.

5.1.6 gramatyki Oznaczenia

symbole zacisk gramatyk słownikowych i łańcuchowych, a niektóre z symboli końcowych gramatyki składniowej, pokazane są na stałej szerokości czcionki, zarówno w przedstawieniach gramatyki i w opisie gdy tekst bezpośrednio odnosi się do takiego symbolu terminalu . Te mają pojawić się w programie dokładnie tak, jak napisano. Wszystkie podane w ten sposób znaki symboli terminala należy rozumieć jako jako odpowiedni znak Unicode z zakresu ASCII, w przeciwieństwie do dla wszystkich znaków o podobnym wyglądzie z innych zakresów Unicode.

Nieterminalne symbole są wyświetlane kursywą. Definicja nieterminalnej definicji jest wprowadzana przez nazwę nieterminalnej istoty zdefiniowanej jako , po której następuje jeden lub więcej dwukropków. (Liczba dwukropków wskazuje na , do której należy gramatura). Jedna lub więcej alternatywnych prawych stron dla nieterminalnych, a następnie następnych linii. Na przykład, składniowym definicja:

WhileStatement : 
    while(Expression) Statement 

stwierdza, że ​​nieterminalowi WhileStatement reprezentuje token natomiast, następnie lewym tokena nawias, a następnie wyrażenie, następnie prawym nawiasem tokena, a następnie oświadczenie. Zdarzenia Expression i Statement są same w sobie nieterminalne. Jako inny przykład, składniowym definicja:

ArgumentList : 
    AssignmentExpression 
    ArgumentList , AssignmentExpression 

:::

produkcjach numerycznej gramatyki łańcucha odznaczają o trzy średników ":::" jako interpunkcja.

::

produkcjach gramatyk leksykalnych i RegExp wyróżniają posiadające dwa dwukropki "::" jako oddzielenie znaków interpunkcyjnych. Gramatyki leksykalne i gramatyki RegExp dzielą niektóre produkcje.

:

produkcjach gramatyki składniowej wyróżniają mając tylko jeden dwukropek ":" jako interpunkcji.

Uwaga,

5,1.5 JSON Gramatyka

Productions gramatyki leksykalnym JSON wyróżniają mający dwa dwukropki „::” jako oddzielenie znaków interpunkcyjnych. Gramatyka leksykalna JSON wykorzystuje niektóre produkcje gramatyczne leksykalne ECMAScript. Gramatyka syntaktyczna JSON jest podobna do gramatyki składniowej języka ECMAScript. Produkcje gramatyki składniowej JSON wyróżniają się za pomocą jednego okrężnicy ":" jako oddzielenie interpunkcji.

+1

Czym właściwie są "produkcja gramatyk leksykalnych i RegExpowych", "produkcje gramatyki syntaktycznej" i "produkcje gramatyki ciągów liczbowych". Przeczytałem to w specyfikacji i nie wiem, co to jest. Szukam kogoś, kto wyjaśniłby to po angielsku. – jfriend00

+0

@ jfriend00 Jeśli właściwie interpretować specyfikację, wydaje się, że zawiera wskazówki dotyczące pisania 'js'; kiedy rzeczywisty język lub implementacja języka jest określona przez autora danej implementacji. Zobacz Zgodność _ "Odpowiednia implementacja ECMAScript musi zapewniać i obsługiwać wszystkie typy, wartości, obiekty, właściwości, funkcje oraz składnię i semantykę programu opisaną w tej specyfikacji."_ W odpowiedzi,' Produkcja' będzie 'WhileStatement'': '' // zdefiniuj tutaj, używając Grammar' – guest271314

+0

@ jfriend00 Nie napisałem 'js' od zera na poziomie podstawowym, jak opisano w dokumencie, ale skomponowałem 'dtd's http://www.w3.org/TR/html4/sgml/dtd.html i skomponowane niestandardowe znaczniki do użycia w' HTML', 'XML' .To jest najbliższe może porównywać, tutaj, z rzeczywistym Mimo to, "mógł" zobaczyć "jak można napisać' js' - nawet w 'js' - aby stworzyć niestandardową implementację' Production' -> 'Grammar' wykorzystującą wzorce w dokumencie. Link do ostatniego komentarza, poniżej oryginalnego pytania, pojawia się opisać ten proces w sprawiedliwym stopniu, używając terminu "makra". – guest271314

Powiązane problemy