2013-02-16 5 views
2
{ } 
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() 
} 

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

ответ

1

main функция выглядит следующим образом:

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

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

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

let _ = Printexc.print main() 

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