问题描述
可以调试由 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))) }
这样对你好吗?