Здравствуйте, VladD2, Вы писали:
VD>По поводу модификаторов (public, new, static, ...).
VD>Не стоит описывать свой список для каждого типа деклараций. Людям свойственно ошибаться. Они часто лепят идентификаторы не по месту. И при этом им нужны внятные сообщения об ошибках. Если же забить их в грамматику, то сообщение будет типа "не ожидаемый идентификатор".
VD>Лучше сделать единый список идентификаторов и проверять их в семантическом действии (обработчике). Или после правильного списка модификаторов давать полный список и при его сопоставлении выдавать ошибку (это будет чуть медленнее).
Так оно и будет. Когда грамматику допишу до конца, буду ее слегка сжимать, так как она сейчас содержит достаточно много семантических правил, проверку которых можно вынести в обработчики.
Здравствуйте, hardcase, Вы писали:
H>Так оно и будет. Когда грамматику допишу до конца, буду ее слегка сжимать, так как она сейчас содержит достаточно много семантических правил, проверку которых можно вынести в обработчики.
За месяц успеешь это дело добить? Хорошо бы конечно это дело в релиз впихнуть.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, hardcase, Вы писали:
H>>Так оно и будет. Когда грамматику допишу до конца, буду ее слегка сжимать, так как она сейчас содержит достаточно много семантических правил, проверку которых можно вынести в обработчики.
VD>За месяц успеешь это дело добить? Хорошо бы конечно это дело в релиз впихнуть.
Я постараюсь, но сам понимаешь, у меня гарантии как в китайской бане.
Здравствуйте, hardcase, Вы писали:
H>И их тоже (да, у меня сегодня свободный денек подвернулся). Пожалуй с грамматикой закончил, можно приступать к AST.
Здравствуйте, hardcase, Вы писали:
H>И их тоже (да, у меня сегодня свободный денек подвернулся). Пожалуй с грамматикой закончил, можно приступать к AST.
Вот это не верно.
Эти правила должны заканчиваться на !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>
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, hardcase, Вы писали:
H>>И их тоже (да, у меня сегодня свободный денек подвернулся). Пожалуй с грамматикой закончил, можно приступать к AST. WH>
Здравствуйте, <Аноним>, Вы писали:
А>Случайно попал. А потом было лень удалять.
Нужно удалить. Нечего автогенереннам файлам делать в репозитории.
Тем более если это всеголишь отладочная печать.
А>Ок. Пересмотрю грамматику, если честно, то я так и не понял логики работы !xxx — захватывает ли он символы или нет.
Нет.
! и & это синтаксические предикаты которые заглядывают на неопределенное колличество символов вперед никогда не съдая символы.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, hardcase, Вы писали:
H>>И их тоже (да, у меня сегодня свободный денек подвернулся). Пожалуй с грамматикой закончил, можно приступать к AST. WH>
Из build 9212
Компильнул пример с калькулятором.
Почему-то у парсера только один раз срабатывает _calc.TryParse(text);
При последующих вызовах парсится предыдущая строка, которая была при первом вызове. Где-то кешируется, а дальше хоть пустую строку передавай, парсится то что было при первом вызове. Это так и задумано или у меня что-то сломалось?
Здравствуйте, Silver_s, Вы писали:
S_>Здравствуйте, hardcase, Вы писали:
S_>Из build 9212 S_>Компильнул пример с калькулятором. S_>Почему-то у парсера только один раз срабатывает _calc.TryParse(text); S_>При последующих вызовах парсится предыдущая строка, которая была при первом вызове. Где-то кешируется, а дальше хоть пустую строку передавай, парсится то что было при первом вызове. Это так и задумано или у меня что-то сломалось?
Хмм сейчас (в транке) пример с калькулятором не собирается, поправим в ближайшее время.
TryParse в конечном счете разворачивается вот в это:
Здравствуйте, hardcase, Вы писали:
H>Мне кажется там что-то с мемоизацией, так как код этот совершенно безобиден H>А пока просто создавайте каждый раз новый парсер для разбора текста.
Много с чем. И количество состояния в парсере будет только рости.
Может потом сделаем код который будет состояние парсера востанавливать но пока его нужно просто пересоздавать.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, Silver_s, Вы писали:
S_>Из build 9212 S_>Компильнул пример с калькулятором. S_>Почему-то у парсера только один раз срабатывает _calc.TryParse(text); S_>При последующих вызовах парсится предыдущая строка, которая была при первом вызове. Где-то кешируется, а дальше хоть пустую строку передавай, парсится то что было при первом вызове. Это так и задумано или у меня что-то сломалось?
Баг. Исправим в ближайшее время.
Сейчас над PegGrammar ведется постоянная работа (спасибо WolfHound-у). Сделано много оптимизаций. В том числе сделана очень оригинальная оптимизация — мемоизация последних вызовов правил.
В отличии от алгоритма Packrat — это не тотальная мемоизация для всех позиций, а мемоизация только полседнего вызова правила. Наш вариант не требует наличия хэш-таблицы. К сожалению, в отличии от оригинального Packrat-а эта оптимизация не обеспечивает линейного времени парсинга для любой грамматики, но зато она обеспечивает хорошее время доступа в большинстве случаев. Избавляет от необходимости левой факторизации грамматик, и при том не не влияет так драматично на общую скорость парсинга... в отличии от Packrat котрый показывает неприемлемую скорость за счет постоянного использования мемоизации.
По сути Packrat требует линейного роста объема памяти за счет постоянной и тотальной мемоизации результатов.
Наш подход (идея WolfHound) требует константного места для мемоизации (по одной int-переменной на каждое правило имеющие обработчик). Это позволяет иметь близкой к линейной скорости, не требовать левой факторизации грамматики, и при этом оставаться очень быстрым.
Так вот, к сожалению мы не учли того, что парсер может быть запущен несколько раз подряд. При повторном запуске просто не обнуляются переменные в которых хранится мемоизированный результат, и парсер возврщает старые значения.
Мы исправим эту ошибку в ближайшее время. Все что нужно сделать — это перенести инициализацию в метды начинающие парсинг.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.