FParsec: сохранение номеров строк и столбцов - PullRequest
1 голос
/ 09 апреля 2019

Каков наилучший способ извлечь номера строк и столбцов из заданного парсера, чтобы их можно было добавить, например, в AST?

Спасибо!

1 Ответ

2 голосов
/ 09 апреля 2019

Вы можете использовать getPosition, который является синтаксическим анализатором, который не потребляет ввода и возвращает текущую позицию. Например:

type WithPos<'T> = { value: 'T; start: Position; finish: Position }

module Position =
    /// Get the previous position on the same line.
    let leftOf (p: Position) =
        if p.Column > 1L then
            Position(p.StreamName, p.Index - 1L, p.Line, p.Column - 1L)
        else
            p

/// Wrap a parser to include the position
let withPos (p: Parser<'T, 'U>) : Parser<WithPos<'T>, 'U> =
    // Get the position before and after parsing
    pipe3 getPosition p getPosition <| fun start value finish ->
        {
            value = value
            start = start
            finish = Position.leftOf finish
        }

// Example use:

let s = pstring "test" |> withPos

printfn "%A" <| runParserOnString s () "" "test"
// Prints:
// Success: {value = "test";
//  start = (Ln: 1, Col: 1);
//  finish = (Ln: 1, Col: 4);}
...