Менгир: - external-токены не могут найти модуль токенов - PullRequest
0 голосов
/ 03 июля 2019

У меня есть файл tokens.ml, в котором есть оператор type token. У меня также есть tokens.mli с тем же оператором type token. Теперь у меня есть parser.mly, который использует токены от tokens.mly. Я хочу, чтобы мои токены были в tokens.ml/mli, а мой парсер - parser.mly.

Итак, я попытался скомпилировать парсер с помощью команды

menhir parser.mly --table --explain --external-tokens Tokens

Это дает мне ошибку, говоря, что один из моих токенов не существует. В частности,

File "parser.mly", line 173, characters 4-12:
Error: OPERATOR is undefined.

Итак, менгир не находит модуль Tokens. Я не знаю, как сделать это видимым для menhir. Я попытался создать библиотеку tokens.cma, но даже тогда я все еще получаю ту же ошибку.

Менгиру, кажется, все равно, если модуль не существует, потому что, если я выполню команду

menhir parser.mly --table --explain --external-tokens SomeNonExistentModule

По-прежнему выдает ту же ошибку о том, что OPERATOR не определено.

Как мне заставить Менгира найти модуль моих токенов. Я бы предпочел не использовать ocamlbuild. Если вы предлагаете решение ocamlbuild, пожалуйста, объясните хотя бы промежуточные шаги, которые я мог бы выполнить вместо этого. Я хочу понять, чего ожидает Менгир.

1 Ответ

3 голосов
/ 03 июля 2019

Как обсуждалось в комментариях, ошибка возникает из-за того, что у вас нет

%token OPERATOR

объявление в вашем .mly файле.

Опция Menhir --external-tokens T существует для того, чтобы сгенерированный модуль синтаксического анализа использовал T.token вместо генерации типа токена из объявлений, однако объявления по-прежнему необходимы внутри файла .mly.

В качестве дополнительного примечания вы можете хранить свои токены в отдельном файле .mly (например, tokens.mly), который будет выглядеть следующим образом:

tokens.mly:

%token <int> INT
%token EOF
%%

parser.mly:

%start <int> f
%%

f : n = INT; EOF { n }

и затем вы можете запустить следующие команды:

menhir tokens.mly --only-tokens
menhir parser.mly tokens.mly --external-tokens Tokens --base parser

, что может быть полезно, если вы хотите повторно использовать токены в парсерах и т. Д.

(вы также можете пропустить бит --only-tokens и написать tokens.ml вручную, чтобы соответствовать tokens.mly)

...