我正在构建一个包含某些解析器的库。这些解析器内部使用ANTLR4构建。由于生成的类都是公共的,因此我的库的用户能够看到他们不需要查看的所有类。 Sandcastle文档还包含所有这些类。有什么方法可以告诉Antlr使生成的类内部而不是公共吗?
答案 0 :(得分:1)
我们没有在生成的类上实现公共/私有,但我不认为。
答案 1 :(得分:1)
实际上,它相对容易。 在内部,ANTLR使用StringTemplate文件为每种支持的语言生成代码。对于C#,您可以在ANTLR的JAR文件中找到模板:
有机\ ANTLR \ V4 \工具\模板\代码生成\ CSHARP \ CSharp.stg
只需复制此文件,然后根据需要进行修改。例如,我通常删除CLSCompliant(false)
属性以消除编译器的警告,并使所有类和接口都在内部。
然后,您需要告诉ANTLR在代码生成期间使用修改后的模板。为此,您需要将其放在<{1>} 之前 ANTLR的JAR中,并确保保留原始文件夹结构,以便指向{找到{1}}目录,而不是CLASSPATH
本身。
以下是您可以使用的文件夹结构示例:
在这种情况下,ord
应该如下所示(假设CSharp.stg
中有Generate.bat
):
java.exe
快乐的编码!
答案 2 :(得分:0)
答案 3 :(得分:0)
一种非常有效的方法是在Antlr生成的代码上实现一个外观,同时混淆生成的代码。这使您可以清楚,独立地控制用户可以查看和使用的内容。 ProGuard混淆器很好地处理了这种用途。
答案 4 :(得分:0)
C#目标支持'@modifier'。例如,要使生成的类成为内部类,您可以编写
@modifier{internal}
如果您的解析器源拆分成多个源文件(例如lexer,解析器和树),则每个文件都可以拥有自己的修饰符。