Парсинг (основанных на добавлении отступа) языков “вне игры”

Язык вне игры является тем где

... объем объявлений (блок) на том языке выражается их добавлением отступа.

Примерами таких языков является Python, Шиканье, Nemerle, YAML и еще несколько.

Таким образом, мой вопрос - это: как я на самом деле анализирую их? Как я решаю, вкладки по сравнению с проблемой пробелов (две вкладки или 8 эквивалентных пробелов или не)? Парсеры-генераторы какой-либо справки здесь, или я имею к лексическому анализатору/синтаксическому анализатору ручного кода сам?

9
задан Anton Gogolev 1 February 2010 в 16:52
поделиться

4 ответа

Как решить проблему вкладок против пробелов (два вкладка или 8 пробелов, эквивалентные или нет)?

Это зависит от того, как настройки редактора, если две вкладки будут равны восемь пробелов.

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

«Пробел значительный в Python Исходный код. "

нет, не в целом. Только Уровень вдавливания ваших заявлений значительно (то есть пробел в очень левая от ваших заявлений). Везде еще, пробел не значительный и может быть использован в качестве вас Как правило, как на любом другом языке. Вы также можете вставить пустые строки, которые не содержат ничего (или только произвольно WhiteSpace) где угодно.

Также точное количество отступа Не имеет значения вообще, а только Относительный отступ вложенных блоков (относительно друг друга). [...]

4
ответ дан 4 December 2019 в 11:04
поделиться

Самый простой способ решить проблему табуляции и пробелов - запретить комбинации пробелов и табуляций (например, это то, что сделано в F #). Любой современный редактор позволяет преобразовывать вкладки в некоторое количество пробелов.

Что касается того, нужно ли вам отказываться от генераторов парсеров, вероятно, нет, но вам придется где-то там взламывать служебную идентификацию. Это может потребовать от вас немного творческого подхода. Судя по исходному тексту F #, похоже, что они используют этап пост-лексирования для создания дополнительных токенов, представляющих элементы автономного языка.

4
ответ дан 4 December 2019 в 11:04
поделиться

У вас есть несколько вариантов w.r.t. табуляции и пробелы: либо запретить смешивание табуляции и пробелов, либо принять фиксированное соотношение табуляции к пробелам, либо разрешить программисту выбирать для каждого проекта или исходного файла (своего рода директива стиля "#pragma tab (4)" для разрешить табуляции и / или изменить количество пробелов, которые они представляют).

Генератор парсеров, такой как ANTLR 3, легко справится с этим; Я сам играл с примером, компилируя его для своей цели C #. Ссылка в Ответ DirkGently объясняет алгоритм Python, который транслируется непосредственно в код. Мой подход заключался в том, чтобы просто определить отдельные токены для пробелов и новой строки и переопределить функцию «emit token», используемую лексером для вставки дополнительных токенов отступа / удаления на лету. Оказалось, что это проще реализовать, чем другие подходы, которые я видел, переопределяя функцию «получить последний токен», но любой из них работает довольно хорошо.

1
ответ дан 4 December 2019 в 11:04
поделиться

Python имеет лексер , который генерирует токены Indent и Dedent , которые эквивалентны фигурным скобкам ("{", "}"). Существует даже пример переполнения стека с простой реализацией такого лексера.

Для табуляции и пробелов в Python существует только соглашение о кодировании : используйте 4 пробела на каждый уровень отступа. Тем не менее, табуляции - это допустимый синтаксис.

8
ответ дан 4 December 2019 в 11:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: