2015-09-16 2 views
0

У меня есть тривиальный лексер, взятый из учебника (http://plus.kaist.ac.kr/~shoh/ocaml/ocamllex-ocamlyacc/ocamllex-tutorial/sec-ocamllex-some-simple-examples.html)Как использовать лексер порожденную ocamllex

{ } 
rule translate = parse 
    | "c"   { print_string (Sys.getcwd()); translate lexbuf } 
    | _ as c  { print_char c; translate lexbuf } 
    | eof   { exit 0 } 

После создания лексера OCaml и создания исполняемого файла,

ocamllex testlexer.mll && ocamlc -o testlexer testlexer.ml

я пытаю передать содержимое через stdin echo c | ./testlexer и через файл ./testlexer input, но не работает.

Я также не вижу никакой логики в сгенерированном testlexer.ml для чтения из файла stdin или файла, означает ли он быть включенным в качестве модуля в другую программу или использован другим инструментом генерации кода, например ocamlyacc?

ответ

2

Вам нужна функция main (по существу). Вы можете приспособить его к другим примерам на этой странице.

Вот полный пример, который я написал:

{ } 
rule translate = parse 
    | "c"   { print_string (Sys.getcwd()); translate lexbuf } 
    | _ as c  { print_char c; translate lexbuf } 
    | eof   { exit 0 } 

{ 
    let main() = 
    let lexbuf = Lexing.from_channel stdin in translate lexbuf 

    let() = main() 
} 

Это, кажется, работает как задумано:

$ ocamllex l.mll 
4 states, 257 transitions, table size 1052 bytes 
$ ocamlc -o l l.ml 
$ echo c/itworks | ./l 
/home/jeffsco/tryll2/itworks 

Update

К сожалению, я забыл ответить на другие вопросы , Да, без функции main, исходный код может быть модулем в более крупной программе. Это может быть программа, которую пользователи ocamlyacc, или нет.