Re[8]: [PEG] Добавил в сниппеты еще один пример.
От: hardcase Пират http://nemerle.org
Дата: 09.08.10 07:03
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>По поводу модификаторов (public, new, static, ...).


VD>Не стоит описывать свой список для каждого типа деклараций. Людям свойственно ошибаться. Они часто лепят идентификаторы не по месту. И при этом им нужны внятные сообщения об ошибках. Если же забить их в грамматику, то сообщение будет типа "не ожидаемый идентификатор".


VD>Лучше сделать единый список идентификаторов и проверять их в семантическом действии (обработчике). Или после правильного списка модификаторов давать полный список и при его сопоставлении выдавать ошибку (это будет чуть медленнее).


Так оно и будет. Когда грамматику допишу до конца, буду ее слегка сжимать, так как она сейчас содержит достаточно много семантических правил, проверку которых можно вынести в обработчики.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[9]: [PEG] Добавил в сниппеты еще один пример.
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.08.10 17:20
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Так оно и будет. Когда грамматику допишу до конца, буду ее слегка сжимать, так как она сейчас содержит достаточно много семантических правил, проверку которых можно вынести в обработчики.


За месяц успеешь это дело добить? Хорошо бы конечно это дело в релиз впихнуть.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: [PEG] Добавил в сниппеты еще один пример.
От: hardcase Пират http://nemerle.org
Дата: 09.08.10 20:00
Оценка:
Здравствуйте, VladD2, Вы писали:

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


H>>Так оно и будет. Когда грамматику допишу до конца, буду ее слегка сжимать, так как она сейчас содержит достаточно много семантических правил, проверку которых можно вынести в обработчики.


VD>За месяц успеешь это дело добить? Хорошо бы конечно это дело в релиз впихнуть.


Я постараюсь, но сам понимаешь, у меня гарантии как в китайской бане.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[10]: [PEG] Добавил в сниппеты еще один пример.
От: hardcase Пират http://nemerle.org
Дата: 13.08.10 07:53
Оценка:
Здравствуйте, VladD2, Вы писали:


VD>За месяц успеешь это дело добить? Хорошо бы конечно это дело в релиз впихнуть.


Добавил правила для LINQ. Остались unsafe-расширения грамматики.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[11]: [PEG] Добавил в сниппеты еще один пример.
От: hardcase Пират http://nemerle.org
Дата: 13.08.10 12:33
Оценка:
Здравствуйте, hardcase, Вы писали:

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



VD>>За месяц успеешь это дело добить? Хорошо бы конечно это дело в релиз впихнуть.


H>Добавил правила для LINQ. Остались unsafe-расширения грамматики.


И их тоже (да, у меня сегодня свободный денек подвернулся). Пожалуй с грамматикой закончил, можно приступать к AST.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[12]: [PEG] Добавил в сниппеты еще один пример.
От: WolfHound  
Дата: 13.08.10 19:40
Оценка:
Здравствуйте, hardcase, Вы писали:

H>И их тоже (да, у меня сегодня свободный денек подвернулся). Пожалуй с грамматикой закончил, можно приступать к AST.

А зачем вот этот файл в репозитории?
http://code.google.com/p/nemerle/source/browse/nemerle/trunk/snippets/peg-parser/CSharp/CSharpParser/grammar.txt
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[12]: [PEG] Добавил в сниппеты еще один пример.
От: WolfHound  
Дата: 13.08.10 20:47
Оценка:
Здравствуйте, hardcase, Вы писали:

H>И их тоже (да, у меня сегодня свободный денек подвернулся). Пожалуй с грамматикой закончил, можно приступать к AST.

      identifierStartCharacter  = letterCharacter / "_";
      identifierPartCharacters  = letterCharacter / decimalDigitCharacter / connectingCharacter / combiningCharacter / formattingCharacter;

А почему "_" нет в identifierPartCharacters?
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[12]: [PEG] Добавил в сниппеты еще один пример.
От: WolfHound  
Дата: 13.08.10 20:57
Оценка:
Здравствуйте, hardcase, Вы писали:

H>И их тоже (да, у меня сегодня свободный денек подвернулся). Пожалуй с грамматикой закончил, можно приступать к AST.

      voidType = "void"s;
      booleanType = "bool"s;
      stringType = "string"s;
      dynamicType = "dynamic"s;
      objectType = "object"s;

      integralType = ("sbyte" / "byte" / "short" / "ushort" / "int" / "uint" / "long" / "ulong" / "char")s;
      floatingPointType = ("float" / "double")s;
      decimalType = "decimal"s;

Вот это не верно.
Эти правила должны заканчиваться на !identifierPartCharacters s
С keyword и много чем другим та же фигня.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[13]: [PEG] Добавил в сниппеты еще один пример.
От: Аноним  
Дата: 13.08.10 21:43
Оценка:
Здравствуйте, WolfHound, Вы писали:

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


H>>И их тоже (да, у меня сегодня свободный денек подвернулся). Пожалуй с грамматикой закончил, можно приступать к AST.

WH>
WH>      identifierStartCharacter  = letterCharacter / "_";
WH>      identifierPartCharacters  = letterCharacter / decimalDigitCharacter / connectingCharacter / combiningCharacter / formattingCharacter;
WH>

WH>А почему "_" нет в identifierPartCharacters?

Потому что так было в спецификации C#. Эти правила оттуда. Возможно "_" относится ко множеству connectingCharacter.
Re[13]: [PEG] Добавил в сниппеты еще один пример.
От: Аноним  
Дата: 13.08.10 21:49
Оценка:
Здравствуйте, WolfHound, Вы писали:

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


H>>И их тоже (да, у меня сегодня свободный денек подвернулся). Пожалуй с грамматикой закончил, можно приступать к AST.

WH>А зачем вот этот файл в репозитории?
WH>http://code.google.com/p/nemerle/source/browse/nemerle/trunk/snippets/peg-parser/CSharp/CSharpParser/grammar.txt

Случайно попал. А потом было лень удалять.



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

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


H>>И их тоже (да, у меня сегодня свободный денек подвернулся). Пожалуй с грамматикой закончил, можно приступать к AST.

WH>
WH>      voidType = "void"s;
WH>      booleanType = "bool"s;
WH>      stringType = "string"s;
WH>      dynamicType = "dynamic"s;
WH>      objectType = "object"s;

WH>      integralType = ("sbyte" / "byte" / "short" / "ushort" / "int" / "uint" / "long" / "ulong" / "char")s;
WH>      floatingPointType = ("float" / "double")s;
WH>      decimalType = "decimal"s;
WH>

WH>Вот это не верно.
WH>Эти правила должны заканчиваться на !identifierPartCharacters s
WH>С keyword и много чем другим та же фигня.

Ок. Пересмотрю грамматику, если честно, то я так и не понял логики работы !xxx — захватывает ли он символы или нет.
Re[14]: [PEG] Добавил в сниппеты еще один пример.
От: WolfHound  
Дата: 13.08.10 22:34
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Случайно попал. А потом было лень удалять.

Нужно удалить. Нечего автогенереннам файлам делать в репозитории.
Тем более если это всеголишь отладочная печать.

А>Ок. Пересмотрю грамматику, если честно, то я так и не понял логики работы !xxx — захватывает ли он символы или нет.

Нет.
! и & это синтаксические предикаты которые заглядывают на неопределенное колличество символов вперед никогда не съдая символы.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[13]: [PEG] Добавил в сниппеты еще один пример.
От: hardcase Пират http://nemerle.org
Дата: 14.08.10 09:22
Оценка:
Здравствуйте, WolfHound, Вы писали:

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


H>>И их тоже (да, у меня сегодня свободный денек подвернулся). Пожалуй с грамматикой закончил, можно приступать к AST.

WH>
WH>      voidType = "void"s;
WH>      booleanType = "bool"s;
WH>      stringType = "string"s;
WH>      dynamicType = "dynamic"s;
WH>      objectType = "object"s;

WH>      integralType = ("sbyte" / "byte" / "short" / "ushort" / "int" / "uint" / "long" / "ulong" / "char")s;
WH>      floatingPointType = ("float" / "double")s;
WH>      decimalType = "decimal"s;
WH>

WH>Вот это не верно.
WH>Эти правила должны заканчиваться на !identifierPartCharacters s
WH>С keyword и много чем другим та же фигня.

Поправил грамматику. Теперь после всех ключевых слов стоит S:
      s = space*;                           /* optional spacer          */
      S = !identifierPartCharacters space*; /* identifier break spacer  */
/* иЗвиНите зА неРовнЫй поЧерК */
Re[11]: [PEG] Добавил в сниппеты еще один пример.
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.08.10 17:58
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Добавил правила для LINQ. Остались unsafe-расширения грамматики.


unsafe нужно вообще опустить. Он в немерел не поддерживается, так что смысла их реализовывать нет. Ну, разве что ли для чистотя эксперемента.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[13]: [PEG] Добавил в сниппеты еще один пример.
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.08.10 00:21
Оценка:
Здравствуйте, WolfHound, Вы писали:

H>>И их тоже (да, у меня сегодня свободный денек подвернулся). Пожалуй с грамматикой закончил, можно приступать к AST.

WH>А зачем вот этот файл в репозитории?
WH>http://code.google.com/p/nemerle/source/browse/nemerle/trunk/snippets/peg-parser/CSharp/CSharpParser/grammar.txt

Я бы поставил вопрос шире — зачем он вообще нужен . Надо бы его генерацию отключить.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[14]: [PEG] Добавил в сниппеты еще один пример.
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.08.10 00:24
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Потому что так было в спецификации C#. Эти правила оттуда. Возможно "_" относится ко множеству connectingCharacter.


Дык добавь в тесты тест где будет идентификатор типа Ша_мы_немного_пошалим.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: [PEG] Добавил в сниппеты еще один пример.
От: Silver_s Ниоткуда  
Дата: 27.09.10 13:22
Оценка:
Здравствуйте, hardcase, Вы писали:

Из build 9212
Компильнул пример с калькулятором.
Почему-то у парсера только один раз срабатывает _calc.TryParse(text);
При последующих вызовах парсится предыдущая строка, которая была при первом вызове. Где-то кешируется, а дальше хоть пустую строку передавай, парсится то что было при первом вызове. Это так и задумано или у меня что-то сломалось?
Re[2]: [PEG] Добавил в сниппеты еще один пример.
От: hardcase Пират http://nemerle.org
Дата: 27.09.10 13:30
Оценка:
Здравствуйте, Silver_s, Вы писали:

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


S_>Из build 9212

S_>Компильнул пример с калькулятором.
S_>Почему-то у парсера только один раз срабатывает _calc.TryParse(text);
S_>При последующих вызовах парсится предыдущая строка, которая была при первом вызове. Где-то кешируется, а дальше хоть пустую строку передавай, парсится то что было при первом вызове. Это так и задумано или у меня что-то сломалось?

Хмм сейчас (в транке) пример с калькулятором не собирается, поправим в ближайшее время.

TryParse в конечном счете разворачивается вот в это:
          public TryParse([Nemerle.Assertions.NotNull] source : Nemerle.Peg.SourceSnapshot) : int * $tyParam
          {
            _parsingSource = source;

            mutable result;
            def pos = $(compiler.DecorateRuleName(parsedGrammar.StartRuleName.Id) : dyn)(0, ref result, _parsingSource.Text);

            (pos, result)
          }

Мне кажется там что-то с мемоизацией, так как код этот совершенно безобиден
А пока просто создавайте каждый раз новый парсер для разбора текста.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[3]: [PEG] Добавил в сниппеты еще один пример.
От: WolfHound  
Дата: 27.09.10 14:54
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Мне кажется там что-то с мемоизацией, так как код этот совершенно безобиден

H>А пока просто создавайте каждый раз новый парсер для разбора текста.
Много с чем. И количество состояния в парсере будет только рости.
Может потом сделаем код который будет состояние парсера востанавливать но пока его нужно просто пересоздавать.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: [PEG] Добавил в сниппеты еще один пример.
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.09.10 17:23
Оценка:
Здравствуйте, Silver_s, Вы писали:

S_>Из build 9212

S_>Компильнул пример с калькулятором.
S_>Почему-то у парсера только один раз срабатывает _calc.TryParse(text);
S_>При последующих вызовах парсится предыдущая строка, которая была при первом вызове. Где-то кешируется, а дальше хоть пустую строку передавай, парсится то что было при первом вызове. Это так и задумано или у меня что-то сломалось?

Баг. Исправим в ближайшее время.

Сейчас над PegGrammar ведется постоянная работа (спасибо WolfHound-у). Сделано много оптимизаций. В том числе сделана очень оригинальная оптимизация — мемоизация последних вызовов правил.

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

По сути Packrat требует линейного роста объема памяти за счет постоянной и тотальной мемоизации результатов.
Наш подход (идея WolfHound) требует константного места для мемоизации (по одной int-переменной на каждое правило имеющие обработчик). Это позволяет иметь близкой к линейной скорости, не требовать левой факторизации грамматики, и при этом оставаться очень быстрым.

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

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