Как сопоставить любой символ в парсере ANTLR (не лексере)? Где полное описание языка для парсеров ANTLR4?
ОБНОВЛЕНИЕ
Ответ "невозможен"?
Как сопоставить любой символ в парсере ANTLR (не лексере)? Где полное описание языка для парсеров ANTLR4?
ОБНОВЛЕНИЕ
Ответ "невозможен"?
Сначала вам нужно понять роли каждой части в разборе:
Лекспер: это объект, который маркирует вашу входную строку. Токенизация означает преобразование потока входных символов в абстрактный символ токена (обычно просто число).
Синтаксический анализатор: это объект, который работает только с токенами для определения структуры языка. Язык (записанный в виде одного или нескольких файлов грамматики) определяет допустимые комбинации токенов.
Как видите, парсер даже не знает, что такое буква. Он знает только токены. Так что ваш вопрос уже неверен.
Сказав, что, вероятно, было бы полезно узнать, почему вы хотите пропустить отдельные вводимые буквы в своем синтаксическом анализаторе. Похоже, ваша базовая концепция нуждается в корректировке.
Это зависит от того, что вы подразумеваете под «символом». Чтобы сопоставить любой токен внутри правила парсера, используйте метасимвол .
(DOT). Если вы пытаетесь сопоставить любой символ внутри правила парсера, то вам не повезло, в ANTLR существует строгое разделение между правилами парсера и лексера. Невозможно сопоставить какой-либо символ внутри правила синтаксического анализатора.
JSTL/EL
или C#
. Это работа парсера. Я не вижу причин связывать это с лексером, тем более что у лексера такая ограниченная функциональность.
- person Suzan Cioc; 18.05.2013
Это возможно, но только если у вас такая базовая грамматика, что причина использования ANTlr в любом случае сводится на нет.
Если бы у вас была грамматика:
text : ANY_CHAR* ;
ANY_CHAR : . ;
он будет делать то, что вы (кажется) хотите.
Однако, как отмечают многие, это было бы довольно странным поступком. Целью лексера является идентификация различных токенов, которые могут быть объединены в синтаксическом анализаторе для формирования грамматики, поэтому ваш лексер может либо идентифицировать конкретную строку "JSTL/EL" как токен, либо [AZ]'/ EL', [AZ]'/'[AZ][AZ] и т. д. - в зависимости от того, что вам нужно.
Затем синтаксический анализатор используется для определения грамматики, поэтому:
phrase : CHAR* jstl CHAR* ;
jstl : JSTL SLASH QUALIFIER ;
JSTL : 'JSTL' ;
SLASH : '/'
QUALIFIER : [A-Z][A-Z] ;
CHAR : . ;
будет принимать "бла-бла JSTL/EL..." в качестве входных данных, но не "бла-бла EL/JSTL...".
Я бы порекомендовал ознакомиться с полным справочником по ANTlr 4, в частности с разделом «Острова в потоке» и справочником по грамматике (глава 15), в котором конкретно рассматривается Unicode.
phrase
не будет работать с фразой JSTL - это версия jstl с заглавной буквы, потому что лексер съест первый JSTL как токен JSTL
, и тогда он не будет соответствовать правилу фразы. Итак, идея лексера просто плохая идея.
- person Suzan Cioc; 06.06.2013