ANTLR в потоке данных - PullRequest
       51

ANTLR в потоке данных

2 голосов
/ 30 ноября 2010

Я очень новичок в мире ANTLR, и я пытаюсь понять, как я могу использовать этот инструмент синтаксического анализа для интерпретации набора "шумных" строк.Чего я хотел бы добиться, так это следующего.

давайте возьмем для примера эту фразу: It's 10PM and the Lazy CAT is currently SLEEPING heavily on the SOFA in front of the TV

Что я хотел бы извлечь, это CAT, SLEEPING и SOFA и иметь грамматику, которая легко соответствует следующему шаблону: SUBJECT - VERB - INDIRECT OBJECT ... где я мог бы определить

VERB : 'SLEEPING' | 'WALKING';
SUBJECT : 'CAT'|'DOG'|'BIRD';
INDIRECT_OBJECT : 'CAR'| 'SOFA';

и т. Д. Я не хочузаканчивается постоянным «NoViableException», так как я не могу описать все возможности, связанные с языковой структурой.Я просто хочу разорвать бесполезные слова и просто оставить те, которые интересны.

Это больше похоже на то, как если бы у меня был токенизатор и я спросил парсера: «Хорошо, читайте поток, пока не найдете объект, затем проигнорируйтеотдохните, пока не найдете VERB и т. д. "

Мне нужно извлечь организованную структуру из неорганизованного набора ... Например, я хотел бы иметь возможность интерпретировать (я не осуждаюуместность этого совершенно простого и неправильного представления о «грамматике английского языка»)
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

1 Ответ

3 голосов
/ 30 ноября 2010

Вы можете создать только пару правил лексера (например, те, которые вы опубликовали), и, как последнее правило лексера, вы можете сопоставить любой символ и skip() it:

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 вечера, а ленивый кот в настоящее время спит сильно на SOFA перед телевизором. СОБАКА ХОДИТ НА ДИВАН.

следующим образом:

alt text

...