首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ocamlyacc解析错误:什么标记?

ocamlyacc解析错误:什么标记?
EN

Stack Overflow用户
提问于 2009-12-19 22:56:58
回答 3查看 7.8K关注 0票数 16

我使用ocamlyacc和ocamllex。我的语法中有一个错误结果,它发出自定义异常的信号。到目前为止,我可以让它报告错误位置:

代码语言:javascript
复制
| error { raise (Parse_failure (string_of_position (symbol_start_pos ()))) }

但是,我也想知道哪个令牌被读取了。一定有办法,-有人知道吗

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-12-21 17:05:53

令牌是由lexer生成的,因此当出现错误时,您可以使用当前的lexer令牌:

代码语言:javascript
复制
  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

Lexing.lexeme lexbuf就是您所需要的。其他部分不是必需的,但很有用。ruleTail会将所有剩余的令牌连接成字符串,以便用户轻松定位错误位置。应该在词法分析器中更新lexbuf.Lexing.lex_curr_p以包含正确的位置。(source)

票数 16
EN

Stack Overflow用户

发布于 2010-07-29 15:02:30

调试ocamlyacc解析器的最好方法是将OCAMLRUNPARAM参数设置为包含字符p -这将使解析器打印它所经历的所有状态,并执行每一次shift / reduce操作。

如果您使用的是bash,可以使用以下命令执行此操作:

代码语言:javascript
复制
$ export OCAMLRUNPARAM='p'
票数 22
EN

Stack Overflow用户

发布于 2009-12-19 23:42:40

我认为,与yacc类似,令牌存储在与语法规则中的符号相对应的变量中。这里只有一个符号(错误),你可以简单地使用printf输出$1,依此类推。

编辑:回复评论。

为什么要使用error终端?我正在读一篇ocamlyacc教程,它说当发生解析错误时,会调用一个特殊的错误处理例程。如下所示:

3.1.5。错误报告例程

当解析器函数检测到语法错误时,它会调用一个名为parse_error的函数,并将字符串“语法错误”作为参数。默认的parse_error函数不执行任何操作并返回,从而启动错误恢复(请参阅错误恢复)。用户可以在语法文件的标题部分定义自定义的parse_error函数,例如:

代码语言:javascript
复制
let parse_error s = (* Called by the parser function on error *)
  print_endline s;
  flush stdout

好吧,看起来你只得到了“语法错误”的函数。更多信息敬请关注。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1933101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档