2011-08-17 1 views
-1

Есть ли способ сопоставить токен в antlr, кроме определенного?ANTLR Соответствие всех токенов, кроме

У меня есть правило, которое гласит, что '_' может быть идентификатором. Теперь у меня есть конкретная ситуация, когда я хочу сопоставить ID, но в этом конкретном случае я хочу, чтобы он проигнорировал альтернативу '_'. Является ли это возможным?

+3

Я просмотрел ваши вопросы немного, и многие из них, похоже, имеют достойные ответы, но большинство из них не принимаются. Вы, _do_, похоже, предпочитаете свои собственные ответы, которые вы предоставляете на свои вопросы ... :) –

+0

@halfwarp Является ли ответ подходящим? Если да, то пожалуйста, примите это. –

ответ

1

Я думаю, что-то вроде

(ID {!$ID.text.equals("_")}?) 

должны это сделать (если вы используете Java в качестве целевого языка). В противном случае вам придется написать это semantic predicate таким образом, чтобы ваш язык его понимал.

Короче говоря, это будет проверять, не соответствует ли текст «_», и только тогда будет соответствовать подпункт.

Другой возможный способ сделать это:

id: ID 
    | '_' 
    ; 

ID: // lexer rule to match every valid identifier EXCEPT '_' ; 

Таким образом, всякий раз, когда вы имеете в виду «либо„_“или любой другой ID», вы используете id, чтобы соответствовать этому, если вы запретить «_», вы можно использовать _.