npg
От: konsoletyper Россия https://github.com/konsoletyper
Дата: 13.04.07 15:18
Оценка:
См. этот архив.

Так называется побочная ветвь проекта BnfMacro. К собственно макросу я пока не приступал. Однако, уже получился генератор парсера/лексера. Думаю, того лексера, который генерится утилитой, вполне достаточно, чтобы, например, делать подсветку на RSDN. Так что если я не успею с макросом, вполне можно юзать утилитку.

К сожалению, пока нет никакой документации, но сейчас занимаюсь этим. Можно взять имеющиеся bnf-файлы и разбираться по ним.

Чтобы скомпилить проект, нужно заменить имеющийся файл Nemerle.MSbuild.targets на тот, который прилагается в архиве в папке misc. Так же нужно в корне солюшна положить файл nunit.framework.dll, либо вообще отключить вроект Common.Tests.

В папке с бинарниками я положил лексику C#. Сгенерированный лексер пока не тестировал, но по идее должен работать.
... << RSDN@Home 1.2.0 alpha rev. 672>>
Re: npg
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.04.07 23:18
Оценка:
Здравствуйте, konsoletyper, Вы писали:

K>См. этот архив.


K>Так называется побочная ветвь проекта BnfMacro. К собственно макросу я пока не приступал. Однако, уже получился генератор парсера/лексера. Думаю, того лексера, который генерится утилитой, вполне достаточно, чтобы, например, делать подсветку на RSDN. Так что если я не успею с макросом, вполне можно юзать утилитку.


K>К сожалению, пока нет никакой документации, но сейчас занимаюсь этим. Можно взять имеющиеся bnf-файлы и разбираться по ним.


K>Чтобы скомпилить проект, нужно заменить имеющийся файл Nemerle.MSbuild.targets на тот, который прилагается в архиве в папке misc. Так же нужно в корне солюшна положить файл nunit.framework.dll, либо вообще отключить вроект Common.Tests.


K>В папке с бинарниками я положил лексику C#. Сгенерированный лексер пока не тестировал, но по идее должен работать.


Может ли кто-то взять это дело и покумекать как на его базе можно было бы создать колорер (подкрашиватель исходников к фрагментам кода)?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: npg
От: konsoletyper Россия https://github.com/konsoletyper
Дата: 15.04.07 05:24
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Может ли кто-то взять это дело и покумекать как на его базе можно было бы создать колорер (подкрашиватель исходников к фрагментам кода)?


Уже вчера поэкспериментировал с этим. Подсветка получается нормальная, за исключением препроцессора, который пока распознаётся как ошибка. Вообще, лексика препроцессора несколько отличается от лексики обычного кода. Я в таких случаях вижу следующий выход: надо сделать два лексера, первый для кода, второй для пропроцессора. Такая возможность предусмотрена в генераторе, только не доведена доконца. А именно, режимы лексера задаются числами. А это неудобно, нужно бы генерить дополнительный enum (LexerModes), и режимы задавать им.

Так же обнаружился глюк при распознавании ошибок — поле Text у лексем типа Error заполняется неправильно. Буду фиксить.

Есть у колорера и ещё один недостаток — отсутствие обработки табов. Для этого нужно контролировать каждый символ, в какой позиции он находится. Но такой же контроль есть в лексере. Я вот думаю: а что если добавить эту функциональность в сборку Common.dll, чтобы избежать дублирования кода?

Как только разберусь с этими пунктами, вышлю сюда готовый колорер. Надеюсь, сегодня к вечеру управлюсь.

Есть ещё одно предложение. В качестве теста утилиты хочу сделать полноценный колорер кода на основе синтаксического анализатора. Думаю, работа несложная, т.к. результатом работы парсера будет просто список тех мест, которые нужно ракрасить по-особому. Причём никакого контроля типов и т.д. не будет, а типами будут считаться ключевые слова, которые синтаксически должны быть типами, но необязательно ими являются. Правда, при таком подходе могут быть неоднозначности, но это лучше, чем ничего.

Такая штуковина непригодна для сайта, т.к. запостить можно и кусок кода. Т.е. нужно определить, какой нетерминал находится в корне, а я даже не представляю себе, как такое сделать (может, это вообще нерешаемая задача).
... << RSDN@Home 1.2.0 alpha rev. 672>>
Re[3]: npg
От: konsoletyper Россия https://github.com/konsoletyper
Дата: 15.04.07 13:20
Оценка:
Не стал особо разбираться с препроцессором и с глюками. Того тупого распознавания, которое я сделал, вполне хватит для колорера для сайта. А если глюки исправлю, то надо будет высылать новую версию, чего мне делать не хочется. Вот если перенести проект на местный svn, то с этим будет гораздо проще.

Короче, здесь лежит простенький колорер для C#. Чтобы сбилдить, опять же, понадобится Nemerle.MSBuild.targets отсюда, т.к. стандартный targets-файл не поддерживает ресурсы. Колорер использует преобразование xslt, потому работает не очень быстро. Можно в принципе прикрутить бенчмарк, который меряет время именно распарсивания. Хотя общую картину будет портить работа с DOM XML. В общем, у меня не стояло цели сделать быстрый колорер, а просто показать, как такое в принципе делается.

Так что теперь можно писать подсветку для других языков. Правда, для некоторых вещей понадобятся недокументированные ( ) возможности. Опишу их вкратце.

Если внимательно приглядеться к файлу BnfParser/bnf-macro.bnf из исходников генератора, то можно заметить, что лексеров можно описать несколько. Я добавил такую фичу, когда писал лексер для XML. Там нельзя бить на непересекающиеся классы все лексемы — какое именно из разбиений используется, определяется контекстом. Короче, используется 6 лексеров, между которыми идёт переключение при поступлении тех или иных лексем. Все лексеры помещены в один класс, а переключение между ними выполняется с помощью свойства Mode.

Чтобы не повторять описания, можно до первого раздела lexer добавить раздел subst, в котором описать все нужные вспомогательные правила, а из лексеров ссылаться на них. Выглядеть это может так:

subst
{
    AuxRule1 ::= ...;
    AuxRule2 ::= ...;
}

lexer (name = "First")
{
    Rule1 ::= AuxRule1 | AuxRule2;
    Rule2 ::= AuxRule1 "," AuxRule2;
}

lexer (name = "Second")
{
    Rule1 ::= AuxRule1;
    Rule3 ::= AuxRule2+ AuxRule1;
}


Эквивалентно:

lexer (name = "First")
{
    subst AuxRule1 ::= ...;
    subst AuxRule2 ::= ...;
    Rule1 ::= AuxRule1 | AuxRule2;
    Rule2 ::= AuxRule1 "," AuxRule2;
}

lexer (name = "Second")
{
    subst AuxRule1 ::= ...;
    subst AuxRule2 ::= ...;
    Rule1 ::= AuxRule1;
    Rule3 ::= AuxRule2+ AuxRule1;
}


Если лексеров больше одного, то нужно обязательно указывать для них имена. Пока свойство Mode имеет тип int. Но в будущем я это исправлю.
... << RSDN@Home 1.2.0 alpha rev. 672>>
Re[4]: npg
От: Блудов Павел Россия  
Дата: 16.04.07 03:48
Оценка:
Здравствуйте, konsoletyper, Вы писали:

K>Короче, здесь лежит простенький колорер для C#. Чтобы сбилдить, опять же, понадобится Nemerle.MSBuild.targets отсюда, т.к. стандартный targets-файл не поддерживает ресурсы.

Теперь поддерживает.
... << RSDN@Home 1.2.0 alpha rev. 642>>
Re[3]: npg
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.04.07 07:37
Оценка:
Здравствуйте, konsoletyper, Вы писали:

K>Есть ещё одно предложение. В качестве теста утилиты хочу сделать полноценный колорер кода на основе синтаксического анализатора.


Синтаксис это по-моему лишнее. Но вот состояния ввести надо. Ведь код он внутри сообщений. Плюс надо еще поддерживать выделение жирным, курсивом и красным цветом как в коде, так и за его пределами. Ну, и естественно подсветка кода должна прекращаться когда встречается закрывающий тег языка.

В общем, подключайся к нашей супер-команды. Как раз 10-ым будешь.

Займешся колорером. Продумаем все по сильнее... а потом в интерактивном режиме доведем до ума.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: npg
От: konsoletyper Россия https://github.com/konsoletyper
Дата: 16.04.07 13:35
Оценка:
Здравствуйте, Блудов Павел, Вы писали:

K>>Короче, здесь лежит простенький колорер для C#. Чтобы сбилдить, опять же, понадобится Nemerle.MSBuild.targets отсюда, т.к. стандартный targets-файл не поддерживает ресурсы.

БП>Теперь поддерживает.

Ну не знаю, в дистрибутиве интеграции (кстати, спасибо ещё раз за неё) лежал файл, который ругался на ресурсы.
... << RSDN@Home 1.2.0 alpha rev. 672>>
Re[4]: npg
От: konsoletyper Россия https://github.com/konsoletyper
Дата: 16.04.07 13:35
Оценка:
Здравствуйте, VladD2, Вы писали:

K>>Есть ещё одно предложение. В качестве теста утилиты хочу сделать полноценный колорер кода на основе синтаксического анализатора.


VD>Синтаксис это по-моему лишнее. Но вот состояния ввести надо. Ведь код он внутри сообщений. Плюс надо еще поддерживать выделение жирным, курсивом и красным цветом как в коде, так и за его пределами. Ну, и естественно подсветка кода должна прекращаться когда встречается закрывающий тег языка.


Что-то я не понял. А почему бы просто не пропускать через колорер содержимое элеметна [code]?

VD>В общем, подключайся к нашей супер-команды. Как раз 10-ым будешь.


Рад бы. Только сейчас активно готовлюсь к досрочной сдаче сессии. Кроме того, у меня интернет по dial-up, так что общаться оперативно со мной не получится. Короче, пока могу работать с очень низкой продуктивностью.
... << RSDN@Home 1.2.0 alpha rev. 672>>
Re[5]: npg
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.04.07 15:24
Оценка:
Здравствуйте, konsoletyper, Вы писали:

K>Что-то я не понял. А почему бы просто не пропускать через колорер содержимое элеметна [code]?


Так и надо делать. Но ведь парсить "верхний" формат тоже надо ведь.

K>Рад бы. Только сейчас активно готовлюсь к досрочной сдаче сессии. Кроме того, у меня интернет по dial-up, так что общаться оперативно со мной не получится. Короче, пока могу работать с очень низкой продуктивностью.


Ну, хоть с какой. У нас проект в начальной стадии. Задача (при наличии построителя парсера) не сложная. Так что если потихоничку будль делать, то как раз когда мы подйдем к сообщениям можно у тебя уже все будет готово.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: npg
От: _pk_sly  
Дата: 20.04.07 09:46
Оценка:
K>См. этот архив.

надо было arj выложить, было бы интереснее
Re[2]: npg
От: konsoletyper Россия https://github.com/konsoletyper
Дата: 20.04.07 12:49
Оценка:
Здравствуйте, _pk_sly, Вы писали:

K>>См. этот архив.


__>надо было arj выложить, было бы интереснее


А что не нравится в 7Zip?
... << RSDN@Home 1.2.0 alpha rev. 672>>
Re[3]: npg
От: Блудов Павел Россия  
Дата: 21.04.07 03:09
Оценка: :))
Здравствуйте, konsoletyper, Вы писали:

K>А что не нравится в 7Zip?

Как что? Он же быстрый, маленький, удобный и, главное, бесплатный
Следовательно, он крадёт деньги у разработчиков zip/rar/arj.
... << RSDN@Home 1.2.0 alpha rev. 642>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.