Токен 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 во вступительном разделе вашего лексера.

Другие вопросы по тегам