ANTLR в потоке данных с шумом. Часть 3 - PullRequest
0 голосов
/ 03 декабря 2010

Все еще в процессе изучения ANTLR ... Недавно я опубликовал 2 вопроса, касающихся разбора некоторого текста и извлечения информации, оставляя в стороне «нежелательные» слова или символы. После очень интересной дискуссии с Бартом Кайерсом о разборе зашумленного потока данных Часть 1 и и разборе зашумленного потока данных Часть 2 я столкнулся с еще одной проблемой ...

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

VERB            : 'SLEEPING' | 'WALKING';
SUBJECT         : 'CAT'|'DOG'|'BIRD'; 
INDIRECT_OBJECT : 'CAR'| 'SOFA';
ANY2            :'A'..'Z'+ {skip();};
ANY             : . {skip();};

parse 
  :  sentenceParts+ EOF 
  ;

sentenceParts  
  :  SUBJECT VERB INDIRECT_OBJECT  
  ;    

предложение типа it's 10PM and the Lazy CAT is currently SLEEPING heavily on the SOFA in front of the TV. даст следующее

alt text

Это хорошо ... и оно делает то, что я хочу, т.е. извлекает только слова CAT, SLEEPING и SOFA, оставляя в стороне другие слова. Теперь, по другой причине, мне нужно ввести новый токен в моей грамматике, назовем его OTHER : 'PLANE'. Позже будет использовано другое правило. Я все еще хочу, чтобы мое основное правило работало: SUBJECT VERB INDIRECT_OBJECT. Допустим, в моем предложении появляется символ 'PLANE', например,

it's 10PM and the Lazy CAT on the PLANE is currently SLEEPING heavily on the SOFA in front of the TV. Это приведет к следующей ошибке (здесь нет ничего удивительного, так как лексер имеет четкое определение «PLANE» как токена)

alt text



Есть ли способ сообщить ANTLR, что, если я вхожу в правило sentenceParts, меня волнуют только те 3 токена, которые я определил, а именно SUBJECT, VERB или INDIRECT_OBJECT и что, даже если они встречаются другой токен, не принимать его во внимание? Я хотел бы иметь возможность сделать это, не помещая OTHER? везде в это правило

Ответы [ 2 ]

1 голос
/ 04 декабря 2010

Ну, на самом деле, я мог бы найти способ сделать это ... Хотя в этот момент сомнительно вводить токены, если вы не хотите их анализировать, это решение работает:

VERB            : 'SLEEPING' | 'WALKING';
SUBJECT         : 'CAT'|'DOG'|'BIRD'; 
INDIRECT_OBJECT : 'CAR'| 'SOFA';
OTHER       : 'PLANE';
OTHER2      : 'BEAUTIFUL';
OTHER3      : 'HEAVILLY';
ANY2            :'A'..'Z'+ {skip();};
ANY             : . {skip();};</p>

<p>parse 
  :  sentenceParts+ EOF 
  ;</p>

<p>next    :   ( options {greedy=false;}: .)*;</p>

<p>sentenceParts<br>
  :  SUBJECT next VERB next INDIRECT_OBJECT<br>
  ;    </p>

<p>
это приведет к следующему предложению it's 10PM and the Lazy CAT on the BEAUTIFUL PLANE is currently SLEEPING HEAVILLY on the SOFA in front of the TV следующее дерево ... Так что промежуточный токенalt text
0 голосов
/ 03 декабря 2010

Есть ли способ сообщить ANTLR, что, если я вхожу в предложение правилаParts, меня волнуют только те 3 токена, которые я определил, а именно SUBJECT, VERB или INDIRECT_OBJECT и что, даже если они встречаются с другим токеном, принять это во внимание? Я хотел бы быть в состоянии сделать это без ДРУГОГО? везде в этом правиле

номер

Вы либо игнорируете токен, либо нет, и в этом случае вы должны будете сделать его необязательным в своих правилах синтаксического анализа.

...