Я пытаюсь прочитать исходный код компилятора ocaml, использую исходный код 4.07
Я читаю его из файла driver / main.ml
Я заметил, что он использует функцию строки драйвера / pparse.ml 161 "parse "для разбора lex buf (я добавляю строку Printf.printf" pparse.parse "и после make world я использую boot / ocamlrun ./ocamlc -nostdlib -I stdlib -c a.ml, чтобы проверить его, записать в консоли"pparse.parse "):
let parse (type a) (kind : a ast_kind) lexbuf: a =
match kind with
| Structure->Parse.implementation lexbuf
| Signature->Parse.interface lexbuf
Я хочу знать, что Parse.implementation - это реализация функции из библиотеки переднего плана компилятора здесь: https://caml.inria.fr/pub/docs/manual-ocaml/parsing.html
или
из parseing / parse.ml, строка 61:
let implementation = wrap Parser.implementation
и после «make world» ocamlyacc генерирует parser.ml при разборе floder после «make world», функция Parser.implementation имеет вид:
let implementation (lexfun:Lexing.lexbuf -> token) (lexbuf : Lexing.lexbuf) =
(Parsing.yyparse yytables 1 lexfun lexbuf : Parsetree.structure)
Я не знаю, какой компилятор ocaml действительно использует.
Я изменяю синтаксический анализ функции следующим образом:
let parse (type a) (kind : a ast_kind) lexbuf : a =
match kind with
| Structure ->
Printf.printf "pparse.parse";
let a=Parse.implementation lexbuf in
let writehandle = open_out "/home/wk/prog/LocationTest/parsed" in
let fmt = Format.formatter_of_out_channel writehandle in
Format.fprintf fmt "%a@." Pprintast.structure a ;
close_out writehandle;
и после "make world", работает нормально. но после загрузки / ocamlrun ./ocamlc -nostdlib -I stdlib -c a.ml, анализируемый файл такой же, как a.ml, даже a.mlэто сложная программа
это слишком сложно? вы можете мне помочь? спасибо
и есть ли книга или другой документ, который может научить меня компилятору ocaml? спасибо!