[фичреквест][PEG] задание количеств повторов
От: Ka3a4oK  
Дата: 28.04.13 19:56
Оценка:
Хотелось бы иметь возможность создавать правила с более гибким заданием повторов, а не только +, *.

Например:
digit_p{4} — ровно четыре цифры
digit_p{0-4} — не более четырех цифр
digit_p{1-4} — какое-либо количество цифр, но не более четырех
Re: [фичреквест][PEG] задание количеств повторов
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.04.13 13:07
Оценка: :)
Здравствуйте, Ka3a4oK, Вы писали:

KK>Хотелось бы иметь возможность создавать правила с более гибким заданием повторов, а не только +, *.


KK>Например:

KK>digit_p{4} — ровно четыре цифры
KK>digit_p{0-4} — не более четырех цифр
KK>digit_p{1-4} — какое-либо количество цифр, но не более четырех

Народ! Нам тратить время на PEG неразумно. Скоро будет парсер от Н2. Вот там может и добавим такую фичу.

В самом PEG-е все необходимое есть. Нужно только синтаксис прикрутить. Если кому-то хочется, то можете прикрутить сами.

На мой же взгляд толку от такой фичи не много, так как проще указать нужное количество раз правило digit_p. В грамматике таких мест не много. Так что экономия будет не велика.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: [фичреквест][PEG] задание количеств повторов
От: Ka3a4oK  
Дата: 06.05.13 17:32
Оценка:
VD>Народ! Нам тратить время на PEG неразумно. Скоро будет парсер от Н2. Вот там может и добавим такую фичу.
Этот парсер можно будет использовать как библиотеку для моих текущих проектов на текущей(n1) версии немерла? Сильно ли надо будет перепиливать грамматики?
Re[3]: [фичреквест][PEG] задание количеств повторов
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.05.13 20:26
Оценка: 3 (1)
Здравствуйте, Ka3a4oK, Вы писали:

KK>Этот парсер можно будет использовать как библиотеку для моих текущих проектов на текущей(n1) версии немерла?


Да.

KK>Сильно ли надо будет перепиливать грамматики?


Грамматика будет довольно сильно отличаться. Но перевести на нее ПЕГ не так чтобы сложно. У меня творческий перевод грамматики C# занял где-то пару дней.

Вот что точно будет сильно отличаться, так это метод обработки грамматики. Н2 автоматически строит АСТ и предоставляет ДСЛ по его обработке.

Плюс будет восстановление после обнаружения ошибок. Поддержка подсветки и фолдинга в IDE. (возможно) Инкрементальный парсинг (для редактирования в IDE). Модульность. Динамическая раширяемость.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: [фичреквест][PEG] задание количеств повторов
От: Ka3a4oK  
Дата: 07.05.13 17:05
Оценка: +1
Здравствуйте, VladD2, Вы писали:

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


KK>>Этот парсер можно будет использовать как библиотеку для моих текущих проектов на текущей(n1) версии немерла?


VD>Да.


KK>>Сильно ли надо будет перепиливать грамматики?


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


VD>Вот что точно будет сильно отличаться, так это метод обработки грамматики. Н2 автоматически строит АСТ и предоставляет ДСЛ по его обработке.


VD>Плюс будет восстановление после обнаружения ошибок. Поддержка подсветки и фолдинга в IDE. (возможно) Инкрементальный парсинг (для редактирования в IDE). Модульность. Динамическая раширяемость.


Уже хочу.
Re: [фичреквест][PEG] задание количеств повторов
От: Аноним  
Дата: 10.05.13 16:19
Оценка:
Здравствуйте, Ka3a4oK, Вы писали:

KK>Хотелось бы иметь возможность создавать правила с более гибким заданием повторов, а не только +, *.


KK>Например:

KK>digit_p{4} — ровно четыре цифры
KK>digit_p{0-4} — не более четырех цифр
KK>digit_p{1-4} — какое-либо количество цифр, но не более четырех

Такая возможность вроде бы есть:


 digit   = ['0'..'9'];
 digits1 = digit{4,4}; //ровно четыре цифры
 digits2 = digit{0,4}; //не более четырех цифр
 digits2 = digit{1,4}; //какое-либо количество цифр, но не более четырех



Или речь о чем-то другом?
Re[2]: [фичреквест][PEG] задание количеств повторов
От: Ka3a4oK  
Дата: 10.05.13 17:01
Оценка:
А>Такая возможность вроде бы есть:

А>
А> digit   = ['0'..'9'];
А> digits1 = digit{4,4}; //ровно четыре цифры
А> digits2 = digit{0,4}; //не более четырех цифр
А> digits2 = digit{1,4}; //какое-либо количество цифр, но не более четырех
А>



А>Или речь о чем-то другом?


То что нужно! Почему нигде нет описания этой возможности?! Даже в статье http://www.rsdn.ru/article/nemerle/PegGrammar.xml#EEGAC
Автор(ы): Чистяков Владислав Юрьевич
Дата: 07.06.2011
Макрос PegGrammar – это макрос Nemerle, позволяющий добавлять в приложения парсеры, описываемые в нотации PEG.
.
Re[3]: [фичреквест][PEG] задание количеств повторов
От: Аноним  
Дата: 11.05.13 09:13
Оценка:
Здравствуйте, Ka3a4oK, Вы писали:

KK>То что нужно! Почему нигде нет описания этой возможности?! Даже в статье http://www.rsdn.ru/article/nemerle/PegGrammar.xml#EEGAC
Автор(ы): Чистяков Владислав Юрьевич
Дата: 07.06.2011
Макрос PegGrammar – это макрос Nemerle, позволяющий добавлять в приложения парсеры, описываемые в нотации PEG.
.


Есть немножко тут.
Кстати, судя по тому, что там написано, второе правило можно написать вот так вот:
digits1 = digit{4}; //ровно четыре цифры
Re[4]: [фичреквест][PEG] задание количеств повторов
От: Ka3a4oK  
Дата: 12.05.13 14:43
Оценка:
VD>Вот что точно будет сильно отличаться, так это метод обработки грамматики. Н2 автоматически строит АСТ и предоставляет ДСЛ по его обработке.

Я так понимаю теперь не будет обработчиков. А результатом успешного парсинга будет ссылка на АСТ. API будет заключаться в возможности обойти дерево?
Re[5]: [фичреквест][PEG] задание количеств повторов
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.05.13 15:42
Оценка: 17 (1)
Здравствуйте, Ka3a4oK, Вы писали:

KK>Я так понимаю теперь не будет обработчиков.


Да. Парсинг будет производиться в промежуточный двоичный формат.

KK>А результатом успешного парсинга будет ссылка на АСТ.


Не совсем. АСТ (в виде набора объектов) будет не обязательным. Результатом будет специальный тип данных хранящий информацию о результате парсинга. Там будет много чего: информация об ошибках, двоичный АСТ и т.п.

У этого типа данных можно будет вызвать обходчик двоичного АСТ-а и получить те или иные данные. На сегодня это: информация о подсветке, информация о фолдинге, список ошибок и материализованный (объектный) АСТ.

KK>API будет заключаться в возможности обойти дерево?


На первом этапе будет что-то вроде методов объявляемых прямо на правилах грамматики. Методов может быть любое количество и они могут иметь любое количество параметров разных типов. И конечно же эти методы будут иметь возможность обратиться к подправилам правила на котом они объявлены для получения значений (строк, размеров). Их результаты можно будет кэшировать применением атрибута [Cached]. Сами методы должны быть детерминированными, но могут зависеть от внешних объектов (например, дерева глобальных символов).

Вот пример метода Value вычисляющего значение строки для строкового литерала:
token HexDigit           = ['0'..'9', 'a'..'f', 'A'..'F'];
token ReservedStringChar = "\"" | "\\";
token ReservedCharChar   = "\'" | "\\";

[SpanClass(String), ExplicitSpaces]
syntax StringLiteral = "\""  StringPart* "\""
{
  Value() : string = FoldThrough(StringParts, StringBuilder(), _.Value(_)).ToString();
}

[ExplicitSpaces]
syntax StringPart
{
  Value(sb : StringBuilder) : StringBuilder;

  | UnicodeEscapeSequence = "\\u" HexDigit HexDigit HexDigit HexDigit
    {
      override Value = sb.Append(HexToChar(this, HexDigit1.StartPos, HexDigit4.EndPos));
    }
  | EscapeSequence        = "\\"  Char
    {
      override Value = sb.Append(EscapeSequence(FirstChar(Char)));
    }
  | Simple                = Chars=(!ReservedStringChar !NewLine Any)+
    {
      override Value = sb.Append(this.GetText());
    }
}


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

На первых порах такие методы будут просто превращаться в методы материализованного АСТ. В дальнейшем планируется их виртуализировать (будут работать по двоичному АСТ-у, без создания объектов).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.