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