2011-04-26 12 views
6

Estoy intentando seguir la "Implementación del compilador moderno en ML" de Appel y estoy escribiendo el lexer usando Ocamllex.Uso de Ocamllex para cadenas lexing (The Tiger Compiler)

La especificación solicita al lexer que devuelva las cadenas después de traducir las secuencias de escape. El código siguiente es un extracto del archivo de entrada ocamllex:

rule tiger = parse 
... 
| '"' 
    { let buffer = Buffer.create 1 in 
     STRING (stringl buffer lexbuf) 
    } 
and stringl buffer = parse 
| '"' { Buffer.contents buffer } 
| "\\t" { Buffer.add_char buffer '\t'; stringl buffer lexbuf } 
| "\\n" { Buffer.add_char buffer '\n'; stringl buffer lexbuf } 
| "\\n" { Buffer.add_char buffer '\n'; stringl buffer lexbuf } 
| '\\' '"' { Buffer.add_char buffer '"'; stringl buffer lexbuf } 
| '\\' '\\' { Buffer.add_char buffer '\\'; stringl buffer lexbuf } 
| eof { raise End_of_file } 
| _ as char { Buffer.add_char buffer char; stringl buffer lexbuf } 

¿Hay una mejor manera?

Respuesta

5

Puede que le interese consultar cómo funciona el Ocaml lexer (busque and string). En esencia, es el mismo método que el tuyo, sin el buen búfer local (encuentro tu código más agradable en este punto, pero esto es un poco menos eficiente), un poco más complejo porque se admite más escape y usando una tabla de escape (char_for_backslash) para factorizar reglas similares.

Además, usted tiene la regla "\\n" repite dos veces, y creo que 1 es una estimación muy pesimista de la longitud de la cadena, prefiero utilizar 20 aquí (para evitar el cambio de tamaño no hace falta).

+0

¡Gracias! Una mina de oro de ejemplos. Nunca pensé que el código del compilador Ocaml fuera tan claro. – nimrodm

+1

@nimrodm, también debe tener en cuenta que parte del código allí es bastante antiguo, por lo que no todo refleja la mejor práctica actual del desarrollo OCaml. – gasche

Cuestiones relacionadas