我正在尝试在Ocaml版本4.02.5中构建一个词法分析器,我似乎无法使用流类型工作,我几乎找不到任何对Ocaml有用的东西。我阅读的大多数内容都过于复杂,没有关于从文件中获取字符串输入并将其搞砸的示例。
我收到的错误是在我的第一个流声明中,具体语法位置在'[<'一部分。
open Printf;;
open Stream;;
type sign =
Plus
| Minus;;
type atom =
T
| NIL
| Int of int
| Ident of string;;
type token =
Lparen
| Rparen
| Dot
| Sign of sign
| Atom of atom;;
Stream.t char s from "lines.txt";;
let rec spaces s=
match s with parser
[< '' '|' '\t' | '\n' ; _ >] -> spaces s (* ERROR HERE ON '[<' *)
| [< >] -> ()
;;
let rec lexid str s =
match s with parser
[< ' 'a'..'z'| 'A'....'Z'| '0'...'9' as c; _ >] -> lexid (str ^ (Char.escaped c)) s
| [< >] -> str;;
let rec lexint v s=
match s with parser
[< ‘’0’..’9’ as n; _ >] -> lexint ((10*v)+(int_of_string(Char.escaped n))) s
| [< >] -> v
;;
答案 0 :(得分:1)
在2001年底发布的3.03版本的OCaml中删除了对流语法的直接支持。
从那时起,camlp4就提供了对这些语法扩展的支持。
然而,camlp4本身现在已被弃用,转而支持ppx。由于您使用的是旧版本的OCaml(4.02是从2015年开始),因此可以使用camlp4。
OCaml 4.02的手册说明如下:
使用流解析器语法的OCaml程序应使用-pp camlp4o选项编译为ocamlc和ocamlopt。对于交互式使用,运行ocaml并发出#load“dynlink.cma”;;命令,后跟#load“camlp4o.cma”;;命令。