【问题标题】:Is it possible to debug the Menhir lexer?是否可以调试 Menhir 词法分析器?
【发布时间】:2021-05-02 10:34:48
【问题描述】:

可以调试 Menhir 生成的解析器,例如menhir --interpret --interpret-show-cst parser.mly。是否也可以调试词法分析器创建的标记?我没有在 Manhir 手册页或在线找到任何内容。

例如调试“1+2”会吐出“INT 1 PLUS INT 2”令牌列表。

查看生成的 parser.ml 模块,有一个具有令牌类型的 MenhirBasics 模块,但没有 string_of_token 或类似的。哦,令牌类型在 parser.mli 文件中公开。如果 Menhir 可以生成 [@@deriving show] 或类似内容,那就太好了。

相关 Gitlab 问题:https://gitlab.inria.fr/fpottier/menhir/-/issues/6

【问题讨论】:

    标签: ocaml menhir


    【解决方案1】:

    如果要打印已解析的标记,只需在 lexer.mll 文件中打印即可:

    {
      open Parser
    
      exception Error of string
    }
    
    rule token = parse
    | [' ' '\t' '\n'] as c
        { Format.eprintf "%c" c; token lexbuf }
    | ';'
        { Format.eprintf ";"; SEMICOLON }
    | ['0'-'9']+ as i
        { Format.eprintf "INT %s" i; INT (int_of_string i) }
    | '+'
        { Format.eprintf "PLUS"; PLUS }
    | '-'
        { Format.eprintf "MINUS"; MINUS }
    | '*'
        { Format.eprintf "TIMES"; TIMES }
    | '/'
        { Format.eprintf "DIV"; DIV }
    | '('
        { Format.eprintf "LPAREN"; LPAREN }
    | ')'
        { Format.eprintf "RPAREN"; RPAREN }
    | eof
        { Format.eprintf "EOF"; EOF }
    | _
        { raise (Error (Printf.sprintf "At offset %d: unexpected character.\n" (Lexing.lexeme_start lexbuf))) }
    

    你觉得可以吗?

    【讨论】:

    • 这与我已经做过的创建自己的 string_of_token 函数没有太大区别。 :d
    • :D 如果您直接在 lexer.mll 中使用它,那么确实没有任何区别,但我不知道如果没有这种手工制作的解决方案,目前如何做到这一点。能够使用[@@deriving] 将非常有用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-09
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多