Я пишу интерпретатор Python в OCaml, используя ocamllex, и для обработки синтаксиса, основанного на отступах, я хочу
- токенизация ввода с использованием ocamllex
- переберите список лексированных токенов и вставьте токены INDENT и DEDENT, необходимые для синтаксического анализатора
- разобрать этот список в 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?