Как сделать Python-подобный отступ с помощью flex / bison - PullRequest
17 голосов
/ 12 мая 2011

Я хочу, чтобы у моего языка было две функции, которые делают Python таким красиво отформатированным языком:

  • Один оператор на строку
  • Блоки начинаются с другого уровня отступа и продолжаются, пока не закончится

Может ли кто-нибудь дать мне подробный совет о том, как этого добиться с помощью flex/bison -подобных инструментов? Такая особенность блока заставляет пользователя писать читаемый код.

Ответы [ 3 ]

16 голосов
/ 13 мая 2011

Вы можете попытаться отследить уровень отступа в лексере и добавить псевдо-токены для отступа и отступа. Вам нужно будет сохранить стопку уже просмотренных уровней отступов и по-разному заботиться о пустых строках / строках только для комментариев. Но я боюсь, что в конце лексер станет неразрешимым беспорядком, а также у вас будет определенное состояние анализа (стек отступов) в вашем лексере.

11 голосов
/ 07 апреля 2012

Мэтт Мэйт (Matt Might) написал статью об автономных парсерах, способ обработки значительных пробелов с помощью «unput»:

http://matt.might.net/articles/standalone-lexers-with-lex/

(Пример - половина страницы вниз.)

7 голосов
/ 12 мая 2011

Я думаю, что нет никакого способа создать синтаксический синтаксический анализатор, похожий на python, с использованием только lex / yacc, поскольку lex / yacc может работать только с контекстно-свободной грамматикой, но синтаксис, похожий на python, чувствителен к контексту.

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

Я предлагаю вам сделать несколькодополнительная логика помимо lex / yacc для достижения этой цели, и это будет не так сложно.Вы можете прочитать коды здесь в модулях "грамматики".

Ключ в том, чтобы часть lex / yacc могла анализировать отдельный оператор с уровнем отступа и записывать что-то, упаковывая операторы в блоки.

...