Генератор исходника Nemerle из дерева и из C#, а также Peg
От: CodingUnit Россия  
Дата: 22.06.11 14:37
Оценка: 6 (1)
Мы начали с Владом переписку по почте с обсуждением различных вопросов, но Влад предложил вынести обсуждение на форум, чтобы если будут интересные ответы, которые могли бы быть полезны другим. Начали обсуждение с вопроса о Peg, парсере для текстового языка диаграмм состояний, а также проблем генерации исходников в макросах. Сейчас продолжаю задавать вопросы Владу, ребятам создававшим Nemerle.Peg и CSharpParser, и всему сообществу. На обсуждение вопрос о генерации исходника из дерева.
Есть встроенный генератор для отладочных нужд, типа TypeBuilder.DefineWithSource, но он не поддерживает вложенные типы, верхние объявления, которые должны добавляться в TypeBuilder методами DefineNested, но исходника никак не сделать для отладки, за отсутствием метода с приставкой WithSource. Код методов худо бедно генерится PrettyPrint ом.
Поэтому было бы неплохо доделать полноценную генерацию для верхних типов TopDeclaration, вложенных и всего остального, чтобы можно было делать качественные отладочные исходники. А также приятный плюс впридачу к парсингу C# и использованию в проектах Nemerle, конвертить C# в исходник Nemerle, благо большая часть уже готова, то есть PrettyPrint.
За все это я решил взяться, и уже начал работать, потому что потребность назрела, и возник ряд насущных вопросов в связи с этим.
1) При использовании конвертера CSharpToNemerle который получает в результате Ast Nemerle, ему на вход в конструкторе требуется ManagerClass, откуда его взять? Если мы в обычной программе, а не в макросе, Создать самому? Он инициализирует некоторые структуры только при вызове Run, как его инициализировать до этого, чтобы полноценно распарсить C# и получить Ast Nemerle для последующей обработки?

2) Куда все это положить, я начал делать у себя в своей папке, думаю сделать метод PrintBody в TopDeclaration как в методе ClassMember, сам TopDeclaration сделать partial и вынести код печати в отдельный исходник, которому как в ClassMember передается LocatableTextWriter, и он сам себя должен распечатать в него. То есть объединить генерацию исходника Nemerle из C# с генерацией обычного отладочного кода Nemerle, чтобы не делать двойную работу. Может кто придумает вариант с местоположением лучше.

3) Исходник в parsetree ncc будет наверное называться TreePrint.n, или PrintTree.n есть у кого варианты лучше?

4) Ничего если я сделаю открытыми типы LocatableTextWriter и LocatingTextWriter в Nemerle.Compiler чтобы работать из внешнего кода с ними, из своей библиотеки, чтобы тестить код без перекомпиляции всего Nemerle?

5) Также для этого нужен открытым метод ClassMember.PrintBody можно ли его открыть, или это даст брешь в архитектуре компилятора?

6) Встает проблема с генерацией namespace, парсер CSharpToNemerle в результате дает ParseResult в котором есть список TopDeclaration, понятно что каждый из них находиться в своем namespace может в одном а может и в разных. Тут надо как то придумать как создавать пространства имен, как в исходном тексте C#, если есть Location можно как то отсортировать по ним сами пространства, а потом вложить их друг в друга как они должны быть и в них раскрывать TopDeclaration, может кто предложит вариант лучше?

Прошу простить если кого смутит большое навороченное сообщение, с разными частными деталями, я задавал вопрос Владу по почте, но он настоял чтобы вынести на форум, что получилось то получилось. Сам же Влад да не презрит сие начертание.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.