2011-06-14 9 views
5

Mi modelo AST necesita llevar información de ubicación (nombre de archivo, línea, índice). ¿Hay alguna forma integrada para acceder a esta información? De los documentos de referencia, la transmisión parece llevar la posición, pero preferiría no tener que implementar un analizador ficticio solo para guardar la posición, y agregar eso en todas partes.Información de posición en fparsec

Gracias de antemano

Respuesta

7

analizadores son en realidad tipo abreviaturas para las funciones de las corrientes de respuestas:

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

Teniendo esto en mente, se puede escribir fácilmente un analizador personalizado para las posiciones:

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

y adjuntar información de posición a cada bit que analiza utilizando

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

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

Usted puede mantener el cambio de código requerido restringida a una sola línea y evitar código incontrolable propagación:

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  *) 

actualización: FParsec tiene un programa de análisis predefinido para posiciones: http://www.quanttec.com/fparsec/reference/charparsers.html#members.getPosition

+1

Usted don en realidad necesita definir el analizador de posición usted mismo: http://www.quanttec.com/fparsec/reference/charparsers.html#members.getPosition –

+0

Lo siento, no leí la referencia completa de fparsec^__^" –

+1

No hay problema, gracias por responder la pregunta :-) Por cierto, también hay una descripción general del analizador: http://www.quanttec.com/fparsec/reference/parser-overview.html#user-state-handling-and-getting- the-input-stream-position –

Cuestiones relacionadas