我正在使用 ocamllex 在 OCaml 中编写 Python 解释器,为了处理基于缩进的语法,我想
- 使用 ocamllex 标记输入
- 遍历 lexed 标记列表并根据解析器的需要插入 INDENT 和 DEDENT 标记
- 将此列表解析为 AST
然而,在 ocamllex 中,词法分析步骤会产生一个 lexbuf 流,该流不能轻易地迭代以进行缩进检查。有没有一种从 lexbuf 中提取标记列表的好方法,即
let lexbuf = (Lexing.from_channel stdin) in
let token_list = tokenize lexbuf
token_list 类型 Parser.token 列表在哪里?我的技巧是定义一个简单的解析器,比如
tokenize: /* used by the parser to read the input into the indentation function */
| token EOL { $1 @ [EOL] }
| EOL { SEP :: [EOL] }
token:
| COLON { [COLON] }
| TAB { [TAB] }
| RETURN { [RETURN] }
...
| token token %prec RECURSE { $1 @ $2 }
并称之为
let lexbuf = (Lexing.from_channel stdin) in
let temp = (Parser.tokenize Scanner.token) lexbuf in (* char buffer to token list *)
但这有各种各样的问题,比如减少班次错误和不必要的复杂性。有没有更好的方法在 OCaml 中编写 lexbuf -> Parser.token 列表函数?