Menhir: --external-tokens изглежда не може да намери модул Tokens

Имам файл 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.

Така че menhir не намира модула Tokens. Не знам как да го направя видим за menhir. Опитах се да направя библиотека tokens.cma, но дори тогава все още получавам същата грешка.

Menhir изглежда не се интересува дали модулът не съществува, защото ако изпълня командата

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

Все още дава същата грешка, че OPERATOR е недефиниран.

Как да накарам Menhir да намери моя модул за токени. Бих предпочел да не използвам ocamlbuild. Ако предлагате решение на ocamlbuild, моля, обяснете поне междинните ръчни стъпки, които мога да направя вместо това. Искам да разбера какво очаква Менхир.


person Enrico Borba    schedule 02.07.2019    source източник
comment
Във вашия файл parser.mly все още ли имате директивата %token OPERATOR в горната част?   -  person zehnpaard    schedule 03.07.2019
comment
Трябва ли да имам това? Това определено го нямам   -  person Enrico Borba    schedule 03.07.2019
comment
Вярвам, че е така... Моето разбиране е, че директивата --external-tokens съществува само така, че генерираните файлове parser.ml и .mli няма да имат дефиниран тип токен, а вместо това ще препращат към външния токен модул. Все още имате нужда от %token ... във файла .mly   -  person zehnpaard    schedule 03.07.2019
comment
Така или иначе ви е необходим за указване на приоритет/асоциативност, както и документи намекват за автоматично генериране на файла tokens.ml от спецификацията на граматиката, така че се предполага, че директивите %token са там   -  person zehnpaard    schedule 03.07.2019
comment
Да, но документите също казват, че файлът с токени може да бъде написан на ръка, а не автоматично генериран. Все пак ще го пробвам, благодаря.   -  person Enrico Borba    schedule 03.07.2019
comment
Да, това го направи. Чувствайте се свободни да напишете отговор и аз ще приема. Благодаря много!   -  person Enrico Borba    schedule 03.07.2019


Отговори (1)


Както беше обсъдено в коментарите, грешката възниква, защото нямате

%token OPERATOR

декларация във вашия .mly файл.

Опцията --external-tokens T на Menhir съществува, за да може генерираният модул за анализатор да използва 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)

person zehnpaard    schedule 03.07.2019