Pregunta

Mi modelo AST necesita llevar información de ubicación (nombre de archivo, línea, índice). ¿Hay alguna forma incorporada de acceder a esta información? Desde los documentos de referencia, la corriente parece llevar la posición, pero prefiero que no tenga que implementar un analizador ficticio solo para guardar la posición y agregarla en todas partes.

Gracias por adelantado

¿Fue útil?

Solución

Los analizadores son en realidad abreviaturas de tipo para funciones de transmisiones a respuestas:

Parser<_,_> is just CharStream<_> -> Reply<_>

Teniendo eso en cuenta, puede escribir fácilmente un analizador personalizado para posiciones:

let position : CharStream<_> -> Reply<Position> = fun stream -> Reply(stream.Position)
(* OR *)
let position : Parser<_,_> = fun stream -> Reply stream.Position

e información de posición de atttach a cada parte que analiza usando

position .>>. yourParser (*or tuple2 position yourParser*)

El analizador de posición no consume ninguna entrada y, por lo tanto, es seguro combinarse de esa manera.

pueden Mantenga el cambio de código requerido restringido a una sola línea y evite la propagación del código incontrolable:

type AST = Slash of int64
         | Hash  of int64

let slash : Parser<AST,_> = char '/' >>. pint64 |>> Slash
let hash  : Parser<AST,_> = char '#' >>. pint64 |>> Hash
let ast   : Parser<AST,_> = slash <|> hash

(*if this is the final parser used for parsing lists of your ASTs*)
let manyAst  : Parser<            AST  list,_> = many                (ast  .>> spaces)

let manyAstP : Parser<(Position * AST) list,_> = many ((position .>>. ast) .>> spaces)
(*you can opt in to parse position information for every bit
  you parse just by modifiying only the combined parser     *)

Actualizar: FPARSEC tiene un analizador predefinido para posiciones:http://www.quanttec.com/fparsec/reference/charparsers.html#members.getposition

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