Вопрос

Я очень новый в мире 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 вечера, а ленивый кот в настоящее время спит тяжело на диване перед телевизором. Собака гуляет на диване.

следующее:

alt text

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top