Как сделать python-подобный отступ с помощью flex/bison

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

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

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

Ответы

Ответ 1

Я думаю, что никакой синтаксический синтаксический анализатор, подобный python, не имеет ТОЛЬКО lex/yacc, потому что lex/yacc может работать только с Context Free Grammar, но синтаксис, подобный python, является контекстно-зависимым.

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

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

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

Ответ 2

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

Ответ 3

Matt Might написал статью об автономных синтаксических анализаторах с возможностью обработки значительных пробелов с использованием "unput":

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

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