2014-02-07 2 views
3

Я хотел бы определить keyword_table, который отображает некоторые строки на некоторые маркеры, и я хотел бы сделать эту таблицу видимой как для, так и для lexer.mll.Сделать таблицу, содержащую маркеры, видимые как для .mly, так и для .mll по menhir

кажется, что таблица должна быть определена в parser.mly,

%{ 
    open Utility (* where hash_table is defined to make a table from a list *) 
    let keyword_table = hash_table [ 
     "Call", CALL; "Case", CASE; "Close", CLOSE; "Const", CONST; 
     "Declare", DECLARE; "DefBool", DEFBOOL; "DefByte", DEFBYTE ] 
%} 

Однако, я не мог использовать его в lexer.mll, например

{ 
open Parser 
let x = keyword_table (* doesn't work *) 
let x = Parser.keyword_table (* doesn't work *) 
let x = Parsing.keyword_table (* doesn't work *) 
} 

Как this comment наводит на мысль, menhir имеет решение для этого мог ли кто-нибудь рассказать мне какие-либо подробности?

ответ

0

Обычно я помещаю keyword_table в lexer.mll, и я не вижу причин поместить его в parser.mly. Если вам необходимо получить доступ к нему с обеих lexer.mll и parser.mly (но почему вы хотите получить к нему доступ из parser.mly?), Самое простое решение, чтобы положить его в третий файл keyword.ml и использовать Keyword.keyword_table (или open Keyword и keyword_table).

+0

Проблема в том, что 'keyword_table' содержит токены, я не могу поместить его в третий файл' keyword.ml' ... – SoftTimur

+1

Это не проблема, см. Документ для '--external-tokens' – Thomash

+0

Я использовал [http://www.ii.uni.wroc.pl/~lukstafi/pmwiki/uploads/Functional/functional-lecture09.pdf) '-external-tokens' из-за некоторых проблем, которые у меня были с 'ocamlbuild'. В любом случае, это дает большую гибкость. – lukstafi

3

Первый вариант - определить токены в отдельном файле .mly. Выполнение menhir для этого файла с опцией --only-tokens сгенерирует модуль, содержащий type token, который вы можете использовать в своем парсере, скомпилированном с опцией --external-tokens.

Если это решает проблему с токенами, вы можете указать все другие функции, которые используются как синтаксическим анализатором, так и лексером в отдельном файле, как предложил Томаш.

Существует также альтернативное решение. Вы можете использовать объявление %parameter<module signature> в синтаксическом анализаторе для параметризации всех парсеров по типам и функциональным аннотациям, указанным внутри данной сигнатуры. Основное преимущество заключается в том, что эта подпись предоставляется в файле интерфейса для синтаксического анализатора, поэтому анализатор может совместно использовать эту подпись с другими модулями (которые могут создавать модули на основе подписи).

Я предлагаю обратиться to menhir examples, а именно увидеть calc-two, чтобы получить знать о внешних токенах и calc-param знать, как создать параметризованные парсер.

Смежные вопросы