FSyacc ile ayrıştırma sırasında anlamlı hatalar

Bazı kaynak kodları ayrıştırmak için F # Power Pack'ten fsyacc/fslex kullanıyorum.

Hataları tespit etmek için aşağıdaki kodu kullanıyorum:

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   

Ancak bu kod çok satırlı kaynak dosyayı ayrıştırırken hata mesajı atarsa, yanlış satır ve sütun konumu elde ediyorum:

Parse failed at line 0, column 10899:

Hangi hatanın meydana geldiğini doğru olarak nasıl hat numarası alabilirim?

4
Neden hata ayıklamıyorsun? Ayrıca hata ayıklamak için fslex projesi ekleyebilirsiniz
katma yazar Cynede, kaynak

1 cevap

Lexing sırasında satır numarasını manuel

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

rule tokenize = parse
| newline    { lexbuf.EndPos <- lexbuf.EndPos.NextLine; tokenize lexbuf }
...
3
katma
Hmm, belki de yeni dava durumunuz bir nedenden dolayı eşleşmiyor - fslex lexing'in hatalarını ayıklamak zor, ama yeni satırlarınızın redaksiniz için doğru olduğunu kontrol ediyorum. Ve belki de aslında newline davasına girip girmediğinizi görmek için bir printf deyimi ekleyebilirsiniz (belki yeni satır belirtecini tüketen daha önceki bir kural nedeniyle asla erişemezsiniz?)
katma yazar Stephen Swensen, kaynak
Evet, Lexer için böyle bir kuralım var.
katma yazar Evgeny Gavrin, kaynak
Evet haklıydın. Ayrıştırmadan önce yeni satırları bozdum. Teşekkür ederim :)
katma yazar Evgeny Gavrin, kaynak