Еще один способ правильно пропустить однострочные комментарии в javacc? <"//" (~ ["\ n"]) * "\ n"> приводит к разрыву многострочного комментария - PullRequest
3 голосов
/ 26 октября 2011

Так что у меня проблема с javacc и пропуском комментариев. У меня есть многострочный комментарий, который может содержать несколько комментариев внутри себя (комментарий - это все, что появляется в пределах /* и */), я также использую этот сегмент кода <"//" (~["\n"])* "\n">, чтобы пропустить однострочный комментарий. Оба функционируют независимо друг от друга, но при объединении однострочный комментарий нарушает мой многострочный комментарий.

Парсер больше не распознает многострочный комментарий, а анализирует его как комбинацию OTHER (/*), ID и т. Д.

Ниже приведен код пропуска многострочного комментария и однострочного комментария:

SKIP:
{
    "/*" {commentnesting++;} : IN_COMMENT
}

<IN_COMMENT> SKIP :
{
    "/*" {commentnesting++;} 
    | "*/" {commentnesting--;
        if(commentnesting == 0) {
            SwitchTo(DEFAULT);
        }
    }
    | <~[]>
}

SKIP :
{
    <"//" (~["\n"])* "\n">
}

Мои вопросы:

  • Как однострочный комментарий может привести к разрыву многострочного комментария, когда они, на мой взгляд, имеют совершенно разные регулярные выражения?
  • Является ли способ написания пропуска однострочного комментария, чтобы он выполнял ту же функцию, что и раньше, но не прерывал многострочный комментарий, когда они используются вместе?

Ответы [ 2 ]

4 голосов
/ 26 октября 2011

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

"/*" {commentnesting++;} : IN_COMMENT

... не должно ли быть:

<"/*"> {commentnesting++;} : IN_COMMENT

... и аналогично вашему второму правилу?

0 голосов
/ 25 февраля 2016

В итоге я сделал что-то вроде:

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

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

...