Antlr生成的类访问修饰符改为internal。

7

我正在构建一个包含某些解析器的库。这些解析器是内部使用ANTLR4构建的。由于生成的类都是public,因此我的库的用户可以看到所有他们不需要看到的类。此外,Sandcastle文档中包含了所有这些类。有没有办法告诉ANTLR将生成的类设置为internal而不是public?

5个回答

2
实际上,这相对容易实现。 ANTLR内部使用StringTemplate文件为每种支持的语言生成代码。对于C#,您可以在ANTLR的JAR文件中找到模板文件:

org\antlr\v4\tool\templates\codegen\CSharp\CSharp.stg

只需复制此文件,并根据需要进行修改。例如,我通常会删除CLSCompliant(false)属性以消除编译器的警告,并将所有类和接口设置为内部。
然后,您需要告诉ANTLR在代码生成期间使用修改后的模板。为此,您需要将其放置在ANTLR的JAR之前的CLASSPATH中,并确保保留原始文件夹结构,以便指向包含org目录的文件夹,而不是CSharp.stg本身。
以下是您可以使用的文件夹结构示例:

enter image description here

在这种情况下,Generate.bat 应该如下所示(假设 java.exe 在你的 PATH 中):
pushd %~dp0
set CLASSPATH=.;antlr-4.7-complete.jar
java org.antlr.v4.Tool -Dlanguage=CSharp Grammar.g4

愉快编码!


1
我们还没有在生成的类上实现公共/私有,我认为。

实际上,你已经做到了 :-) 再次感谢您制作出如此棒的工具。 - Sergey Kalinichenko

0

你可以修改字符串模板。

你可以从这里开始。

说实话,我自己从未尝试过这样做,而且一旦发布新版本,你可能需要重复此步骤(尽管合并将帮助你,但你仍然需要检查是否有新的“公共”)。


0
一个相当有效的方法是在Antlr生成的代码上实现一个Facade,同时混淆生成的代码。这样可以让你清晰、独立地控制用户可以看到和使用什么。ProGuard混淆器很好地处理了这种类型的用法。

0

C# 目标支持 '@modifier'。例如,要使生成的类内部可见,您可以编写

@modifier{internal}

如果您的解析器源代码分散在多个源文件中(例如词法分析器、解析器和树),那么每个文件都可以有自己的修饰符。

这个选项在哪个版本中可用?你有提到它的文档链接吗? - vyrp
1
啊,找到了:https://github.com/antlr/antlrcs/tree/master/doc#grammar-accessibility-modifiers。这是针对ANTLR 3的。 - vyrp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接