Извлечь список токенов из OCamllex lexbuf - PullRequest
0 голосов
/ 04 ноября 2018

Я пишу интерпретатор Python в OCaml, используя ocamllex, и для обработки синтаксиса, основанного на отступах, я хочу

  1. токенизация ввода с использованием ocamllex
  2. переберите список лексированных токенов и вставьте токены INDENT и DEDENT, необходимые для синтаксического анализатора
  3. разобрать этот список в AST

Однако в ocamllex шаг lexing создает поток lexbuf, который не может быть легко повторен для проверки отступа. Есть ли хороший способ извлечь список токенов из lexbuf, т.е.

let lexbuf = (Lexing.from_channel stdin) in
let token_list = tokenize lexbuf

где token_list имеет тип Parser.token list? Мой хак должен был определить тривиальный синтаксический анализатор как

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 *)

но это имеет всевозможные проблемы с ошибками смещения-уменьшения и ненужной сложностью. Есть ли лучший способ написать функцию списка lexbuf -> Parser.token в OCaml?

...