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