用JavaCC删除C注释

用JavaCC删除C注释,java,parsing,comments,parser-generator,javacc,Java,Parsing,Comments,Parser Generator,Javacc,我知道如何使用skip声明跳过这些注释,但我所需要做的就是获取一个C源代码,并输出相同的源代码而不带注释 所以我声明了一个令牌,它被复制到输出,并且不会跳过注释。我怀疑这个令牌本身会占用所有的输入 有人能帮我吗 谢谢不要使用(~[])+:它会吞噬你所有的输入。这可能就是您没有看到跳过令牌的原因 在默认lexer模式下,当遇到“/*”(多行注释的开头)时,更改为不同的状态。在这个不同的状态中,要么匹配“*/”(并切换回默认的lexer状态),要么匹配任何字符~[](而不是(~[])+!) 快速演示

我知道如何使用skip声明跳过这些注释,但我所需要做的就是获取一个C源代码,并输出相同的源代码而不带注释

所以我声明了一个令牌,它被复制到输出,并且不会跳过注释。我怀疑这个令牌本身会占用所有的输入

有人能帮我吗

谢谢

不要使用
(~[])+
:它会吞噬你所有的输入。这可能就是您没有看到跳过令牌的原因

在默认lexer模式下,当遇到
“/*”
(多行注释的开头)时,更改为不同的状态。在这个不同的状态中,要么匹配
“*/”
(并切换回默认的lexer状态),要么匹配任何字符
~[]
(而不是
(~[])+
!)

快速演示:

CommentStripParser.jj 像这样运行演示(假设您在同一目录中有文件CommentStripParser.jjTest.java和JARjavacc.JAR):

(无评论)

请注意,您仍然需要考虑可能如下所示的字符串文字:

"the following: /*, is not the start of a comment"
和字符文字:

'"' // not the start of a string literal!

非常感谢你!它工作得很好!我现在会检查文字问题…@luomoradioattivo,不客气。请注意,您(只需)在现有的
其他
-token旁边为
STRING
CHAR
创建标记(不要忘记引号可以在字符串和CHAR文本中转义!):) java -cp javacc.jar javacc CommentStripParser.jj javac -cp . *.java java -cp . CommentStripParser Test.java
class Test {

  int foo() {
    return 42;
  }
}
"the following: /*, is not the start of a comment"
'"' // not the start of a string literal!