Значимые ошибки при разборе с FSyacc - PullRequest
4 голосов
/ 28 октября 2011

Я использую fsyacc / fslex из F # Power Pack для анализа исходного кода.

Для обнаружения ошибок я использую следующий код:

use inputChannel = new StreamReader(File.OpenRead tempFileName)
let lexbuf = Lexing.LexBuffer<_>.FromTextReader inputChannel

let ast = try
                Parser.start Lexer.tokenize lexbuf
              with e ->
                let pos = lexbuf.EndPos
                let line = pos.Line
                let column = pos.Column
                let message = e.Message
                let lastToken = new System.String(lexbuf.Lexeme)
                printf "Parse failed at line %d, column %d:\n" line column
                printf "Last loken: %s" lastToken
                printf "\n"
                exit 1   

Но когда этот код выдаетсообщение об ошибке при разборе многострочного исходного файла, неправильная позиция строки и столбца:

Parse failed at line 0, column 10899:

Как правильно получить номер строки, в которой произошла ошибка?

1 Ответ

3 голосов
/ 28 октября 2011

Во время лексирования вам нужно вручную увеличивать номер строки с помощью правила типа

...
let newline = ('\n' | '\r' '\n')

rule tokenize = parse
| newline    { lexbuf.EndPos <- lexbuf.EndPos.NextLine; tokenize lexbuf }
...
...