2014-04-22 2 views
5

Я создаю библиотеку, которая содержит определенные парсеры. Эти парсеры встроены в ANTLR4. Поскольку созданные классы являются общедоступными, пользователи моей библиотеки могут видеть все классы, которые им не нужны. Также в документации Sandcastle содержатся все эти классы. Есть ли какой-нибудь способ, которым я могу сказать Antlr, сделать созданные классы внутренними, а не публичными?Antlr создал модификатор доступа классов к внутренним

ответ

1

Мы не реализовали public/private в сгенерированных классах, но я не думаю.

0

Вы можете изменить строковые шаблоны.

Вы можете начать here.

Я никогда не делал этого сам, чтобы быть честным, и вам, возможно, придется повторить шаг после публикации новой публикации (хотя слияние поможет вам, вам все равно придется проверять, есть ли новые «публичные») ,

0

Один довольно эффективный подход заключается в реализации фасада над сгенерированным Antlr кодом и в то же время запутывание сгенерированного кода. Это дает вам четкий, независимый контроль над тем, что ваши пользователи могут видеть и использовать. Обфускатор ProGuard хорошо справляется с этим типом использования.

0

Собственно, это относительно легко сделать. Внутри ANTLR использует файлы StringTemplate для генерации кода для каждого из поддерживаемых языков. Для C#, вы можете найти здесь шаблон в файле JAR в Antlr в:

орг \ Antlr \ v4 \ инструмент \ Шаблоны \ Codegen \ CSharp \ CSharp.stg

Просто сделать копию этого файл и изменить его по мере необходимости. Например, я обычно удаляю атрибуты CLSCompliant(false), чтобы избавиться от предупреждений компилятора и сделать все классы и интерфейсы внутренними.

Затем вам необходимо сообщить ANTLR, чтобы использовать модифицированный шаблон во время генерации кода. Для этого вам нужно поместить его в CLASSPATHдо ANTLR's JAR и убедитесь, что вы сохранили исходную структуру папок, чтобы указать папку, в которой находится каталог ord, а не только 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 

Счастливое кодирование!

Смежные вопросы