|
| 1 | +pegjs-c-plugin |
| 2 | +============== |
| 3 | + |
| 4 | +Плагин для библиотеки [PEGjs](http://pegjs.org/), позволяющий сгенерировать исходный код на |
| 5 | +C89 (также известном, как ANSI C). |
| 6 | + |
| 7 | +Ограничения |
| 8 | +----------- |
| 9 | +В отличие от оригинала, в Си нет автоматического управления памятью, и строгая типизация, |
| 10 | +поэтому некоторые возможности не реализованы (но, возможно, будут реализованы в будущем): |
| 11 | + |
| 12 | +* Функции, генерируемые для действий, возвращают `void`. Действия не могут поменять результат |
| 13 | + разбора, поэтому используйте их только для того, чтобы что-то сделать в процессе генерации |
| 14 | + над внешними структурами. Внешнюю структуру можно получить так: `context->options`. |
| 15 | +* Семантические предикаты (`!{...}` и `&{...}`) должны возвращать `0` вместо false и любое |
| 16 | + ненулевое значение вместо `true`. Генерируемые функции возвращают значения типа `int`. |
| 17 | +* Все параметры, передаваемые в действия/предикаты имеют тип `struct Result*`, объявленный в |
| 18 | + файле `peg.h`. Так как структуры данного типа выделяются в динамической области памяти, а |
| 19 | + парсер в любой момент может начать backtracking, при котором выделенная под них память |
| 20 | + освобождается, то вы не должны сохранять эти указатели для использования где-либо за пределами |
| 21 | + действия/семантического предиката. |
| 22 | +* Так как парсер работает не с текстом, а с массивом байт, то регистронезависимые литералы/классы |
| 23 | + символов не поддерживаются. Флаг регистрозависимости игнорируется, все литералы/классы символов |
| 24 | + считаются регистрозависимыми. |
| 25 | +* Как следствие предыдущего пункта, работа с юникодными символами не поддерживается. Если такой |
| 26 | + символ будет встречен в литерале/классе символов, то как он обработается, непонятно (не проверял). |
| 27 | + |
| 28 | +Дополнительные возможности |
| 29 | +-------------------------- |
| 30 | +Так как плагин писался под мою нужды, он поддерживает несколько возможностей, которые я оформил, |
| 31 | +как pull-request-ы в оригинальный репозитарий. Все они доступны в [моем форке][1] в ветке [trunk][2]. |
| 32 | +Еще не все реализовано, но будет (реализованное отмечено галочкой): |
| 33 | + |
| 34 | +- [x] [Диапазоны][3] |
| 35 | +- [ ] Диапазоны, [разделители][4] |
| 36 | +- [ ] Namespace-ы для кода, нужно для поддержки импорта |
| 37 | + |
| 38 | +[1]: https://github.com/Mingun/pegjs |
| 39 | +[2]: https://github.com/Mingun/pegjs/tree/trunk |
| 40 | +[3]: https://github.com/pegjs/pegjs/pull/265 |
| 41 | +[4]: https://github.com/pegjs/pegjs/pull/267 |
0 commit comments