Я создаю библиотеку, которая содержит определенные парсеры. Эти парсеры встроены в ANTLR4. Поскольку созданные классы являются общедоступными, пользователи моей библиотеки могут видеть все классы, которые им не нужны. Также в документации Sandcastle содержатся все эти классы. Есть ли какой-нибудь способ, которым я могу сказать Antlr, сделать созданные классы внутренними, а не публичными?Antlr создал модификатор доступа классов к внутренним
ответ
Мы не реализовали public/private в сгенерированных классах, но я не думаю.
Вы можете изменить строковые шаблоны.
Вы можете начать here.
Я никогда не делал этого сам, чтобы быть честным, и вам, возможно, придется повторить шаг после публикации новой публикации (хотя слияние поможет вам, вам все равно придется проверять, есть ли новые «публичные») ,
Один довольно эффективный подход заключается в реализации фасада над сгенерированным Antlr кодом и в то же время запутывание сгенерированного кода. Это дает вам четкий, независимый контроль над тем, что ваши пользователи могут видеть и использовать. Обфускатор ProGuard хорошо справляется с этим типом использования.
Собственно, это относительно легко сделать. Внутри ANTLR использует файлы StringTemplate для генерации кода для каждого из поддерживаемых языков. Для C#, вы можете найти здесь шаблон в файле JAR в Antlr в:
орг \ Antlr \ v4 \ инструмент \ Шаблоны \ Codegen \ CSharp \ CSharp.stg
Просто сделать копию этого файл и изменить его по мере необходимости. Например, я обычно удаляю атрибуты CLSCompliant(false)
, чтобы избавиться от предупреждений компилятора и сделать все классы и интерфейсы внутренними.
Затем вам необходимо сообщить ANTLR, чтобы использовать модифицированный шаблон во время генерации кода. Для этого вам нужно поместить его в CLASSPATH
до ANTLR's JAR и убедитесь, что вы сохранили исходную структуру папок, чтобы указать папку, в которой находится каталог ord
, а не только CSharp.stg
,
Вот пример структуры папок, которые вы можете использовать:
В этом случае Generate.bat
должен выглядеть следующим образом (при условии, что java.exe
находится в вашем PATH
):
pushd %~dp0
set CLASSPATH=.;antlr-4.7-complete.jar
java org.antlr.v4.Tool -Dlanguage=CSharp Grammar.g4
Счастливое кодирование!
- 1. Абстрактный модификатор доступа к конструктору классов
- 2. модификатор доступа к классу в C#
- 3. Модификатор доступа к уровню библиотеки
- 4. Модификатор доступа к динамическому методу
- 5. Модификатор доступа для пространства имен
- 6. Внутренний модификатор доступа к классу не работает?
- 7. C# Внутренний модификатор доступа
- 8. Java Модификатор доступа приоритет
- 9. Модификатор «защищенный» уровень доступа
- 10. Java - защищенный модификатор доступа
- 11. Защищенный модификатор доступа
- 12. Модификатор доступа VS Свойства
- 13. Java: модификатор доступа Confusion
- 14. доступа к пакету (Protected Модификатор) в Java
- 15. Protected Модификатор доступа
- 16. Как увеличить модификатор доступа свойства
- 17. Изменить модификатор доступа к классу Scala по умолчанию
- 18. Модификатор доступа класса Member
- 19. Модификатор доступа подкласса C++?
- 20. что использовать модификатор доступа
- 21. Ограничение доступа к внутренним службам WCF
- 22. Как изменить модификатор доступа пользовательского элемента управления
- 23. модификатор доступа для защищенного метода
- 24. модификаторы доступа C# - внутренний модификатор
- 25. python - модификатор доступа вложенного класса
- 26. Где используется модификатор доступа Friend?
- 27. Предотвращение доступа пользователей к полям классов
- 28. Организация пакета Java и модификатор доступа
- 29. Модификатор общедоступного доступа для весенних бобанов
- 30. Недопустимый модификатор доступа «уровень рамки»