#regex #javacc
#регулярное выражение #javacc
Вопрос:
Итак, у меня проблема с javacc и пропуском комментариев. У меня есть многострочный пропуск комментариев, который может содержать множество комментариев внутри себя (комментарий — это все, что появляется внутри /*
и */
), я также использую этот сегмент кода <"//" (~["n"])* "n">
, чтобы пропустить однострочный комментарий. Оба функционируют независимо друг от друга, но при объединении однострочный комментарий, похоже, нарушает мой многострочный комментарий.
Анализатор больше не распознает многострочный комментарий и вместо этого анализирует его как комбинацию OTHER( /*
) , ID и т.д.
Ниже приведен мой код для многострочного комментария и пропуска однострочного комментария:
SKIP:
{
"/*" {commentnesting ;} : IN_COMMENT
}
<IN_COMMENT> SKIP :
{
"/*" {commentnesting ;}
| "*/" {commentnesting--;
if(commentnesting == 0) {
SwitchTo(DEFAULT);
}
}
| <~[]>
}
SKIP :
{
<"//" (~["n"])* "n">
}
Мои вопросы:
- Как однострочный комментарий может привести к разрыву многострочного комментария, когда они, на мой относительно новый взгляд, имеют совершенно разные регулярные выражения?
- Является ли их способом записи пропуска однострочных комментариев, чтобы он выполнял ту же функцию, что и раньше, но не прерывал многострочный комментарий, когда они используются вместе?
Комментарии:
1. Это было очень полезно после того, как я выяснил, где объявлять
commentNesting
в методах.
Ответ №1:
Похоже, это должно сработать, за исключением того, что вам, похоже, не хватает некоторых угловых скобок. Вместо:
"/*" {commentnesting ;} : IN_COMMENT
… не должно ли это быть:
<"/*"> {commentnesting ;} : IN_COMMENT
… и аналогично с вашим вторым правилом?
Комментарии:
1. Спасибо, это решило мои проблемы. Просто для тех, кто позже рассмотрит эту проблему. Я также удалил последний » n» из пропуска однострочных комментариев.
Ответ №2:
В итоге я сделал что-то вроде:
TOKEN: {
< COMMENT_END : "*/" >
}
SPECIAL_TOKEN: {
< COMMENT_START : "/*" > {
/*currently commented contents are dropped, but they can be attached to the special token*/
do {
Token nextToken = this.getNextToken();
if ("*/".equals(nextToken.image)) {
break;
}
} while (true);
}
}
Это немного банально, но также работает при комментировании кода, который содержит другие комментарии и даже строки, такие как: «/* */»….