使用FSyacc进行解析时出现有意义的错误

4

我正在使用F# Power Pack中的fsyacc/fslex来解析一些源代码。

为了检测错误,我使用以下代码:

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:

如何正确获取发生错误的行号?


为什么不调试一下呢?另外,您也可以添加fslex项目来进行调试。 - cnd
1个回答

3
在词法分析过程中,您需要使用以下规则手动增加行号:
...
let newline = ('\n' | '\r' '\n')

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

是的,我对词法分析器有这样的规则。 - Evgeny Gavrin
嗯,也许你的换行符情况由于某种原因不匹配 - 调试fslex词法分析很困难,但我会仔细检查你的实际换行符是否与你的换行符正则表达式相匹配。也许你可以添加一个printf语句来查看你是否真的进入了换行符情况(也许你从未到达它,因为早期的规则消耗了换行符标记?) - Stephen Swensen
是的,你说得对。在解析之前我破坏了换行符。谢谢 :) - Evgeny Gavrin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接