C# Antlr生成的类访问内部

C# Antlr生成的类访问内部,c#,antlr,antlr4,C#,Antlr,Antlr4,我正在构建一个包含某些解析器的库。这些解析器是用ANTLR4内部构建的。因为生成的类都是公共的,所以我的库的用户可以看到他们不需要看到的所有类。Sandcastle文档还包含所有这些类。有什么方法可以让Antlr将生成的类设置为内部而不是公共的吗?我们还没有在生成的类上实现公共/私有。我不认为。您可以修改字符串模板 你可以开始了 老实说,我自己从来没有这样做过,一旦发布了新版本,您可能需要重复这一步骤(尽管合并会对您有所帮助,但您仍然需要检查是否有新的“公共”版本)一种非常有效的方法是在Antl

我正在构建一个包含某些解析器的库。这些解析器是用ANTLR4内部构建的。因为生成的类都是公共的,所以我的库的用户可以看到他们不需要看到的所有类。Sandcastle文档还包含所有这些类。有什么方法可以让Antlr将生成的类设置为内部而不是公共的吗?

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

您可以修改字符串模板

你可以开始了


老实说,我自己从来没有这样做过,一旦发布了新版本,您可能需要重复这一步骤(尽管合并会对您有所帮助,但您仍然需要检查是否有新的“公共”版本)一种非常有效的方法是在Antlr生成的代码上实现一个facade,同时混淆生成的代码。这使您能够清楚、独立地控制用户可以看到和使用的内容。ProGuard模糊处理器可以很好地处理这种类型的使用。

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

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

只需复制此文件,并根据需要进行修改。例如,我通常删除
CLSCompliant(false)
属性以消除编译器的警告,并使所有类和接口都是内部的

然后,您需要告诉ANTLR在代码生成期间使用修改过的模板。为了做到这一点,您需要将它放在ANTLR的JAR之前的
类路径中,并确保保持原始文件夹结构,以便指向
org
目录所在的文件夹,而不是
CSharp.stg
本身

以下是您可以使用的文件夹结构示例:

在这种情况下,
Generate.bat
应该如下所示(假设
java.exe
在您的
路径中):

快乐编码

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

@modifier{internal}
如果您的解析器源代码被拆分为多个源文件(例如lexer、parser和tree),那么每个文件都可以有自己的修饰符。

实际上,:-)再次感谢您制作了一个了不起的工具。
@modifier{internal}