C'è un modo semplice che posso tokenize una stringa senza un lexer in piena regola?
-
22-09-2019 - |
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
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.