ocamlyacc解析错误:什么令牌?

Arj*_*uha 15 ocaml ocamlyacc

我正在使用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应该在词法分析器中更新以包含正确的位置.(来源)

  • 你在哪里找到Sql_lexer.和错误? (2认同)