2010-06-15 2 views
1

В Antlr, если у меня есть правило, например:как проверить маркер ANTLR используется только один раз или меньше в парсер

someRule : TOKENA TOKENB; 

было бы принять: «tokena tokenb»

если я хотел tOKENA быть необязательным, я могу сказать,

someRule : TOKENA* TOKENB; 

тогда я могу иметь: "tokena tokenb" или "tokenb" или "tokena tokena tokenb"

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

"tokena tokenb" или "tokenb" НО НО "tokena tokena tokenb"?

Большое спасибо

ответ

6

... Есть в любом случае я могу сказать, этот маркер может быть там 1 или меньше раз, но не более чем один? ...

Вот как:

someRule 
    : TOKENA? TOKENB 
    ; 

или:

someRule 
    : TOKENA TOKENB 
    | TOKENB 
    ; 
+0

Я понимаю, второй вариант, я не думаю, чтобы быть в состоянии сделать это, мой провал. В документации написано '?' является «семантическим предикатом», вы можете объяснить, что такое семантический предикат? –

+0

@Simon, нет, '?' Само по себе означает «совпадение с предыдущим однажды или ничем вообще». –

+0

@Simon, я просто ушел, но вы хотите, чтобы я опубликовал последующее описание того, что такое семантический предикат? Если да, просто оставляйте здесь комментарий, и я отправлю ответ позже этим вечером. –