Токен Ocamlyacc не виден при выполнении семантического действия
Я использую ocamlyacc
для небольшого парсера, который также выполняет некоторые семантические действия для большинства правил синтаксического анализа.
Я определил набор токенов в начале:
%token T_plus
%token T_minus
%token <int> T_int_const
%left T_plus T_minus
Правило парсера, которое выполняет семантическое действие, следующее:
exp: exp T_plus exp
{
checkType T_plus $1 $3
}
где checkType
внешняя вспомогательная функция Тем не менее, я получаю это странное предупреждение (которое относится к строке в моем Parser.mly
файл)
warning: T_plus was selected from type Parser.token.
It is not visible in the current scope,
and will not be selected if the type becomes unknown.
Я не нашел никакой соответствующей информации в руководстве ocamlyacc. Кто-нибудь сталкивался с подобной ошибкой? Почему токен не виден внутри области семантического действия?
1 ответ
Невозможно угадать, что происходит на вашей стороне, так как вы не раскрываете достаточно информации. Я могу догадаться, что вы как-то неправильно прочитали сообщение об ошибке, и проблема в другом файле. Например, следующий файл:
%{
let f PLUS _ = ()
%}
%token PLUS
%left PLUS
%start exp
%type <unit> exp
%%
exp : exp PLUS exp {f PLUS $1}
компилирует любые проблемы или предупреждения с
ocamlbuild Parser.byte
Я могу только предложить, чтобы посмотреть на сгенерированный Parser.ml
и посмотрим, что там происходит.
В общем, это сообщение означает, что вы ссылаетесь на конструктор, который не был перенесен в область видимости. В Parser.mly
токены всегда находятся в области видимости, поэтому вы не можете увидеть эту ошибку в этом файле. Обычно вы можете сделать это в своем лексере. Поэтому убедитесь, что у вас есть open Parser
во вступительном разделе вашего лексера.