Re[14]: почему вы используете регулярные выражения?
От: Klatu  
Дата: 21.01.11 15:49
Оценка: +1
Здравствуйте, Sinclair, Вы писали:

M>>И еще чтобы синтаксис был вехде единым. PCRE настолько распространены, что никто и не думает, что писать можно и по другому.


Да ладно? Посмотри например регэксы в поиске VS. Сильно удивишься.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[15]: почему вы используете регулярные выражения?
От: Sinclair Россия https://github.com/evilguest/
Дата: 21.01.11 16:46
Оценка:
Здравствуйте, Klatu, Вы писали:

M>>>И еще чтобы синтаксис был вехде единым. PCRE настолько распространены, что никто и не думает, что писать можно и по другому.


K>Да ладно? Посмотри например регэксы в поиске VS. Сильно удивишься.

Кто-то явно хотел ответить не мне
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[21]: почему вы используете регулярные выражения?
От: mrTwister Россия  
Дата: 21.01.11 21:35
Оценка: -1
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, netch80, Вы писали:


VD>>>Уверен, что появись указанные бэкэнды у тебя найдутся новые отговорки.


N>>С чего бы вдруг?


VD>Из опыта. Танцоры которым что-то мешает обычно после удаления того что мешает все равно находят что-то что оправдывает трудность танцев.


Ага, кому-то вот язык программирования мешает шедевры производить на свет
лэт ми спик фром май харт
Re[29]: почему вы используете регулярные выражения?
От: mrTwister Россия  
Дата: 21.01.11 21:45
Оценка:
Здравствуйте, VladD2, Вы писали:

J>>Предикат — это совсем не то, что ".*". Предикаты и в регэкспах есть (твой пример с комментарием можно написать в регэкспе вот так:

J>>
J>>/\* ((?! \*/ ) . )* \*/
J>>

J>>непонятно, зачем, правда, когда есть более простой путь, выше).

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

А что, разве указанный jazzer'ом регексп:
/\* ((?! \*/ ) . )* \*/
работает не линейное время?
лэт ми спик фром май харт
Re[26]: почему вы используете регулярные выражения?
От: Mamut Швеция http://dmitriid.com
Дата: 22.01.11 23:45
Оценка:
VD>Экспоненту получить вообще сложно. Хреновые показатели будут на грамматиках с большими общими префиксами и на грамматиках чей класс очень сильно и постоянно отличается от LL(1). Короче, на грамматиках для разбра которых нужны частые и глубокие откаты.

VD>Вот только 99% языков как раз имеют почти LL(1)-грамматики. Например, C# имеет грамматику которую можно на 95% переписать в LL(1). Но там есть сложности вроде эвристик связанных с оператором приведения типов (конфликтующим со скобками и вызовом функций), оператор ?: и ? в налабл-типах и некоторое количество дурной фигни. PEG позволяет разрулить эти неоднозначности с помощью предикатов (благо они ничем не ограничены), а вот у автоматных парсеров эти эвристики вызывают ужасные проблемы.


Читаю я это и задумался. Написал бы кто-нибудь туториал по тому, с чего начинать описывать грамматику уже существующего языка на PEG'е. Потому что вон тот же C#. Огромный синаксис. С чего начать? Как разруливать неизбежные конфликты? Ну и т.п.


dmitriid.comGitHubLinkedIn
Re[27]: почему вы используете регулярные выражения?
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.01.11 01:04
Оценка: 20 (1)
Здравствуйте, Mamut, Вы писали:

M>Читаю я это и задумался. Написал бы кто-нибудь туториал по тому, с чего начинать описывать грамматику уже существующего языка на PEG'е. Потому что вон тот же C#. Огромный синаксис. С чего начать?


С базовых правил (тех что в спецификации называется в разделе "Lexical structure"). Далее по спецификации от пространств имен и до "лисьтев" (выражений и т.п.).

PEG имеет очень много общего с написанием парсеров вручную методом рекурсивного спуска. Так что если этот метод знаком, то освоить написание PEG-грамматик труда не составит.

M>Как разруливать неизбежные конфликты? Ну и т.п.


Отпарсить реальные (корректные) исходники и получить неверный разбор. Далее разобраться в чем проблема и подумать как устранить ее с помощью предикатов. Предикаты вещь настолько мощная, что позволяют разрулить любой конфликт если только он не приводит к появлению неоднозначной грамматики или контекстно-зависимой грамматике (да и некоторые КЗ-вещи тоже позволяет разрулить).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[28]: почему вы используете регулярные выражения?
От: Mamut Швеция http://dmitriid.com
Дата: 24.01.11 07:31
Оценка:
M>>Читаю я это и задумался. Написал бы кто-нибудь туториал по тому, с чего начинать описывать грамматику уже существующего языка на PEG'е. Потому что вон тот же C#. Огромный синаксис. С чего начать?

VD>С базовых правил (тех что в спецификации называется в разделе "Lexical structure"). Далее по спецификации от пространств имен и до "лисьтев" (выражений и т.п.).


Эх, не всегда есть такой раздел

VD>PEG имеет очень много общего с написанием парсеров вручную методом рекурсивного спуска. Так что если этот метод знаком, то освоить написание PEG-грамматик труда не составит.


Ага, буду ковырять.

M>>Как разруливать неизбежные конфликты? Ну и т.п.


VD>Отпарсить реальные (корректные) исходники и получить неверный разбор. Далее разобраться в чем проблема и подумать как устранить ее с помощью предикатов. Предикаты вещь настолько мощная, что позволяют разрулить любой конфликт если только он не приводит к появлению неоднозначной грамматики или контекстно-зависимой грамматике (да и некоторые КЗ-вещи тоже позволяет разрулить).


Спасибо за толчок в нужном направлении


dmitriid.comGitHubLinkedIn
Re[29]: почему вы используете регулярные выражения?
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 24.01.11 13:57
Оценка: 40 (1)
M>Эх, не всегда есть такой раздел

двигайся стандартно — сверху вниз.
берешь реальные тексты и пытаешься их распарсить — для начала только общую структуру, потом спускаешься ниже и т.д.

пример, допустим необходимо распарсить C# — большая часть структуры описывается с помощью '{', '}'. попробуем распарсить эту структуру

первое приближение грамматики
file := block-body;
block-body := (другое? block)* другое?;
block := '{' block-body '}';
другое := .+;

все хорошо, но есть конфликт, peg — жадный, поэтому терм 'другое' съест и открывающие скобки, и закрывающие, которые нужны правилу block.
разрешим конфликт — запретив терму 'другое' хавать скобки
file := block-body;
block-body := (другое? block)* другое?;
block := '{' block-body '}';
другое := (!('{' / '}') .)+;

работает, но ломается, если есть непарные скобки в комментарии или литерале?
добавляем их
line-comment := '//' (!line-break .)* line-break;
multi-line-comment :=  '/*' (!'*/' .)* '*/';
literal := ('""' (!'""' .)*  '""') / (""'"" (!""'"" .)*  ""'""); //как пример, в шарпе чуть другие правила записи литерала
line-break := ([\r][\n]) / [\r] / [\n];

модифицируем правило другое и получаем грамматику:
file := block-body;
block-body := (другое? block)* другое?;
block := '{' block-body '}';
другое := (!('{' / '}') line-comment / multi-line-comment / literal / .)+;
line-comment := '//' (!line-break .)* line-break;
multi-line-comment :=  '/*' (!'*/' .)* '*/';
literal := ('""' (!'""' .)*  '""') / (""'"" (!""'"" .)*  ""'""); //как пример, в шарпе чуть другие правила записи литерала
line-break := ([\r][\n]) / [\r] / [\n];

эта грамматика уже устойчивая ко всем видам C#-файлов (если ничего не забыл), и позволяет уточнять грамматику дальше в нужном направлении — в зависимости от задачи.
схема изменения грамматика стандартная: формулируется новое правило, вставляется "вызов" в нужное место, есть есть конфликт — остальным правилам явно запрещается хавать символы, которые нужны новому правилу.
также грамматика периодически рефакторится, чтобы быть менее громоздкой и более быстрой для исполнения
Re[30]: почему вы используете регулярные выражения?
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 24.01.11 14:06
Оценка:
данный пример писал в браузере и не тестил, поэтому там есть ряд неточностей.
Re[31]: почему вы используете регулярные выражения?
От: Mamut Швеция http://dmitriid.com
Дата: 25.01.11 09:07
Оценка: :)
DG>данный пример писал в браузере и не тестил, поэтому там есть ряд неточностей.

Важна сама идея


dmitriid.comGitHubLinkedIn
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.