Ocamllex Синтаксическая проблема

{ }
rule translate = parse
| "current_directory" { print_string (Sys.getcwd ()) }
| _ as c { print_char c }
| eof { exit 0 }
{
let main () =
let lexbuf = Lexing.from_channel stdin in
while true do
translate lexbuf
done
let _ = Printexc.print main ()
}

Может кто-нибудь объяснить мне, как работает основная функция? Я понял часть регулярного выражения и могу понять основную функцию, но не точное значение.


person alpha42    schedule 16.02.2013    source источник


Ответы (1)


Функция main выглядит так:

let main () =
  let lexbuf = Lexing.from_channel stdin in
  while true do
    translate lexbuf
  done

Он создает lexbuf, используя стандартный ввод в качестве источника, а затем повторно вызывает translate, используя этот lexbuf. Тип translateLexing.lexbuf -> unit. Он ожидает lexbuf, ищет один токен и выполняет связанное с ним правило. Вы определяете правило для eof, которое вызывает выход из программы, что завершает while.

Следующая строка запускает функцию main:

let _ = Printexc.print main ()

Это вызывает main, передавая его (). Если во время выполнения возникнет исключение, Printexc.print распечатает его описание. Поскольку в тесте не возникает никаких исключений, в конце концов вы достигаете конца файла, и правило eof приводит к выходу программы.

person Jeffrey Scofield    schedule 16.02.2013