Все еще в процессе изучения 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.
даст следующее
Это хорошо ... и оно делает то, что я хочу, т.е. извлекает только слова 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» как токена)
Есть ли способ сообщить ANTLR, что, если я вхожу в правило sentenceParts
, меня волнуют только те 3 токена, которые я определил, а именно SUBJECT
, VERB
или INDIRECT_OBJECT
и что, даже если они встречаются другой токен, не принимать его во внимание? Я хотел бы иметь возможность сделать это, не помещая OTHER?
везде в это правило