9
我爲F#Lexer和Parser使用fslex/fsyacc實用程序。如果輸入文本的語法不正確,就必須知道它發生的地方。如何在F#中解析錯誤#
有可能確定在詞法不正確語義(令牌),並拋出一個異常,如果它使用了不正確的符號或文字:
rule token = parse
...
| integer { INT (Int32.Parse(lexeme lexbuf)) }
| "*=" { failwith "Incorrect symbol" }
| eof { EOF }
問題是更多地涉及分析器(fsyacc) - 如果輸入的文本有正確的令牌並被Lexer成功標記,但在解析過程中發生錯誤(例如,不正確的令牌或規則中缺少的令牌)
我知道如果發現異常,給出位置(行和列)解析失敗的地方:
try
Parser.start Lexer.token lexbuf
with e ->
let pos = lexbuf.EndPos
let line = pos.Line
let column = pos.Column
let message = e.Message // "parse error"
...
但是有可能(如果是的話 - 怎麼做?)來確定AST類,解析失敗。
例如是有可能寫出類似於我parser.fsy文件下面的內容:
Expression1:
| INT { Int $1 }
...
| _ { failwith "Error with parsing in Expression1"}
謝謝你的回答 - 它給了很多。試圖在我的代碼中添加解決方案 – Vitaliy 2011-03-09 12:54:58
這兩種解決方案(空白令牌和恢復示例的關鍵規則)都適用於我,因此再次感謝您。我正在接受答覆 – Vitaliy 2011-03-09 13:14:29