我目前正在编写一种编程语言作为业余爱好。如果有可能让ocamllex打印出它匹配的标记,那么它会使lexing错误更容易调试,我偶尔会手动将print语句添加到我的规则中,但应该有一种更简单的方法。
所以我要问的是,给定.mll文件和一些输入,是否有自动方式查看相应的标记?
答案 0 :(得分:5)
我不认为有一种内置方法可以让词法分析者打印其代币。
如果您使用ocamlyacc,则可以在p
中设置OCAMLRUNPARAM
选项以查看解析器操作的跟踪。这在OCaml手册的Section 12.5中有所描述。有关OCAMLRUNPARAM
的说明,请参阅Section 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 []