Другой способ корректно пропускать однострочные комментарии в javacc? приводит к прерыванию многострочного пропуска комментария

#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);
 }
}
  

Это немного банально, но также работает при комментировании кода, который содержит другие комментарии и даже строки, такие как: «/* */»….