Форум сайта python.su
20
Здравствуйте.
Необходимо разработать утилиту, которая бы парсила исходный код C#, представляла и позволяла работать с ним как с набором объектов, а потом генерировала код из этих объектов. Поиски привели меня сюда: http://wiki.python.org/moin/LanguageParsing . Подскажите, пожалуйста, в правильном ли направлении иду? Если у кого-то есть опыт использования или разработки подобных программ, работы с парсерами языков, просьба поделиться :) Буду рад любой информации.
Офлайн
253
При такой постановке задаче проще всего попросить исходники csc.exe у Билла Гейтса см http://msdn.microsoft.com/en-us/library/ms379563%28VS.80%29.aspx
Есть большое количество генераторов компиляторов (yacc,bison,antlr,coco/R,…), но их использование требует относительно высокой квалификации каждого из участников разработки такой программы, для C# я думаю их потребуется не менее 10. У coco Есть порт под питон.
Офлайн
6
Soteric
http://docs.python.org/extending/ читал ?
Офлайн
14
Да при чем тут Python Extending?
Нужен парсер вроде plex/ply.
Беда в другом. Грамматика C# непростая. Генерация “наоборот” - отдельная тема.
Работы много, и она непростая.
Может, хотелось на самом деле чего-то другого? Которое на самом деле решается гораздо проще, чем
- разобрать исходный код
- поправить его
- собрать рабочую программу
Офлайн
20
Да, очень возможно что можно сделать проще. Это один из способов, меня заинтересовало насколько сложно он реализуется. Я нашел такую библиотеку написанную на C#. Она распознает конструкции языка, но до 2.0 версии, не позднее. Я подумал, что может быть и на питоне подобная библиотека существует :)
Похоже задача сродни написанию компилятора, это конечно весьма трудоемко. Ладно, нет так нет :) Спасибо.
Офлайн
14
Для Питона работа с С# кодом - не приоритетное направление :)
Другое дело - обработка питоновских исходников. Тут много чего есть готового
Офлайн
20
> которая бы парсила исходный код C#
> Работы много, и она непростая.
Причём это самая простая часть вопроса :-).
>> а потом генерировала код
!
Если хочется работать именно с синтаксисом C# (а не с .NET Framework), то самый адекватный вариант, это создание интерпретатора. Задача генерирования CIL (байт-код) или нативного кода мягко говоря не простая (иначе выбор компиляторов был бы чуть большим чем сейчас) и есть уверенность в своих силах, то стоит начать составлять график работ на несколько лет вперёд.
>> распознает конструкции языка, но до 2.0 версии, не позднее. Я подумал, что может быть и на питоне подобная библиотека существует
Есть найдёшь какой-нибудь EBNF для C#, то в чём вопрос! Хотя может и готовое есть, для разбора синтаксиса, не интересовался.
..bw
Офлайн
6
Андрей Светловна сколько я понял
Да при чем тут Python Extending?
Нужен парсер вроде plex/ply.
Sotericзачем это надо если можно сразу обращаться к объектам :)
и позволяла работать с ним как с набором объектов
Офлайн
20
Изначально идея состоит в следующем. Есть исходный дистрибутивный файл. Сторонние разработчики для добавления функционала независимо друг от друга могут менять этот файл (каждый разработчик работает над своей фичей, друг о друге и изменениях файла они не знают). Необходимо написать утилиту, которая могла бы накладывать изменения разных разработчиков и как можно более корректно разрешать конфликтные моменты в коде.
Т.е. это что-то вроде системы контроля версий SVN, CVS. Но с ними все относительно просто: есть централизованный репозиторий и каждое изменение мы накладываем учитывая изменения своих товарищей. В данном случае есть центральный репозиторий и есть набор патчей для этого репозитория. Пользователь скачивает из репозитория программу. Если ему нужна какая-то фича, то он устанавливает один патч. Если ему понадобилась вторая фича, то утилита, о которой идет речь, как можно более корректно сравнивает файлы и добавляет нужные изменения из второго патча, чтобы не затереть первую фичу.
Самое подходящее решение - использование утилит diff/merge. Но во-первых они основаны на построчном сравнивании, поэтому будут просто перезатирать предыдущие изменения. А во-вторых в некоторых случаях требуется несколько более интеллектуальное действие: например при установке патча посмотреть чему равно значение переменной в коде и увеличить ее значение на единицу. Работа с исходным кодом как со структурой данных, а не просто набором строк, очень облегчило бы задачу. Но видно не судьба, придется основную работу возложить на diff/merge, а для интеллектуальной уже писать какой-то парсер, который будет просто находить нужные места по регулярным выражениям и делать свою работу.
Как-то так :)
Офлайн
14
А провести декомпозицию, чтобы на каждую фичу приходилось по классу - воспитание не позволяет?
Офлайн