Если вы используете что-то вроде lex, вы можете сделать это следующим образом:
^[ \t]+ { int new_indent = count_indent(yytext);
if (new_indent > current_indent) {
current_indent = new_indent;
return INDENT;
} else if (new_indent < current_indent) {
current_indent = new_indent;
return DEDENT;
}
/* Else do nothing, and this way
you can essentially treat INDENT and DEDENT
as opening and closing braces. */
}
Вам может потребоваться дополнительная логика, например, чтобы игнорировать пустые строки и автоматически добавлять DEDENT в конец файла, если это необходимо.
Предположительно count_indent будет учитывать преобразование табуляции в пробелы в соответствии со значением табуляции.
Я не знаю о генераторах лексеров / парсеров для Python, но то, что я написал, должно работать с lex / flex, и вы можете подключить его к yacc / bison для создания парсера. Вы можете использовать C или C ++ с ними.