3

所以我遇到了 javacc 和跳过评论的问题。我有一个多行注释跳过,它本身可以包含多个注释(注释是出现在/*和 a中的任何内容*/),我还使用此代码段<"//" (~["\n"])* "\n">来跳过单行注释。两者的功能相互独立,但是当组合在一起时,单行注释似乎打破了我的多行注释。

解析器不再识别多行注释,而是将其解析为 OTHER( /*)、ID 等的组合。

下面是我的多行注释和单行注释跳过代码:

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

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

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

我的问题是:

  • 当单行注释在我相对较新的眼中看起来具有完全不同的正则表达式时,单行注释如何导致多行注释中断?
  • 他们是编写单行注释 skip 的一种方法,以便它执行与以前相同的功能,但在两者一起使用时不会破坏多行注释?
4

2 回答 2

4

看起来应该可以,除了您似乎缺少一些尖括号。代替:

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

...不应该是:

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

...和你的第二条规则类似?

于 2011-10-26T18:11:31.350 回答
0

我最终做了类似的事情:

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

它有点 hacky,但在注释包含其他注释甚至字符串的代码时也可以使用:“/* */”....

于 2016-02-24T23:03:51.120 回答