Ocaml 打印字符串的标记化

Ocaml 打印字符串的标记化,ocaml,ocamllex,Ocaml,Ocamllex,我目前的业余爱好是编程语言。这将使lexing错误更容易调试。如果可以让ocamlex在找到它们时打印出它匹配的标记,我偶尔会手动将print语句添加到规则中,但应该有一种更简单的方法来完成 所以我要问的是,给定一个.mll文件和一些输入,是否有一种自动方式来查看相应的令牌?我认为没有一种内置方式来要求lexer打印其令牌 如果使用ocamlyacc,可以在OCAMLRUNPARAM中设置p选项以查看解析器操作的跟踪。这在OCaml手册的第1部分中进行了描述。有关OCAMLRUNPARAM的说明

我目前的业余爱好是编程语言。这将使lexing错误更容易调试。如果可以让ocamlex在找到它们时打印出它匹配的标记,我偶尔会手动将print语句添加到规则中,但应该有一种更简单的方法来完成


所以我要问的是,给定一个.mll文件和一些输入,是否有一种自动方式来查看相应的令牌?

我认为没有一种内置方式来要求lexer打印其令牌

如果使用ocamlyacc,可以在
OCAMLRUNPARAM
中设置
p
选项以查看解析器操作的跟踪。这在OCaml手册的第1部分中进行了描述。有关
OCAMLRUNPARAM
的说明,请参阅

如果你不介意一个粗糙的破解,我只是写了一个小脚本
lext
,它将跟踪添加到ocamlex生成的输出中:

#!/bin/sh
#
echo '
    let my_engine a b lexbuf =
        let res = Lexing.engine a b lexbuf in
        Printf.printf "Saw token [%s]'\\\\'n" (Lexing.lexeme lexbuf);
        res
'
sed 's/Lexing\.engine/my_engine/g' "$@"
它的工作原理如下:

$ cat ab.mll
rule token = parse
    [' ' '\t'] { token lexbuf }
  | '\n'       { 1 }
  | '+'        { 2 }
  | _          { 3 }
{
    let lexbuf = Lexing.from_channel stdin in
    try
        while true do
            ignore (token lexbuf)
        done
    with _ -> exit 0
}
$ ocamllex ab.mll
5 states, 257 transitions, table size 1058 bytes
$ lext ab.ml > abtraced.ml
$ ocamlopt -o abtraced abtraced.ml
$ echo 'a+b' | abtraced
Saw token []
Saw token [a]
Saw token [+]
Saw token [b]
Saw token [
]
Saw token []

为什么人们对此投了反对票?杰夫的回答总是出乎意料。