所以我遇到了javacc和跳过评论的问题。我有一个多行注释跳过,其中可以包含多个注释(注释是/*
和*/
中出现的任何内容),我也使用此代码段<"//" (~["\n"])* "\n">
来跳过单行评论。两者都是相互独立的,但在合并时,单行评论似乎打破了我的多行评论。
解析器不再识别多行注释,而是将其解析为OTHER(/*
),ID等的组合。
下面是我的多行注释和单行注释跳过的代码:
SKIP:
{
"/*" {commentnesting++;} : IN_COMMENT
}
<IN_COMMENT> SKIP :
{
"/*" {commentnesting++;}
| "*/" {commentnesting--;
if(commentnesting == 0) {
SwitchTo(DEFAULT);
}
}
| <~[]>
}
SKIP :
{
<"//" (~["\n"])* "\n">
}
我的问题是:
答案 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但它在注释包含其他注释甚至字符串的代码时也有效:“/ * * /”....