Распечатать токенизацию строки

В настоящее время я работаю над языком программирования в качестве хобби. Было бы значительно легче отлаживать ошибки лексизма, если бы ocamllex мог распечатать токены, которые ему соответствуют, когда он их находит. Иногда я просто добавляю операторы печати в свои правила вручную, но должен быть более простой способ сделать это.

Итак, что я спрашиваю, учитывая файл.mll и некоторые входные данные, есть ли автоматический способ просмотра соответствующих токенов?

1 ответ

Решение

Я не думаю, что есть встроенный способ попросить лексера распечатать его токены.

Если вы используете ocamlyacc, вы можете установить p вариант в OCAMLRUNPARAM чтобы увидеть след действия парсера. Это описано в разделе 12.5 руководства OCaml. См. Раздел 10.2 для описания OCAMLRUNPARAM,

Если вы не возражаете против грубого взлома, я просто написал небольшой сценарий lext это добавляет трассировку к выводу, сгенерированному ocamllex:

#!/bin/sh
#
echo '
    let my_engine a b lexbuf =
        let res = Lexing.engine a b lexbuf in
        Printf.printf "Saw token [%s]'\\\\'n" (Lexing.lexeme lexbuf);
        res
'
sed 's/Lexing\.engine/my_engine/g' "$@"

Это работает так:

$ cat ab.mll
rule token = parse
    [' ' '\t'] { token lexbuf }
  | '\n'       { 1 }
  | '+'        { 2 }
  | _          { 3 }
{
    let lexbuf = Lexing.from_channel stdin in
    try
        while true do
            ignore (token lexbuf)
        done
    with _ -> exit 0
}
$ ocamllex ab.mll
5 states, 257 transitions, table size 1058 bytes
$ lext ab.ml > abtraced.ml
$ ocamlopt -o abtraced abtraced.ml
$ echo 'a+b' | abtraced
Saw token []
Saw token [a]
Saw token [+]
Saw token [b]
Saw token [
]
Saw token []
Другие вопросы по тегам