У вас есть несколько вариантов w.r.t. табуляция и пробелы: либо запрещать смешивание табуляций и пробелов, принимать фиксированное соотношение табуляций и пробелов, либо разрешить программисту выбирать для каждого проекта или для исходного файла (своего рода директива стиля #pragma tab (4) разрешить вкладки и / или изменить количество пробелов, которые они представляют).
Генератор парсеров, такой как ANTLR 3, может легко справиться с этим; Я сам играл с примером, компилируя его в цель C #. Ссылка в ответе DirkGently объясняет алгоритм Python, который напрямую переводится в код. Мой подход состоял в том, чтобы просто определить отдельные токены для пробелов и новых строк и переопределить функцию «выбросить токен», используемую лексером для вставки дополнительных маркеров отступа / отступа на лету. Это оказалось проще для реализации, чем другие подходы, которые я видел, которые переопределяют функцию «получить последний токен», но любой из них работает довольно хорошо.