Здравствуйте, hardcase, Вы писали:
H>Парсер C#4.0, генерирующий AST, вроде как принял законченную форму к r9078. Кому интересно, может посмотреть и ужаснуться.
Ужасаться там не чем. Наоборот — отличная работа! Надеюсь не за горами полноценный конвертер из C# в Nemerle и компиляция C#-исходников (без динамиков и ансэйфа) в рамках Nemerle-проектов.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, hardcase, Вы писали:
H>Здравствуйте, hardcase, Вы писали:
H>Парсер C#4.0, генерирующий AST, вроде как принял законченную форму к r9078. Кому интересно, может посмотреть и ужаснуться.
Практически завершил работу над транслятором C# AST -> Nemerle AST.
В r9114 он умеет транслировать все мыслимые члены классов, предложения и выражения C#.
Осталось: трансляция LINQ, вменяемая работа с атрибутами (сейчас цель атрибутов игнорируется), ну и поиск багов, связанных с локациями.
НЕ поддерживаются следующие фичи C#:
dynamic;
extern alias; (работает для global:)
все, что связано с unsafe: указатели, stackalloc, sizeof, fixed, буферы фиксированных размеров;
конструкция goto (а также goto case и goto default);
в конструкторах массивов c инициализатором игнорируется их размер, например тут: new int[4] { 1, 2, 3, 4 }.
Поддерживаются следующие фичи Nemerle:
полноценный вывод типов для var и возможность опускать параметры типов;
вывод типов для делегатов и лямбд;
открытие классов конструкцией using;
макросы-функции с аргументами-выражениями в стиле C#, например printf;
макроатрибуты с аргументами-выражениями в стиле C#, например Accessor.
Собственно говоря получился тот же Nemerle, с синтаксисом C#.
Здравствуйте, hardcase, Вы писали:
H>НЕ поддерживаются следующие фичи C#: H>модификаторы вариантности ref/out;
А чё так? Немерл же их поддерживает.
H>конструкция goto (а также goto case и goto default);
goto case и goto default можно было бы и реализовать. Какие с ними проблемы?
H>в конструкторах массивов c инициализатором игнорируется их размер, например тут: new int[4] { 1, 2, 3, 4 }.
Можно переписывать в код отдельно создающие массив, и отдельно копирующий в него элементы из другого.
H>Собственно говоря получился тот же Nemerle, с синтаксисом C#.
Без синтаксических расширений.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, hardcase, Вы писали:
H>>НЕ поддерживаются следующие фичи C#: H>>модификаторы вариантности ref/out;
VD>А чё так? Немерл же их поддерживает.
А как их обрабатывать?
H>>конструкция goto (а также goto case и goto default);
VD>goto case и goto default можно было бы и реализовать. Какие с ними проблемы?
Я не знаю как их обработать.
H>>в конструкторах массивов c инициализатором игнорируется их размер, например тут: new int[4] { 1, 2, 3, 4 }.
VD>Можно переписывать в код отдельно создающие массив, и отдельно копирующий в него элементы из другого.
Это не спортивно. Нужно все же статически анализировать размеры. Сейчас выдается предупреждение.
Здравствуйте, hardcase, Вы писали:
H>>>НЕ поддерживаются следующие фичи C#: H>>>модификаторы вариантности ref/out; VD>>А чё так? Немерл же их поддерживает.
H>А как их обрабатывать?
VD>>goto case и goto default можно было бы и реализовать. Какие с ними проблемы? H>Я не знаю как их обработать.
ОК. Подумаем.
H>>>в конструкторах массивов c инициализатором игнорируется их размер, например тут: new int[4] { 1, 2, 3, 4 }.
VD>>Можно переписывать в код отдельно создающие массив, и отдельно копирующий в него элементы из другого.
H>Это не спортивно. Нужно все же статически анализировать размеры. Сейчас выдается предупреждение.
Что-то не понял. Что там анализировать то?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
H>>>>в конструкторах массивов c инициализатором игнорируется их размер, например тут: new int[4] { 1, 2, 3, 4 }.
VD>>>Можно переписывать в код отдельно создающие массив, и отдельно копирующий в него элементы из другого.
H>>Это не спортивно. Нужно все же статически анализировать размеры. Сейчас выдается предупреждение.
VD>Что-то не понял. Что там анализировать то?
Сравнивать фактическое количество элементов (1, 2, 3, 4) с заявляенным в конструкторе — 4.
что можно сделать с поддержкой intelliSence в *.cs?
похоже студия открывает эти файлы вне проекта, как будто бы открыт только один этот cs-файл.
в связи с чем intelliSence, навигация и т.п. работают не очень...
Здравствуйте, para, Вы писали:
P>Здравствуйте, hardcase:
P>Супер!!
P>ОТЛАДКА по cs-файлу работает!!! P>МАГИЯ!!!
Дык, должна. Я локации в файлах постарался сохранить.
P>Вопрос (понимаю, что не очень в тему):
P>что можно сделать с поддержкой intelliSence в *.cs? P>похоже студия открывает эти файлы вне проекта, как будто бы открыт только один этот cs-файл. P>в связи с чем intelliSence, навигация и т.п. работают не очень...
Я думаю вопрос не ко мне а к владу — студия сама разбирает эти файлы (SD поступает точно также).
Я в ближайшее время займусь интеграцией C# парсера в компилятор.
Здравствуйте, para, Вы писали:
P>что можно сделать с поддержкой intelliSence в *.cs?
Ничего. По крайней мере без хаков.
P>похоже студия открывает эти файлы вне проекта, как будто бы открыт только один этот cs-файл. P>в связи с чем intelliSence, навигация и т.п. работают не очень...
Расширение cs зарезервировано за языковым сервисом MS. Еще решапер его перехватывает (если он установлен).
Конечно можно пытатьс поступать как решарпер, то это не просто и может привести к ужасным наложенным багам (особенно в присутсвтии решарпера).
Более разумный способ — завести для встроенного в немерловые проекты C#-а отдельное расширение (например, cs-n) и создать (и зарегистрировать) для него собственный языковый сервис. Но это не малый объем работы.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Более разумный способ — завести для встроенного в немерловые проекты C#-а отдельное расширение (например, cs-n) и создать (и зарегистрировать) для него собственный языковый сервис. Но это не малый объем работы.
я тоже об этом думал, ведь от c# только синтаксис, а с метоатрибутами это уже "диалект" nemerle, т.е. компилятором CS его в общем случае не обработаешь.
По этому логично ввести новое расширение например "ncs" и обрабатывать его, как файл немерла. и ни какого дополнительного сервиса получается не надо или я не совсем прав?
Здравствуйте, para, Вы писали:
P>По этому логично ввести новое расширение например "ncs" и обрабатывать его, как файл немерла. и ни какого дополнительного сервиса получается не надо или я не совсем прав?
Нет не прав. Парсер и лексер важные части интеграции. Для корректной работы нужно создавать свой языковый сервис.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, hardcase, Вы писали:
H>Парсер C#4.0, генерирующий AST, вроде как принял законченную форму к r9078. Кому интересно, может посмотреть и ужаснуться.
Надо Хейльсбергу и Ко послать. Пусть поучаться как делать нормальный вывод типов
Если нам не помогут, то мы тоже никого не пощадим.