Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 19, 2010 23:21:15

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

C# парсер

Здравствуйте.

Необходимо разработать утилиту, которая бы парсила исходный код C#, представляла и позволяла работать с ним как с набором объектов, а потом генерировала код из этих объектов. Поиски привели меня сюда: http://wiki.python.org/moin/LanguageParsing . Подскажите, пожалуйста, в правильном ли направлении иду? Если у кого-то есть опыт использования или разработки подобных программ, работы с парсерами языков, просьба поделиться :) Буду рад любой информации.



Офлайн

#2 Сен. 25, 2010 17:36:28

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

C# парсер

При такой постановке задаче проще всего попросить исходники csc.exe у Билла Гейтса см http://msdn.microsoft.com/en-us/library/ms379563%28VS.80%29.aspx
Есть большое количество генераторов компиляторов (yacc,bison,antlr,coco/R,…), но их использование требует относительно высокой квалификации каждого из участников разработки такой программы, для C# я думаю их потребуется не менее 10. У coco Есть порт под питон.



Офлайн

#3 Сен. 26, 2010 20:22:34

sypper-pit
От: Ulan-Ude(msk)
Зарегистрирован: 2009-01-30
Сообщения: 1102
Репутация: +  6  -
Профиль   Отправить e-mail  

C# парсер

Soteric
http://docs.python.org/extending/ читал ?

Офлайн

#4 Сен. 26, 2010 21:02:01

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

C# парсер

Да при чем тут Python Extending?
Нужен парсер вроде plex/ply.

Беда в другом. Грамматика C# непростая. Генерация “наоборот” - отдельная тема.
Работы много, и она непростая.
Может, хотелось на самом деле чего-то другого? Которое на самом деле решается гораздо проще, чем
- разобрать исходный код
- поправить его
- собрать рабочую программу



Офлайн

#5 Сен. 27, 2010 11:38:27

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

C# парсер

Да, очень возможно что можно сделать проще. Это один из способов, меня заинтересовало насколько сложно он реализуется. Я нашел такую библиотеку написанную на C#. Она распознает конструкции языка, но до 2.0 версии, не позднее. Я подумал, что может быть и на питоне подобная библиотека существует :)

Похоже задача сродни написанию компилятора, это конечно весьма трудоемко. Ладно, нет так нет :) Спасибо.



Офлайн

#6 Сен. 27, 2010 14:39:54

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

C# парсер

Для Питона работа с С# кодом - не приоритетное направление :)
Другое дело - обработка питоновских исходников. Тут много чего есть готового



Офлайн

#7 Сен. 27, 2010 15:58:23

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

C# парсер

> которая бы парсила исходный код C#
> Работы много, и она непростая.
Причём это самая простая часть вопроса :-).

>> а потом генерировала код
!

Если хочется работать именно с синтаксисом C# (а не с .NET Framework), то самый адекватный вариант, это создание интерпретатора. Задача генерирования CIL (байт-код) или нативного кода мягко говоря не простая (иначе выбор компиляторов был бы чуть большим чем сейчас) и есть уверенность в своих силах, то стоит начать составлять график работ на несколько лет вперёд.

>> распознает конструкции языка, но до 2.0 версии, не позднее. Я подумал, что может быть и на питоне подобная библиотека существует
Есть найдёшь какой-нибудь EBNF для C#, то в чём вопрос! Хотя может и готовое есть, для разбора синтаксиса, не интересовался.

..bw



Офлайн

#8 Сен. 27, 2010 21:24:51

sypper-pit
От: Ulan-Ude(msk)
Зарегистрирован: 2009-01-30
Сообщения: 1102
Репутация: +  6  -
Профиль   Отправить e-mail  

C# парсер

Андрей Светлов
Да при чем тут Python Extending?
Нужен парсер вроде plex/ply.
на сколько я понял
Soteric
и позволяла работать с ним как с набором объектов
зачем это надо если можно сразу обращаться к объектам :)

Офлайн

#9 Сен. 27, 2010 22:01:46

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

C# парсер

Изначально идея состоит в следующем. Есть исходный дистрибутивный файл. Сторонние разработчики для добавления функционала независимо друг от друга могут менять этот файл (каждый разработчик работает над своей фичей, друг о друге и изменениях файла они не знают). Необходимо написать утилиту, которая могла бы накладывать изменения разных разработчиков и как можно более корректно разрешать конфликтные моменты в коде.

Т.е. это что-то вроде системы контроля версий SVN, CVS. Но с ними все относительно просто: есть централизованный репозиторий и каждое изменение мы накладываем учитывая изменения своих товарищей. В данном случае есть центральный репозиторий и есть набор патчей для этого репозитория. Пользователь скачивает из репозитория программу. Если ему нужна какая-то фича, то он устанавливает один патч. Если ему понадобилась вторая фича, то утилита, о которой идет речь, как можно более корректно сравнивает файлы и добавляет нужные изменения из второго патча, чтобы не затереть первую фичу.

Самое подходящее решение - использование утилит diff/merge. Но во-первых они основаны на построчном сравнивании, поэтому будут просто перезатирать предыдущие изменения. А во-вторых в некоторых случаях требуется несколько более интеллектуальное действие: например при установке патча посмотреть чему равно значение переменной в коде и увеличить ее значение на единицу. Работа с исходным кодом как со структурой данных, а не просто набором строк, очень облегчило бы задачу. Но видно не судьба, придется основную работу возложить на diff/merge, а для интеллектуальной уже писать какой-то парсер, который будет просто находить нужные места по регулярным выражениям и делать свою работу.

Как-то так :)



Офлайн

#10 Сен. 28, 2010 09:45:28

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

C# парсер

А провести декомпозицию, чтобы на каждую фичу приходилось по классу - воспитание не позволяет?



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version