我正在使用ocamlyacc和ocamllex.我的语法中出现错误,表示自定义异常.到目前为止,我可以让它报告错误位置:
| error { raise (Parse_failure (string_of_position (symbol_start_pos ()))) }
Run Code Online (Sandbox Code Playgroud)
但是,我也想知道读了哪个令牌.必须有办法---任何人都知道吗?
谢谢.
a_m*_*m0d 20
调试ocamlyacc解析器的最佳方法是将OCAMLRUNPARAM参数设置为包含字符p- 这将使解析器打印它经历的所有状态,并且每次移位/减少它都会执行.
如果您使用的是bash,则可以使用以下命令执行此操作:
$ export OCAMLRUNPARAM='p'
Run Code Online (Sandbox Code Playgroud)
ygr*_*rek 16
标量由词法分析器生成,因此您可以在发生错误时使用当前的词法分析器标记:
let parse_buf_exn lexbuf =
try
T.input T.rule lexbuf
with exn ->
begin
let curr = lexbuf.Lexing.lex_curr_p in
let line = curr.Lexing.pos_lnum in
let cnum = curr.Lexing.pos_cnum - curr.Lexing.pos_bol in
let tok = Lexing.lexeme lexbuf in
let tail = Sql_lexer.ruleTail "" lexbuf in
raise (Error (exn,(line,cnum,tok,tail)))
end
Run Code Online (Sandbox Code Playgroud)
Lexing.lexeme lexbuf是你需要的.其他部分不是必需的,但有用.
ruleTail将所有剩余的令牌连接成字符串,以便用户轻松找到错误位置.lexbuf.Lexing.lex_curr_p应该在词法分析器中更新以包含正确的位置.(来源)
| 归档时间: |
|
| 查看次数: |
6853 次 |
| 最近记录: |