使用 Rascal 忽略 java 文件中注释的最佳方法是什么?
What is the best way to ignore comments in a java file with Rascal?
我构建了一个模块来计算 Java 项目的代码行数 (LOC)。
为此,我不得不忽略:
- 空行
- 单行注释
- 和多行注释(/*......*/).
我使用正则表达式在文件行上使用列表理解实现了前两个,我还解决了第三个问题,通过正确的模式匹配和替换访问整个文件字符串。
我在想,是否有更好的 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 节点在 运行 测试后打印的配置文件中的位置。
我构建了一个模块来计算 Java 项目的代码行数 (LOC)。 为此,我不得不忽略:
- 空行
- 单行注释
- 和多行注释(/*......*/).
我使用正则表达式在文件行上使用列表理解实现了前两个,我还解决了第三个问题,通过正确的模式匹配和替换访问整个文件字符串。 我在想,是否有更好的 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 节点在 运行 测试后打印的配置文件中的位置。