Компилятор ocaml использует синтаксический анализ модуля компилятора для анализа исходного кода или использует ocamlyacc для анализа исходного кода? - PullRequest
0 голосов
/ 11 сентября 2018

Я пытаюсь прочитать исходный код компилятора 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? спасибо!

1 Ответ

0 голосов
/ 11 сентября 2018

Сам парсер генерируется ocamlyacc (или менгиром в OCaml 4.08) как parsing/parser.ml из parsing/parser.mly. Модуль parsing/parse оборачивает результирующую функцию, чтобы добавить некоторую обработку ошибок парсера. Наконец, модуль driver/pparse - это еще один слой поверх parsing/parse, который управляет настройкой среды синтаксического анализатора и этапами предварительной обработки.

Затем библиотека compiler-libs повторно экспортирует некоторые внутренние модули компиляторов.

См. https://github.com/ocaml/ocaml/blob/trunk/parsing/HACKING.adoc для получения дополнительной информации.

...