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

흠, 어쩌면 당신의 newline case가 어떤 이유로 일치하지 않습니다. fslex lexing을 디버그하기는 어렵지만 실제로는 개행이 개행 정규식에 맞는지 다시 한번 확인해야합니다. 그리고 실제로 newline의 경우에 들어가는지를 printf 명령문에 추가 할 수 있습니다 (새 줄 토큰을 사용하는 이전 규칙 때문에 도달 할 수 없을 수도 있습니다). –

+0

그래, 네가 옳았다. 파싱하기 전에 개행을 손상 시켰습니다. 고맙습니다 :) –

관련 문제