OCaml:如何测试扫描器和解析器?
OCaml: How to test scanner and parser?
我们正在为我们自己的领域特定语言编写 OCaml 编译器。到目前为止,我们有可用的扫描器、解析器和 ast。
此时测试 scanner/parser 的最佳方法是什么?我知道可以将一系列标记传递给 parser/scanner 并查看它是否通过 scanner/parser 获得 accepted/rejected。 (例如,echo "FLOAT ID" | menhir --interpret --interpret-show-cst parser.mly
)。
但是,有没有办法将用我们自己的语言编写的实际程序传递给 scanner/parser 并查看它是否被接受?
我必须补充一点,我是 OCaml 的新手,对编译器知之甚少。
如果你想做的是给你的解析器一个字符串,看看它是否有效,你可以这样做(假设你在解析器中的起点是 prog)
main.ml :
let () =
(* Taking the string given as a parameter or the program *)
let lb = Lexing.from_string Sys.argv.(1) in
(* if you want to parse a file you should write :
let ci = open_in filename in
let lb = Lexing.from_channel ci in
*)
try
let p = Parser.prog Lexer.token lb in
Printf.printf "OK\n"
with _ -> Printf.printf "Not OK\n"
我有帮助吗? ;-)
我们正在为我们自己的领域特定语言编写 OCaml 编译器。到目前为止,我们有可用的扫描器、解析器和 ast。
此时测试 scanner/parser 的最佳方法是什么?我知道可以将一系列标记传递给 parser/scanner 并查看它是否通过 scanner/parser 获得 accepted/rejected。 (例如,echo "FLOAT ID" | menhir --interpret --interpret-show-cst parser.mly
)。
但是,有没有办法将用我们自己的语言编写的实际程序传递给 scanner/parser 并查看它是否被接受?
我必须补充一点,我是 OCaml 的新手,对编译器知之甚少。
如果你想做的是给你的解析器一个字符串,看看它是否有效,你可以这样做(假设你在解析器中的起点是 prog)
main.ml :
let () =
(* Taking the string given as a parameter or the program *)
let lb = Lexing.from_string Sys.argv.(1) in
(* if you want to parse a file you should write :
let ci = open_in filename in
let lb = Lexing.from_channel ci in
*)
try
let p = Parser.prog Lexer.token lb in
Printf.printf "OK\n"
with _ -> Printf.printf "Not OK\n"
我有帮助吗? ;-)