2011-10-28 30 views
4

我使用F#Power Pack中的fsyacc/fslex來解析某些源代碼。使用FSyacc解析期間有意義的錯誤

爲了檢測我用下面的代碼中的錯誤:

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: 

我怎樣才能正確地得到行號在哪個錯誤發生?

+0

一個規則來手動增加行數爲什麼不對它進行調試?你也可以添加fslex項目來調試它 – Cynede

回答

3

在詞法,你需要像

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

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

是的,我對lexer有這樣的規則。 –

+0

嗯,也許你的換行符case由於某種原因不匹配 - 它很難調試fslex lexing,但我會仔細檢查你的換行符對你的換行符是否正確。也許你可以添加一個printf語句來查看你是否真的進入了換行符(也許你從來沒有達到它,因爲以前的規則消耗換行符)? –

+0

是的,你是對的。在解析之前,我損壞了換行符。謝謝 :) –

相關問題