是否可以调试 Menhir 词法分析器?

问题描述

可以调试由 menhir 生成的解析器,例如FutureBuilder。是否也可以调试词法分析器创建了哪些令牌?我没有在 Manhir 手册页或在线找到任何内容

比如调试“1+2”会吐出“INT 1 PLUS INT 2”token list。

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

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

解决方法

如果你想打印被解析的标记,你可以简单地在 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))) }

这样对你好吗?