我正在为我的 F# Lexer 和 Parser 使用 fslex/fsyacc 实用程序。如果输入文本的语法不正确,则有必要知道它发生的位置。
可以在 Lexer 中确定不正确的词位(标记)并在使用不正确的符号或单词时抛出异常:
rule token = parse
...
| integer { INT (Int32.Parse(lexeme lexbuf)) }
| "*=" { failwith "Incorrect symbol" }
| eof { EOF }
这个问题更多地与 Parser (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"}