Как сделать 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/
(Пример на полпути вниз по странице.)