【问题标题】:OCaml: How to test scanner and parser?OCaml:如何测试扫描仪和解析器?
【发布时间】:2016-07-12 03:42:19
【问题描述】:

我们正在用 OCaml 为我们自己的领域特定语言编写编译器。到目前为止,我们已经有了可用的扫描仪、解析器和 ast。

此时测试扫描仪/解析器的最佳方法是什么?我知道可以将一系列令牌传递给解析器/扫描器,看看它是否被扫描器/解析器接受/拒绝。 (例如,echo "FLOAT ID" | menhir --interpret --interpret-show-cst parser.mly)。
但是,有没有办法将用我们自己的语言编写的实际程序传递给扫描器/解析器并查看它是否被接受?

我必须补充一点,我对 OCaml 很陌生,而且我对编译器知之甚少。

【问题讨论】:

  • 你不能使用 Lexing.from_channel 或 Lexing.from_string 吗? val from_string : string -> lexbuf 创建一个从给定字符串读取的词法分析器缓冲区。读取从字符串中的第一个字符开始。当到达字符串的结尾时,会生成一个输入结束条件。
  • 你能举个例子吗?

标签: parsing ocaml


【解决方案1】:

如果你想做的是给你的解析器一个字符串,看看它是否有效,你可以这样做(假设你在解析器中的起点是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"

我有帮助吗? ;-)

【讨论】:

  • 是的,这很有帮助。谢谢。它给了我一个警告,变量“p”没有在任何地方使用。
  • 是的,那是因为我不知道你想用它做什么。如果你写了,在你的解析器 %start prog 那么 p 将是 Ast.ast 类型,你可以用它做任何你想做的事情;- ) 如果您不想使用它,只需编写 let _ = Parser.prog Lexer.token lb (不要忘记投票并接受答案;-))我>
  • 这个变量将持有什么?
  • 该变量将保存您的解析结果或您的 prog 规则产生的任何结果。
  • 感谢您的帮助。我如何投票并接受答案?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-12
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多