метка x назначена блоку, который не является набором

пытаясь обновить antlr4, у меня есть 2 строки в грамматике, которые выдают сообщение об ошибке:

метка tok, назначенная блоку, который не является набором

В частности, для строки грамматики, которая выглядит следующим образом:

contextRadius: tok=('radius' 'change-authorize-nas-ip') (IP4_ADDRESS|IP6_ADDRESS) 'encrypted' 'key' ID 'port' INT_TOK 'event-timestamp-window' INT_TOK 'no-reverse-path-forward-check'
    ;

Что именно это означает - быть "блоком, который не установлен" и есть ли общее решение?


person joehitt    schedule 17.01.2013    source источник
comment
Я понял это, в основном я думаю, что ANTLR подразумевает, что я не использую токен. В одном случае я просто удалил tok=. Во втором случае я удалил один набор ненужных скобок. Таким образом, (IP4_ADDRESS) стал просто: IP4_ADDRESS Итак, теперь инструмент-генератор создает код, но лексер и парсер имеют ошибки компиляции. Сообщу об этом отдельном вопросе в новой теме.   -  person joehitt    schedule 17.01.2013


Ответы (1)


Неправильная маркировка следующая:

tok=('radius' 'change-authorize-nas-ip')

В этом случае ANTLR не знает, назначать ли токен 'radius' или токен 'change-authorize-nas-ip' метке tok. Начиная с ANTLR 4, вместо генерации кода с неясной семантикой выдается ошибка. Вы можете либо удалить метку tok, либо переместить ее на нужный элемент. Другими словами, используйте одну из следующих трех форм.

('radius' 'change-authorize-nas-ip')
(tok='radius' 'change-authorize-nas-ip')
('radius' tok='change-authorize-nas-ip')

Причина, по которой метки разрешены для блоков в грамматиках, заключается в поддержке таких элементов, как следующие. Этот блок представляет собой набор, т. е. содержимое может быть свернуто до совпадения только с одним токеном из фиксированного набора разрешенных токенов. Затем конкретный элемент, соответствующий набору, назначается x.

x=('a' | 'b')
person Sam Harwell    schedule 17.01.2013
comment
Должны ли все предметы в наборе быть одного типа? Я получаю эту ошибку, и мой блок создает не более одного элемента, но выбирает из 3 альтернатив разных типов. - person ehdv; 09.12.2015