在javacc中正确跳过单行注释的另一种方法是什么? <“//”(〜[“\ n”])*“\ n”>导致多行评论跳过

时间:2011-10-26 15:11:17

标签: regex javacc

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

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

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

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

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

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

我的问题是:

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

2 个答案:

答案 0 :(得分:4)

看起来应该可以,但你似乎缺少一些尖括号。而不是:

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

......不应该是:

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

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

答案 1 :(得分: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但它​​在注释包含其他注释甚至字符串的代码时也有效:“/ * * /”....