打印字符串的标记化



我目前正在学习一门编程语言作为爱好。如果有可能让ocamllex打印出它匹配的令牌,它将使词法分析错误更容易调试,我偶尔只是手动将打印语句添加到我的规则中,但应该有一个更简单的方法来做到这一点。

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

我不认为有一个内置的方法来要求词法分析器打印它的令牌。

如果您使用ocamlyacc,您可以在OCAMLRUNPARAM中设置p选项,以查看解析器操作的跟踪。OCaml手册的第12.5节对此进行了描述。OCAMLRUNPARAM的描述见章节10.2。

如果您不介意简单的修改,我刚刚编写了一个小脚本lext,它将跟踪添加到ocamllex生成的输出中:

#!/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 []

相关内容

  • 没有找到相关文章

最新更新