gpt4 book ai didi

java - 使用 JavaCC 删除 C 注释

转载 作者:行者123 更新时间:2023-11-30 06:26:48 24 4
gpt4 key购买 nike

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

所以我声明了一个标记 ,它被复制到输出,并且注释不会被跳过。我怀疑这个 token 自己接受了所有输入。

有人可以帮帮我吗?

谢谢

最佳答案

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

在您的默认词法分析器模式下,当您遇到 "/*"(多行注释的开头)时更改为不同的状态。在这个不同的统计中,要么匹配 "*/"(然后切换回默认的词法分析器状态),要么匹配任何字符 ~[](不是 (~[])+!).

快速演示:

CommentStripParser.jj

PARSER_BEGIN(CommentStripParser)

public class CommentStripParser {
public static void main(String[] args) throws Exception {
java.io.FileInputStream file = new java.io.FileInputStream(new java.io.File(args[0]));
CommentStripParser parser = new CommentStripParser(file);
parser.parse();
}
}

PARSER_END(CommentStripParser)

TOKEN :
{
< OTHER : ~[] >
}

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

<ML_COMMENT_STATE> SKIP :
{
< "*/" > : DEFAULT
| < ~[] >
}

void parse() :
{
Token t;
}
{
( t=<OTHER> {System.out.print(t.image);} )* <EOF>
}

给定测试文件:

测试.java

/*
* comments
*/
class Test {
// more comments
int foo() {
return 42;
}
}

像这样运行演示(假设您在同一目录):

java -cp javacc.jar javacc CommentStripParser.jj javac -cp . *.javajava -cp . CommentStripParser Test.java

the following would be printed to your console:

class Test {

int foo() {
return 42;
}
}

(没有评论了)

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

"the following: /*, is not the start of a comment"

和字 rune 字:

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

关于java - 使用 JavaCC 删除 C 注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13969511/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com