Y at-il un moyen simple, je peux tokenizer une chaîne sans lexer entière?
-
22-09-2019 - |
Question
Je cherche à mettre en œuvre le -cour algorithme Manœuvre , mais je dois une aide pour déterminer quelle est la meilleure façon de diviser une chaîne en ses jetons est.
Si vous remarquez, la première étape de l'algorithme est « lu un jeton. » Ce n'est pas exactement une chose non négligeable à faire. Les jetons peuvent se composer de numéros, les opérateurs et les parens.
Si vous faites quelque chose comme:
(5 + 1)
Un string.split simple () me donnera un tableau des jetons { "(", "5", "+", "1", ")"}.
Cependant, il devient plus compliqué si vous avez des nombres avec plusieurs chiffres tels que:
((2048 * 124) + 42)
un string.split naïf () ne fera pas l'affaire. Les numéros à plusieurs chiffres sont un problème.
Je sais que je pourrais écrire un lexer, mais est-il un moyen de le faire sans écrire une lexer entière?
Je suis dans la mise en œuvre de cette JavaScript et je voudrais éviter d'avoir à aller sur le chemin de Lexer si possible. Je vais utiliser le "*", "+", "-". Et les opérateurs "/", ainsi que des entiers
La solution
Que diriez-vous des expressions régulières? Vous pouvez facilement écrire regex à scinder la façon dont vous voulez, et la méthode JS string.split accepte regex comme paramètre trop.
Par exemple ... (modifier pour inclure tous les caractères dont vous avez besoin, etc.)
/([0-9]+|[*+-\/()])/
Autres conseils
Vous pouvez utiliser une correspondance globale comme décrit à http: //mikesamuel.blogspot.com/2009/05/efficient-parsing-in-javascript.html
En gros, vous créez un regex qui décrit un jeton
/[0-9]+|false|true|\(|\)/g
et mettre le « g » à la fin il correspond globalement, puis vous appelez sa méthode de correspondance
var tokens = myRegex.match(inputString);
et retourner un tableau.