Pregunta

Estoy buscando implementar el Algoritmo de yarda de derivación, pero necesito ayuda para averiguar cuál es la mejor manera de dividir una cuerda en sus tokens.

Si nota, el primer paso del algoritmo es "Leer un token". Esto no es exactamente algo no trivial. Los tokens pueden consistir en números, operadores y parens.

Si estás haciendo algo como:

(5+1)

Un simple string.split () me dará una matriz de los tokens {"(", "5", "+", "1", ")"}.

Sin embargo, se vuelve más complicado si tiene números con múltiples dígitos como:

((2048*124) + 42)

Ahora un string ingenuo.split () no hará el truco. Los números de múltiples dígitos son un problema.

Sé que podría escribir un lexer, pero ¿hay alguna manera de hacer esto sin escribir un lexer completo?

Estoy implementando esto en JavaScript y me gustaría evitar tener que bajar por la ruta lexer si es posible. Usaré los operadores "*", "+", "-" y "/", junto con enteros.

¿Fue útil?

Solución

¿Qué hay de las expresiones regulares? Puede escribir fácilmente Regex para dividirlo como desee, y el método JS String.Split acepta a Regex como el parámetro también.

Por ejemplo ... (modifique para incluir todos los caracteres que necesita, etc.)

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

Otros consejos

Puede usar una coincidencia global como se describe en http://mikesamuel.blogspot.com/2009/05/eficiente-carsing-in-javascript.html

Básicamente, creas una regex que describe un token

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

y ponga la 'G' en el final para que coincida a nivel mundial, y luego llame a su método de coincidencia

var tokens = myRegex.match(inputString);

Y recupere una matriz.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top