He estado trabajando en un Lua fslex lexer en mi tiempo libre, usando el manual ocamllex como referencia.Cuerdas largas Lua en fslex
Me golpeó algunos inconvenientes al tratar de tokenizar cadenas largas correctamente. "Cadenas largas" están delimitadas por '[' ('=')* '['
y ']' ('=')* ']'
tokens; el número de signos =
debe ser el mismo.
En la primera aplicación, el analizador léxico parecía no reconocer patrones [[
, produciendo dos LBRACKET
fichas a pesar de la regla de partido más largo, mientras que [=[
y las variaciones en donde se reconoce correctamente. Además, la expresión regular no se aseguró de que se utilizara el token de cierre correcto, deteniéndose en la primera captura de ']' ('=')* ']'
, sin importar el "nivel" de cadena larga real. Además, fslex no parece ser compatible con construcciones "como" en expresiones regulares.
let lualongstring = '[' ('=')* '[' (escapeseq | [^ '\\' '[' ])* ']' ('=')* ']'
(* ... *)
| lualongstring { (* ... *) }
| '[' { LBRACKET }
| ']' { RBRACKET }
(* ... *)
que he estado tratando de resolver el problema con otra regla en el léxico:
rule tokenize = parse
(* ... *)
| '[' ('=')* '[' { longstring (getLongStringLevel(lexeme lexbuf)) lexbuf }
(* ... *)
and longstring level = parse
| ']' ('=')* ']' { (* check level, do something *) }
| _ { (* aggregate other chars *) }
(* or *)
| _ {
let c = lexbuf.LexerChar(0);
(* ... *)
}
Pero estoy atascado, por dos razones: en primer lugar, no creo que pueda " push ", por así decirlo, un token a la próxima regla una vez que haya terminado de leer la cadena larga; segundo, no me gusta la idea de leer char por char hasta que se encuentre el token de cierre correcto, haciendo inútil el diseño actual.
¿Cómo puedo tokenar las cuerdas largas de Lua en fslex? Gracias por leer.
Offhand, solo quería mencionar: siempre podría elegir analizarlo, en lugar de leerlo. – Brian
@Brian, ¿pueden explicarlo?:) Estoy un poco perdido tratando de entender cómo analizar una secuencia de tokens no relacionados para crear la cadena larga original, siempre que el lexer pueda producir tokens para todo el contenido de la cadena. Gracias por tu comentario. – Raine
Sí, probablemente no sea una buena estrategia, solo la estaba lanzando. – Brian