Domanda

Da Parsekit:come abbinare i singoli caratteri delle virgolette?

Se definisci un parser:

@start = int;
int = /[+-]?[0-9]+/

Sfortunatamente non analizzerà alcun numero intero con il prefisso "+", a meno che tu non includa:

@numberState = "+" // at the top.

Nell'analisi dei numeri sopra, il parser predefinito "Simbolo" non è stato nemmeno menzionato, ma è ancora attivo e sovrascrive i parser definiti dall'utente.

Ok, quindi con i numeri puoi ancora risolverlo aggiungendo la direttiva.Cosa succede se stai provando a creare un parser per "++"?Non ho trovato alcuna direttiva che possa far funzionare il seguente parser.

@start = plusplus;
plusplus = "++";

Gli effetti dei parser predefiniti sul parser dell'utente sembrano così arbitrari.Perché non riesco ad analizzare "++"?

È possibile disattivare del tutto i parser predefiniti?Sembrano intralciarmi se non faccio qualcosa di comune.

O forse ho sbagliato tutto.

MODIFICARE:

Ho trovato un parser che analizza plus plus:

@start = plusplus;
plusplus = plus plus;
plus = "+";

Immagino che la risposta sia:i simboli letterali definiti nel tuo parser non possono sovrapporsi tra parser predefiniti;Deve essere contenuto completamente da almeno uno di essi.

È stato utile?

Soluzione

Sviluppatore di ParseKit Qui.

Ho alcune risposte.

  1. Penso che più imparerai troverai l'API ParseKit estremamente elegante e sensata.Tieni presente che non sto esagerando dicendo questo.Sebbene abbia creato ParseKit, non ho progettato l'API ParseKit.Piuttosto, il design di ParseKit si basa quasi interamente sui design presenti in Quella di Steven Metsker Costruire parser in Java.Ti consiglio vivamente di dare un'occhiata al libro se vuoi comprendere a fondo ParseKit.Inoltre è un libro fantastico sull'analisi in generale.

  2. Stai confondendo Stati tokenizzatore con Parser.Sono due cose distinte, ma i dettagli sono più complessi di quanto possa rispondere qui.Ancora una volta, consiglio il libro di Metsker.

  3. Nel rispondere alla tua domanda, ho trovato un piccolo bug in ParseKit.Grazie!Tuttavia, ciò non ha influenzato il risultato sopra descritto poiché non stavi utilizzando la grammatica corretta per ottenere il risultato che sembra stavi cercando.Dovrai aggiornare il codice sorgente da The Progetto Codice Google ora, altrimenti il ​​mio consiglio di seguito non funzionerà per te.


Ora, per rispondere alla tua domanda.

Penso che tu stia cercando una grammatica che riconosca entrambi ++ come un singolo multicarattere Symbol token e riconosce anche i numeri iniziali + caratteri come numeri esplicitamente positivi anziché a + Symbol gettone seguito da a Number gettone.

La grammatica corretta che credo tu stia cercando è qualcosa del genere:

@symbols = '++';    // declare ++ as a multi-char symbol
@numberState = '+'; // allow explicitly-positive numbers
@start = (Number|Symbol)*;

Inserisci in questo modo:

++ +1 -2 + 3 ++

Verrà tokenizzato in questo modo:

[++, +1, -2, +, 3, ++]++/+1/-2/+/3/++^

Due promemoria:

  1. Ancora una volta, dovrai aggiornare ora il tuo codice sorgente per vederlo funzionare correttamente.In questo caso ho dovuto correggere un bug.
  2. Questa roba è complicata e consiglio di leggere il libro di Metsker per comprendere appieno come funziona ParseKit.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top