Antlr в шумном потоке данных
-
29-09-2019 - |
Вопрос
Я очень новый в мире ANTLR, и я пытаюсь выяснить, как я могу использовать этот инструмент для анализа для интерпретации набора «шумной» строки. То, что я хотел бы достичь, это следующее.
Давайте возьмем, например, эта фраза: It's 10PM and the Lazy CAT is currently SLEEPING heavily on the SOFA in front of the TV
Что я хотел бы извлечь CAT
, SLEEPING
и SOFA
И иметь грамматику, которая легко совпадает со следующим рисунком: субъект - глагол - косвенный объект ... где я мог определить
VERB : 'SLEEPING' | 'WALKING';
SUBJECT : 'CAT'|'DOG'|'BIRD';
INDIRECT_OBJECT : 'CAR'| 'SOFA';
и т. д. .. Я не хочу заканчиваться постоянным «NovityException», поскольку я не могу описать все возможности вокруг языковой структуры. Я просто хочу разорвать бесполезные слова и просто держать тот, который интересных.
Это больше похоже на то, что если бы у меня был токенисер и попросил парсера «ОК, прочитал ручей, пока не найдешь тема, то игнорируйте остальные, пока не найдете глагол и т. Д.».
Мне нужно извлечь организованную структуру в неорганизованном наборе ... Например, я хотел бы иметь возможность интерпретировать (я не оцениваю отношение этого совершенно основного и неверного зрения «английской грамматики»)
SUBJECT - VERB - INDIRECT OBJECT
INDIRECT OBJECT - SUBJECT - VERB
так что я буду разбирать приговоры, как
It's 10PM and the Lazy CAT is currently SLEEPING heavily on the SOFA in front of the TV
или
It's 10PM and, on the SOFA in front of the TV, the Lazy CAT is currently SLEEPING heavily
Решение
Вы можете создать только пару правил лексера (например, которые вы разместили, а также в качестве последнего правила лексера, вы можете сопоставить любой символ и skip()
Это:
VERB : 'SLEEPING' | 'WALKING';
SUBJECT : 'CAT'|'DOG'|'BIRD';
INDIRECT_OBJECT : 'CAR'| 'SOFA';
ANY : . {skip();};
Приказ здесь важен: лексер пытается соответствовать тонканам сверху вниз, поэтому, если он не может совпадать с любыми токенами VERB
, SUBJECT
или INDIRECT_OBJECT
, это «падает» на ANY
Правило и пропускайте этот токен. Затем вы можете использовать эти правила анализатора для фильтрации вашего входного потока:
parse
: sentenceParts+ EOF
;
sentenceParts
: SUBJECT VERB INDIRECT_OBJECT
;
который будет анализировать входной текст:
Это 10 вечера, а ленивый кот в настоящее время спит тяжело на диване перед телевизором. Собака гуляет на диване.
следующее: