en Lua 5.1, se puede recorrer de los caracteres de una cadena esto en un par de maneras
El bucle básico sería:.
for i = 1, #str do
local c = str:sub(i,i)
-- do something with c
end
Pero puede ser más eficaz utilizar un patrón con string.gmatch()
para obtener un iterador sobre los personajes:
for c in str:gmatch"." do
-- do something with c
end
O incluso utilizar string.gsub()
llamar a una función para cada carácter:
str:gsub(".", function(c)
-- do something with c
end)
En todo de los anteriores, he aprovechado el hecho de que el módulo string
se establece como un metatabla para todos los valores de cadena, por lo que sus funciones se pueden llamar como miembros usando la notación :
. También he usado el (nuevo en 5.1, IIRC) #
para obtener la longitud de la cadena.
La mejor respuesta para su aplicación depende de muchos factores, y los puntos de referencia son su amigo si el rendimiento va a importar.
Es posible que desee evaluar qué que necesita para iterar sobre los personajes, y mirar a uno de los módulos de expresiones regulares que han sido unidos a Lua, o una visión moderna de mirar en el módulo de Roberto lpeg que implementa análisis sintáctico Grammers de expresión para Lua.
Gracias. Acerca del módulo lpeg que ha mencionado: ¿guarda las posiciones de los tokens en el texto original después de la tokenización? La tarea que necesito realizar es sintaxis resaltar lenguaje simple específico en scite via lua (sin compilador de C++ compilado). Además, ¿cómo instalar lpeg? Parece que tiene una fuente .c en distribución, ¿necesita compilarse junto con lua? – grigoryvp
La construcción de lpeg producirá una DLL (o .so) que debe almacenarse donde se requiera para encontrarla. (es decir, en algún lugar identificado por el contenido del paquete global.cpath en su instalación de lua). También debe instalar su módulo complementario re.lua si desea utilizar su sintaxis simplificada. A partir de una gramática de lpeg, puede obtener devoluciones de llamada y capturar texto de varias maneras, y ciertamente es posible usar capturas para simplemente almacenar la ubicación de la coincidencia para su uso posterior. Si el objetivo es resaltar la sintaxis, entonces un PEG no es una mala elección de herramienta. – RBerteig
Sin mencionar las [últimas versiones de SciTE] (http: //www.scintilla.org/SciTEDownload.html) (desde 2.22) incluye Scintillua, un lexer basado en LPEG, lo que significa que puede funcionar desde el primer momento, sin necesidad de volver a compilar. –