Domanda

Sto cercando di implementare la manovra-yard algoritmo , ma ho bisogno qualche aiuto per capire cosa il modo migliore per dividere una stringa in suoi gettoni è.

Se si nota, il primo passo dell'algoritmo è "leggere un token." Questo non è esattamente una cosa non banale da fare. I token possono consistere di numeri, operatori e parentesi.

Se stai facendo qualcosa di simile a:

  

(5 + 1)

Un semplice string.split () mi darà una serie di gettoni { "(", "5", "+", "1", ")"}.

Tuttavia, diventa più complicata se si hanno i numeri con più cifre, ad esempio:

  

((2048 * 124) + 42)

Ora uno string.split ingenua () non farà il trucco. I numeri a più cifre sono un problema.

So che potrei scrivere un lexer, ma c'è un modo per farlo senza scrivere una lexer in piena regola?

Sono l'attuazione del presente in JavaScript e mi piacerebbe evitare di dover andare giù il lexer-percorso, se possibile.  Sarò con il "*", "+", "-". E "/" operatori, insieme a interi

È stato utile?

Soluzione

Come sulle espressioni regolari? Si potrebbe facilmente scrivere regex di dividerlo nel modo desiderato, e il metodo string.split JS accetta espressioni regolari come parametro troppo.

Ad esempio ... (modificare per includere tutti i caratteri necessari etc)

/([0-9]+|[*+-\/()])/

Altri suggerimenti

È possibile utilizzare una corrispondenza globale come descritto in http: //mikesamuel.blogspot.com/2009/05/efficient-parsing-in-javascript.html

In sostanza, si crea un'espressione regolare che descrive un segno

/[0-9]+|false|true|\(|\)/g

e mettere la 'g' alla fine in modo che corrisponda a livello globale, e quindi si chiama il suo metodo match

var tokens = myRegex.match(inputString);

e tornare un array.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top