使用 Rascal 忽略 java 文件中注释的最佳方法是什么?

What is the best way to ignore comments in a java file with Rascal?

我构建了一个模块来计算 Java 项目的代码行数 (LOC)。 为此,我不得不忽略:

  1. 空行
  2. 单行注释
  3. 和多行注释(/*......*/).

我使用正则表达式在文件行上使用列表理解实现了前两个,我还解决了第三个问题,通过正确的模式匹配和替换访问整个文件字符串。 我在想,是否有更好的 and/or 更高效的方法来达到相同的目标?

PS:我选择了替换,即使它比计数和减法更重,因为多行注释可以与同一行中的实际代码交织在一起。 棘手的多行注释的示例可以是:

String test2 = "abc /* fake comment*/";
String cde = "this is a test";//an inline comment
String efg = "ciccio"; /*this is a 
        weird comment*/ String hil = "pluto";

是的,您可以尝试不同的方法。

  • 我的第一选择是为带有注释的文件编写语法,使用 lexical SingleLineComment = "//" ~[\n] "\n";lexical OtherStuff = ![\]+ !>> ![\] 之类的东西。可以访问出现的解析树以计算所有评论的大小,您可以从总数中减去它。
  • 使用现有的 Java 语法从 lang::java 中的库中解析文件,并类似地分析解析树
  • 使用现有的外部解析器(如 JDT)并找到所有 AST 节点的起始行。具有起始 AST 节点的行不是空的,其他的是。所以减法又是你的朋友了。
  • 您可以更好地锚定您的正则表达式,从而减少它们的不确定性。 (即使用 ^$,这样你写的 visit 就会变得更快。

建议在 REPL 上启用 Rascal CPU 分析器::set profiling true 并查看实际瓶颈 AST 节点在 运行 测试后打印的配置文件中的位置。