Antlr为内部生成了类访问修饰符

时间:2014-04-22 11:19:15

标签: c# antlr antlr4

我正在构建一个包含某些解析器的库。这些解析器内部使用ANTLR4构建。由于生成的类都是公共的,因此我的库的用户能够看到他们不需要查看的所有类。 Sandcastle文档还包含所有这些类。有什么方法可以告诉Antlr使生成的类内部而不是公共吗?

5 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

  

有机\ ANTLR \ V4 \工具\模板\代码生成\ CSHARP \ CSharp.stg

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

然后,您需要告诉ANTLR在代码生成期间使用修改后的模板。为此,您需要将其放在<{1>} 之前 ANTLR的JAR中,并确保保留原始文件夹结构,以便指向{找到{1}}目录,而不是CLASSPATH本身。

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

enter image description here

在这种情况下,ord应该如下所示(假设CSharp.stg中有Generate.bat):

java.exe

快乐的编码!

答案 2 :(得分:0)

您可以修改字符串模板。

您可以开始here

我自己从来没有这样说过,说实话,你可能不得不重复这个步骤(尽管合并会帮助你,你仍然需要检查是否有新的&#34; public&# 34; S)

答案 3 :(得分:0)

一种非常有效的方法是在Antlr生成的代码上实现一个外观,同时混淆生成的代码。这使您可以清楚,独立地控制用户可以查看和使用的内容。 ProGuard混淆器很好地处理了这种用途。

答案 4 :(得分:0)

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

@modifier{internal}

如果您的解析器源拆分成多个源文件(例如lexer,解析器和树),则每个文件都可以拥有自己的修饰符。