Здравствуйте, lurrker, Вы писали:
L>Хочу добавить в свой PEG-парсер специальный синтаксис для описания expression-ов, чтобы упростить их описание. Синтаксис должен задавать собственно операторы, их приоритет, арность (унарный префикс/постфикс, бинарный, тернарный), ассоциативность (левая/правая)
L>Для первых двух пунктов мне видится примерно такой синтаксис:
L>L>Expr = <[^] [*/%] [+-]> Atom;
L>Atom = Int / "(" Expr ")";
L>Int = [0-9]+;
L>
L>Expr — это список операторов в порядке уменьшения приоритета, <> чтобы отличать от обычных конструкций. Atom, соответственно — описание элементарного элемента выражения.
L>Как добавить сюда арность и ассоциативность, чтобы было компактно и не слишком по тарабарски?
Дык, никак!
Не лучше ли описать операторы отдельно?
Я вот сейчас думаю над синтаксисом для синтаксических макросов для Nemerle 2. Пока что мысли следующие:
1. Описывать операторы отдельно с использованием специального синтаксиса.
2. Поддерживать только простые операторы (бинарные (инфиксные) и унарные (префиксные и постфиксные)).
3. Декларативно задавать приоритеты (правый и левый), а так же ассоциатичность.
4. Реализовать их не на базе PEG-а, а на безе Pratt (Top-Down operator precedence parsing), так как он больше подходит для разбора операторов и динамического расширения списка операторов. Если интересно, то курить
это и/или
это.
Примерный синтаксис описан
здесь, в разделе "Приоритеты синтаксических макросов".
Собственно, так как синтаксис пока что только формируется, то с удовольствием послушал бы замечания и предложения.