1

我正在使用 ocamllex 在 OCaml 中编写 Python 解释器,为了处理基于缩进的语法,我想

  1. 使用 ocamllex 标记输入
  2. 遍历 lexed 标记列表并根据解析器的需要插入 INDENT 和 DEDENT 标记
  3. 将此列表解析为 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 列表函数?

4

0 回答 0