2012-10-08 8 views
11

Attualmente sto leggendo Javascript: The Good Parts e ho difficoltà a capire i loro diagrammi di "grammatica".Come leggo questo diagramma di javascript?

Il primo è Whitespace

enter image description here

io non sono molto sicuro come leggerlo, forse un po 'di codice aiutarmi a capire?

Grazie per l'aiuto in ragazzi avanzati.

+2

In sostanza, spazi, tabulazioni e caratteri nuova linea sono tutti considerati spazi bianchi, così come tutti i commenti. – Brad

+0

Avevo difficoltà a cercare di capire cosa la sintassi del commento avesse a che fare con lo spazio bianco, ma adesso ha senso con la risposta di Brad. –

+0

Adesso capisco. Ma per quanto riguarda la struttura? Ancora un po 'di confusione con gli esempi della sezione successiva:/Devo saltare il capitolo della grammatica e andare con gli oggetti? – RufioLJ

risposta

3

La doppia barra laterale sinistra ("||") può essere visualizzata come "ingresso" di una funzione e la doppia barra destra come "uscita". Quindi, in questo caso, un carattere o una linea è l'input e i percorsi tra le doppie barre sono i test. Se il carattere/linea è considerato "spazio bianco" da uno qualsiasi dei test, l'output della funzione sarà "vero", altrimenti sarà "falso".

In particolare, diciamo che segui il quarto percorso. In questo percorso incontrerai prima un "/", seguito successivamente da un altro "/", seguito da qualsiasi altro carattere fino al carattere EOL. In questo caso, se la riga di codice è "// un esempio", l'output sarà true.

+0

Ok questo aiuta, ma mi blocco dopo la terza linea però. Per qualche motivo ho pensato che il diagramma stesse cercando di dire lo spazio bianco di/*// */dalla terza linea. Grazie per avermi aiutato. – RufioLJ

1

Pensateci come se voi il sia il parser o la lingua e avete bisogno di un set di regole per comprendere il flusso di input dei caratteri.

Pensando a come fa il parser, puoi capire esattamente quali sono i token del linguaggio JavaScript.

4

Iniziare a sinistra || e continuare a destra. La prima barra in basso (immediatamente accanto al punto di partenza) non può essere seguita perché la curva non ha origine da sinistra (la direzione che stai percorrendo). Se guardi da dove proviene, dovrebbe essere facile dire che rappresenta un while ciclo:

while (!EOF) {} // While there's still text to parse 

la seconda linea può essere seguito perché la curva proviene da sinistra (. In seguito alla vostra directory corrente) questa linea rappresenta questo else if-statement:

if (char == '/') {}  // Forward slash 
else if (char == '\n') {} // Line end 
else if (char == '\t') {} // Tab 
else if (char == ' ') {} // Space 

Space, scheda e fine linea entrambi terminano la funzione e return o continue immediatamente. Tuttavia, se il personaggio è uno slash, ha bisogno di verificare se si tratta di un'unica linea (//) o multilinea (/* */):

*char++;     // Move to next character 
if (char == '*') {}  // Multi line 
else if (char == '/') {} // Single line 

Se si tratta di una singola linea si legge fino alla fine della linea e continua. Se è una multilinea, legge in modo simile finché non trova "*" seguito da "/" e poi continua.

1

Il diagramma di grammatica cui si fa riferimento è stato ampiamente utilizzato per documentare la sintassi Pascal. È fondamentalmente il diagramma di flusso di come viene analizzato il codice sorgente. Ogni "blocco" del grafico, nel tuo esempio, 'spazio bianco', è come una chiamata di funzione. Tecnicamente stiamo parlando di un parser di discesa ricorsivo.

Quindi il mio modo di pensare è:

Il parser ottiene un personaggio dal flusso di input.Quindi andiamo a "provare" la funzione spazio bianco, se quel carattere è uno spazio, una tabulazione, un fine riga o un carattere '/' andiamo al passo successivo, altrimenti non usciamo con un valore di ritorno 'non trovato'.

Se era un '/', otteniamo il carattere successivo. Se si tratta di un altro '/', leggiamo i caratteri fino a quando non si ottiene una fine riga e quindi si esce con il valore di ritorno 'trovato'.

Se il carattere successivo è un '', allora leggiamo tutto ciò che non è un '/' o ''. ecc ...

Fondamentalmente il flusso va da sinistra a destra, ma quando una linea torna indietro a sinistra abbiamo una ripetizione. La cosa bella di questi diagrammi è che una volta capito, è facile scrivere rapidamente codice sintatticamente corretto. E puoi piuttosto facilmente codificare il parser di discesa ricorsivo seguendo il 'diagramma di flusso'.

1

(fare riferimento a this answer)

Per imparare a come leggere schema della ferrovia, è necessario capire la differenza del grafico in queste tre situazioni:

zero o più, zero o uno, uno o altro.

Per comprendere le loro differenze (come mostra la seguente immagine), il punto è "Si inizia sul bordo sinistro e si seguono le tracce sul bordo destro." Quindi immagina di essere il treno, basta girare a destra, non puoi girare a sinistra.

enter image description here

foto sopra creato da http://bottlecaps.de/rr/ Nella scheda "Modifica grammatica", inserire la seguente grammatica:

zeroormore ::= element* 
zeroorone ::= element? 
oneormore ::= element+