2015-03-28 29 views
9

Im ECMAScript grammar specification für Javascript, gibt es Blöcke mit einem doppelten Doppelpunkt wie folgt definiert:Was ist der Unterschied zwischen: und :: und ::: in Javascript Grammatik

Literal :: 
    NullLiteral 
    BooleanLiteral 
    NumericLiteral 
    StringLiteral 
    RegularExpressionLiteral 

Und mit einem einzigen Doppelpunkt definierten Blöcke wie dies:

PrimaryExpression : 
    this 
    Identifier 
    Literal 
    ArrayLiteral 
    ObjectLiteral 
    (Expression) 

Und auch Blöcke mit einem dreifachen Doppelpunkt:

uriCharacter ::: 
    uriReserved 
    uriUnescaped 
    uriEscaped 

Was ist der Unterschied zwischen den Einzel- und Doppel-und Dreifach-Doppelpunkten?

+1

Es wird in [Abschnitt 5.1: Syntaktische und lexikalische Grammatiken] (http://www.ecma-international.org/ecma-262/5.1/#sec-5.1) erklärt. –

+0

Siehe Unterabschnitte 5.1.1 bis 5.1.5. –

+0

@LeonidBeschastny - Ich habe diesen Abschnitt gesehen und gelesen, weiß aber nicht, was es bedeutet. Wenn Sie erklären können, was das bedeutet, bringen Sie es bitte in eine Antwort. – jfriend00

Antwort

2

Die lexikalische JSON-Grammatik wird zur Übersetzung von Zeichenfolgen in Token verwendet und ähnelt Teilen der lexikalischen Grammatik von ECMAScript. Die syntaktische JSON-Grammatik beschreibt, wie Sequenzen von Token aus der lexikalischen JSON-Grammatik syntaktisch korrekte JSON-Objektbeschreibungen bilden können.

Lexikalische Regeln ("::") für Token bedeuten "wie die Teile der Sprache aussehen". Es definiert Regeln wie "5.5 ist eine Zahl".

Syntaktische Regeln (":") für Ausdrücke bedeuten "wie die Teile miteinander interagieren". Es definiert Regeln wie "5.5 abc macht keinen Sinn".

Der Tripel-Doppelpunkt (":::") scheint speziell für die Definition von Regeln zum Konvertieren von Strings in Zahlen reserviert zu sein. Die Zeichenfolge " 0x1235 " (mit Leerzeichen) ist eine gültige Nummer. Die Triple-Colon-Regeln definieren das.

Der Tripel-Doppelpunkt (":::") scheint auch für UI-String-Grammatik verwendet werden. Am häufigsten wie folgt verwendet: "f%20o%20o" dekodiert zu "f o o". Diese Regeln definieren die Struktur des "numerischen" Teils der Strings.

+4

Obwohl ich mir sicher bin, dass dies richtig ist, ist es nicht klar, wie diese Unterscheidung auf die gegebenen Beispiele zutrifft. Kannst du erklären, worin der Unterschied zwischen den Beispielen besteht? – Vitruvius

+0

Kannst du erklären, wie das, was du geschrieben hast, auf die drei Beispiele zutrifft, die ich in meiner Frage zitiert habe, weil ich deine Erklärung nicht so befolge wie sie ist? Warum würde beispielsweise Literal '' '? Die Elemente, die nach dem '::' aufgelistet sind, haben nichts mit Teilen zu tun - sie sind eine Liste von Elementen, die alle selbst ein Literal sein können. – jfriend00

+0

@ jfriend00, hast du es herausgefunden? Ich glaube, dass ':' die Grammatik bezeichnet, die während der lexikalischen Analyse verwendet wird, um einen Strom von Eingabe-Tokens zu erzeugen, während die '::' Grammatik während der Syntaxanalyse verwendet wird, um einen Syntaxbaum zu erzeugen. –

1

Siehe Standard ECMA-262 5.1 Edition/June 2011/

5.1.1 kontextfreie Grammatiken

Eine kontextfreie Grammatik besteht aus einer Reihe von Produktionen. Jede Produktion hat ein abstraktes Symbol, das als Nonterminal bezeichnet wird, wie seine linke Seite, und eine Sequenz von null oder mehr nichtterminalen und Terminalsymbolen als seine rechte Seite. Für jede Grammatik werden die Terminalsymbole aus einem bestimmten Alphabet gezeichnet.

aus einem Satz ausgehend aus einem einzigen aufstrebenden nicht terminale, das Ziel-Symbol genannt wird, eine gegebene kontextfreie Grammatik gibt eine Sprache, nämlich die (möglicherweise unendliche) Menge möglicher Sequenzen von Terminalsymbolen, die entstehen können von wiederholt ersetzen alle Nichtterminal in der Sequenz mit einer rechten Seite einer Produktion für die das Nonterminal ist die linke Seite.

5.1.Notation 6 Grammar

Terminal-Symbole der lexikalischen und Zeichenfolge Grammatiken, und einige der Terminalsymbole der syntaktischen Grammatik, sind in fester Breite Schrift gezeigt, sowohl in den Produktionen der Grammatiken und in dieser Spezifikation, wann immer die Text bezieht sich direkt auf ein solches Terminal Symbol. Diese sollen in einem Programm genau so erscheinen wie geschrieben. Alle Terminal-Symbol-Zeichen, die auf diese Weise angegeben sind, verstehen sich als das entsprechende Unicode-Zeichen aus dem ASCII-Bereich , im Gegensatz zu ähnlich aussehenden Zeichen aus anderen Unicode-Bereichen.

Nichtterminale Symbole werden kursiv dargestellt. Die Definition eines Nichtterminals wird eingeführt, indem der Name des Nichtterminals definiert wird gefolgt von einem oder mehreren Doppelpunkten. (Die Anzahl der Doppelpunkte gibt an, zu welcher Grammatik die Produktion gehört.) Eine oder mehrere alternative Rechte Seiten für das Nonterminal folgen dann auf den folgenden Zeilen. Zum Beispiel kann die syntaktische Definition:

WhileStatement : 
    while(Expression) Statement 

besagt, dass das Nicht-End-WHILESTATEMENT stellt das Token während durch eine linke Klammer Token gefolgt, gefolgt von einem Ausdruck, von einer rechten Klammer Token gefolgt, gefolgt von einer Erklärung. Die Vorkommen von Ausdruck und Anweisung sind selbst nichtterminals. Als ein anderes Beispiel, die syntaktische Definition:

ArgumentList : 
    AssignmentExpression 
    ArgumentList , AssignmentExpression 

:::

Productions der numerischen Zeichenfolge Grammatik indem drei Doppelpunkte auszeichnen ":::" als Interpunktion.

::

Produktionen der lexikalischen und RegExp Grammatiken zeichnen sich durch mit zwei Doppelpunkte "::" als Interpunktions trennt. Die lexikalischen und RegExp-Grammatiken teilen einige Produktionen. ":" als Interpunktions

:

Productions der syntaktischen Grammatik werden, indem nur eine colon unterscheiden.

Hinweis,

5,1.5 Die JSON Grammar

Produktionen der JSON lexikalischen Grammatik zeichnen sich durch mit zwei Doppelpunkte "::" als Interpunktions trennt. Die JSON lexikalische Grammatik verwendet einige Produktionen aus der lexikalischen Grammatik ECMAScript. Die syntaktische Grammatik JSON ähnelt Teilen der syntaktischen ECMAScript-Grammatik. Produktionen der syntaktischen JSON-Grammatik werden unterschieden mit einem Doppelpunkt ":" als Trennzeichen.

+1

Und was genau sind "Produktion der lexikalischen und RegExp-Grammatiken", "Produktionen der syntaktischen Grammatik" und "Produktionen der numerischen String-Grammatik". Ich habe es in der Spezifikation gelesen und weiß nicht, was das ist. Ich suche jemanden, der das auf Englisch erklärt. – jfriend00

+0

@ jfriend00 Wenn die Spezifikation korrekt interpretiert wird, scheint sie im Grunde eine Anleitung zum Schreiben von 'js' zu geben; wenn die tatsächliche Sprache oder Sprachimplementierung vom Autor der jeweiligen Implementierung definiert wird. Siehe Conformance _ "Eine konforme Implementierung von ECMAScript muss alle in dieser Spezifikation beschriebenen Typen, Werte, Objekte, Eigenschaften, Funktionen, Programm-Syntax und Semantik bereitstellen und unterstützen."_ Bei der Antwort würde' Production' 'WhileStatement'' lauten: '' Definiere hier Zeug mit Grammar' – guest271314

+0

@ jfriend00 Habe 'js' eigentlich noch nicht von Grund auf geschrieben, wie im Dokument beschrieben, obwohl sie zusammengesetzt sind 'dtd's http://www.w3.org/TR/html4/sgml/dtd.html, und benutzerdefinierte Tags zur Verwendung bei' HTML', 'XML' zusammensetzt.Das ist am ehesten vergleichbar, hier, von tatsächlichen Englisch: www.doc-o-matic.com/webhelp/opHTML.html Obwohl "js" geschrieben werden konnte - selbst in 'js' -, um eine benutzerdefinierte Implementierung von' Production' -> 'Grammar' zu erzeugen, die Muster im Dokument verwenden, erscheint Link bei letzter Kommentar, unterhalb der ursprünglichen Frage um diesen Prozess zu beschreiben, mit dem Begriff "Makros". – guest271314

Verwandte Themen