2011-10-28 6 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

はい、私はレクサーのためのそのようなルールを持っています。 –

+0

ええ、あなたの改行の大文字と小文字は何らかの理由で一致しないかもしれません.fslexのレキシングをデバッグするのは難しいですが、あなたの実際の改行が改行正規表現に対して正しいかどうかを再確認します。そして、実際に改行ケースに入っているかどうかを調べるためにprintf文を追加することもできます(改行トークンを使用する以前のルールのために決して届かないかもしれません)。 –

+0

ええ、そうでした。私は解析する前に改行を壊しました。ありがとうございました :) –

関連する問題