Здравствуйте, _FRED_, Вы писали:
_FR>То есть нужно сделать то же, что делает cl.exe /E, а потом уже обычгым компилятором пройтись? #line ещё нужно учесть
Примерно так.
#line при двупроходном парсенге то же не трудно поддержать.
_FR>(есть такая в Немерле?).
Немерле тут не причем. Это совершенно отдельный парсер.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, VladD2, Вы писали:
VD>Как раз самое простое решение.
Ну-ну.
VD>А их никто игнорировать не будет. Игнорироваться будет то, что в неактивной части #if-а будет. Студия такой код серым закрашивает.
И как ты из правила s : void собрался AST возвращать?
VD>Что там отлаживать? Просто правило может сфайлить на основании того что оно прочитало из АСТ.
Ту кучу императива которая образуется вокруг этого.
Кстати как ты собрался #line поддерживать?
VD>Ты просто не понял озвученного. Оно как раз самое что не наесть красивое и простое в реализации. И что самое главное практически декларативное.
Ты посмотри на ту грязь что ты уже накатал. А ведь там еще писать и писать.
Прикинь как ты в своей схеме будешь вот это ловить:
#if ASD
#region qwe
#endif
#endregion
или это
#if ASD
#region qwe
#else
#endregion
#endif
А я еще кучу страшного кода придумаю.
И про #line не забывай.
Тоже очень пакостная директива.
VD>Вот это самое что ни на есть кривое решение.
За то его можно заставить работать в отличии от твоего.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
VD>>А их никто игнорировать не будет. Игнорироваться будет то, что в неактивной части #if-а будет. Студия такой код серым закрашивает. WH>И как ты из правила s : void собрался AST возвращать?
Никак. АСТ препроцессора и комментарии — это параллельная вещь. Информацию о них просто нужно сложить в отдельный массив/массивы.
VD>>Что там отлаживать? Просто правило может сфайлить на основании того что оно прочитало из АСТ. WH>Ту кучу императива которая образуется вокруг этого. WH>Кстати как ты собрался #line поддерживать?
Это штука каверзная. Причем главным образом тем, что она не всегда должна влиять на локешоны. Скажем для целей интеграции и компилятора она вообще не должна существовать, чтобы все сообщения об ошибках и навигация работали корректно. А нужна она для разных тексто-генерирующих утилит донемерловой эры.
По сему информацию о #line так же нужно поместить в отдельный массив и использовать в SourceSnapshot.PositionToLineColumn()
VD>>Ты просто не понял озвученного. Оно как раз самое что не наесть красивое и простое в реализации. И что самое главное практически декларативное. WH> Ты посмотри на ту грязь что ты уже накатал. А ведь там еще писать и писать. WH>Прикинь как ты в своей схеме будешь вот это ловить: WH>
Никак. Это некорректный код. Регионы не могут выходить (по спекам шарпа) за пределы блоков #if-а.
Так что все ОК.
WH>А я еще кучу страшного кода придумаю.
Ага. Только, если можно без ошибок.
WH>И про #line не забывай. WH>Тоже очень пакостная директива.
Ага. Но с отдельным парсером с ней проще не станет. Другого способа как массив пересчета все равно не придумаешь. В прочем, мы похожую фигню уже и так используем.
VD>>Вот это самое что ни на есть кривое решение. WH>За то его можно заставить работать в отличии от твоего.
Да ладно тебе. Что там заставлять работать то?
Ты бы все же в скайпе появлялся иногда. А то используем непрофильные форумы для чатов.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, hardcase, Вы писали:
H>Когда начинал работу над записью грамматики PEG был в зачаточном состоянии. H>А теперь я думаю, что обработка таких эскейпнутых крокодилов может некисло затормозить парсер — дело ли, на кажом символе идентификатора проверять \u.
Вольфхаунд прикрутил ДКА для латеральных грамматик. Возможно, что скорость не замедлится (заметно). Так что попробовать можно.
Как вариант, можно сделать через препроцессор. Кому надо сделает дефайн и получит парсер поддерживающий эту фичу.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
WH>>Самое простое и быстрое решение это передлать парсер на разбор массива char'ов и перед основным парсером проходить парсером который парсит препроцессор и комментарии после чего заменяет их на пробелы. VD>Вот это самое что ни на есть кривое решение.
Оно не столько кривое, сколько расширяющие возможности препроцессор за счёт его независимости. Что неподустмое вообще может оказатсья допустимым при отдельном препроцессоре.
С другой стороны я не уверен что задача препроцессора иенно выкидывать код. Если мы говорим про IntelliSence, то пусть подкрашивается в серый цвет, но
1) В нём работает автодополнение и проч.
2) Remove Usings не будет выкидывать простраинсива имён типов из для неактивной ветки.
И вообще можно найти много случаев, когда надо анализировать все варианты.
Ну и с другой стороны выражение может охватывать #if/#else
Здравствуйте, adontz, Вы писали:
A>С другой стороны я не уверен что задача препроцессора иенно выкидывать код. Если мы говорим про IntelliSence, то пусть подкрашивается в серый цвет, но A>1) В нём работает автодополнение и проч. A>2) Remove Usings не будет выкидывать простраинсива имён типов из для неактивной ветки. A>И вообще можно найти много случаев, когда надо анализировать все варианты.
Препроцессор — это текстовая подстановка. Никто и никогда не будет анализировать не активные части в контексте основного языка, так как они просто могут быть консистенция. Скажем #if можно использовать так:
#if symbol
class
#elseif
struct
#endif
Test
{
}
Так что никакой интеллисенс в "серой" области работать не будет.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Препроцессор — это текстовая подстановка. Никто и никогда не будет анализировать не активные части в контексте основного языка, так как они просто могут быть консистенция.
А как ты в данном случае активную часть обраатывать? Можно встатить private или partial, но private лишь для вложенных классов. Тоже самое можно сделать и с неактивной частью. Вообще не вижу проблемы.
Здравствуйте, adontz, Вы писали:
A>А как ты в данном случае активную часть обраатывать? Можно встатить private или partial, но private лишь для вложенных классов. Тоже самое можно сделать и с неактивной частью. Вообще не вижу проблемы.
В неактивной части даже не обязан быть корректный код. Это может быть любая грязь.
Кроме того неактивных частей может быть несколько и корректный код в них может получаться только при определенном сочетании.
А ты знаешь хотя бы один продукт анализирующий неактивные части препроцессора?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
A>>А как ты в данном случае активную часть обраатывать? Можно встатить private или partial, но private лишь для вложенных классов. Тоже самое можно сделать и с неактивной частью. Вообще не вижу проблемы. VD>В неактивной части даже не обязан быть корректный код. Это может быть любая грязь.
Поэтому для неё ты выдашь Warning, а не Error.
VD>Кроме того неактивных частей может быть несколько и корректный код в них может получаться только при определенном сочетании.
Количество версий код есть 2^(количество пременных компиляции). DEBUG, TRACE, CODE_ANALYSIS и ещё парочка пользовательских это всего 32 версии. Если хранить их не целиком, а как граф с циклами, будет весбма эффективно.
VD>А ты знаешь хотя бы один продукт анализирующий неактивные части препроцессора?
Нет, ведь такое на С# не написать Я не особо-то не и подкалываю сейчас. Вообщето это было бы действительно полезно. Из-за каких-то директив анализ кода может оказаться некорректным — какие-то метод или пременная станут unreferenced и их предложат удалить, хотя правильнее было бы предложить их обернуть в те же условия. Открываются новые возможности рефакторинга для тех кто поддерживает множество конфигураций. Такая функция вРешарпере мне бы пригодилась.
Здравствуйте, adontz, Вы писали:
A>Поэтому для неё ты выдашь Warning, а не Error.
Ага. Здесь мы играем, здесь — нет, а здесь мы рыбу заворачивали. (с)
A>Количество версий код есть 2^(количество пременных компиляции). DEBUG, TRACE, CODE_ANALYSIS и ещё парочка пользовательских это всего 32 версии. Если хранить их не целиком, а как граф с циклами, будет весбма эффективно.
Вообще-то люди разные дефайны делают для разных целей. Да и 32 — это тоже уже круто получается. Процессоры современные не потянут.
VD>>А ты знаешь хотя бы один продукт анализирующий неактивные части препроцессора?
A>Нет, ведь такое на С# не написать
Тут дело не в том можно ли это написать. Тут дело в бессмысленности сего занятия.
VD>Я не особо-то не и подкалываю сейчас. Вообщето это было бы действительно полезно. Из-за каких-то директив анализ кода может оказаться некорректным — какие-то метод или пременная станут unreferenced и их предложат удалить, хотя правильнее было бы предложить их обернуть в те же условия. Открываются новые возможности рефакторинга для тех кто поддерживает множество конфигураций. Такая функция вРешарпере мне бы пригодилась.
Это можно было бы сделать для ряда указанных конфигураций. Тупо спарсить с тем или иным набором символов. Но строить какой-то общий АСТ — это не реально.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Это можно было бы сделать для ряда указанных конфигураций. Тупо спарсить с тем или иным набором символов. Но строить какой-то общий АСТ — это не реально.
Здравствуйте, VladD2, Вы писали:
A>>С некоторой вероятностью придётся делать свою IDE. Правда, не скоро, и это очень радует. VD>Зачем? Есть же Экспресы и #Develop.
Задача очень специфическая, речь не идёт о написании самостоятельного приложения.
Здравствуйте, adontz, Вы писали:
A>>>С некоторой вероятностью придётся делать свою IDE. Правда, не скоро, и это очень радует. VD>>Зачем? Есть же Экспресы и #Develop.
A>Задача очень специфическая, речь не идёт о написании самостоятельного приложения.
Тогда что ты имеешь в виду под своей IDE?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
A>>Задача очень специфическая, речь не идёт о написании самостоятельного приложения. VD>Тогда что ты имеешь в виду под своей IDE?
Здравствуйте, adontz, Вы писали:
ВВ>>Для встраивания что ли? A>Да.
ИМХО не очень идея. Представь вот, что в Ворде, Экселе и проч. были бы свои собственные встроенные студии — причем реализованные по-разному. Ну, собственно, раньше так и было Куда как удобнее в нормальной студии создать специальный проект, потом нажать на кнопочку Install — и все.