Я думаю, что-то вроде
(ID {!$ID.text.equals("_")}?)
должно сделать это (если вы используете Java в качестве целевого языка).В противном случае вам придется написать этот семантический предикат так, чтобы ваш язык его понимал.
Короче говоря, это проверит, не равен ли текст "_", и только тогдаsubrule match.
Другой возможный способ сделать это:
id: ID
| '_'
;
ID: // lexer rule to match every valid identifier EXCEPT '_' ;
Таким образом, всякий раз, когда вы имеете в виду «_» или любой другой идентификатор », вы используете id
, чтобы сопоставить это, если вы запретите "_", вы можете использовать _
.