В моей грамматике есть что-то вроде этого:
line : startWord (matchPhrase|
anyWord matchPhrase|
anyWord anyWord matchPhrase|
anyWord anyWord anyWord matchPhrase|
anyWord anyWord anyWord anyWord matchPhrase)
-> ^(TreeParent startWord anyWord* matchPhrase);
Итак, я хочу сопоставить первое вхождение matchPhrase
, но я позволю до определенного числа anyWord
до него. Токены, составляющие matchPhrase
, также соответствуют anyWord
.
Есть ли лучший способ сделать это?
Я думаю, что это может быть возможно путем объединения семантического предиката в этом ответе с не жадным параметром:
(options {greedy=false;} : anyWord)*
но я не могу понять, как именно это сделать.
Редактировать: Вот пример. Я хочу извлечь информацию из следующих предложений:
Picture of a red flower.
Picture of the following: A red flower.
Мой ввод фактически помечен английскими предложениями, а правила Lexer соответствуют тегам, а не словам. Таким образом, вход для ANTLR:
NN-PICTURE Picture IN-OF of DT a JJ-COLOR red NN-FLOWER flower
NN-PICTURE Picture IN-OF of DT the VBG following COLON : DT a JJ-COLOR red NN-FLOWER flower
У меня есть правила лексера для каждого тега:
WS : (' ')+ {skip();};
TOKEN : (~' ')+;
nnpicture:'NN-PICTURE' TOKEN -> ^('NN-PICTURE' TOKEN);
vbg:'VBG' TOKEN -> ^('VBG' TOKEN);
А мои правила синтаксического анализа примерно такие:
sentence : nnpicture inof matchFlower;
matchFlower : (dtTHE|dt)? jjcolor? nnflower;
Но, конечно, это потерпит неудачу во втором предложении. Поэтому я хочу дать немного гибкости, допуская до N жетонов перед совпадением цветов. У меня есть anyWord
токен, который соответствует чему угодно, и работает следующее:
sentence : nnpicture inof ( matchFlower |
anyWord matchFlower |
anyWord anyWord matchFlower | etc.
но это не очень элегантно и плохо работает с большими буквами N.