Python/Conceitos básicos/Análise léxica
No capítulo 2 do Manual de Referência da Linguagem Python diz que a análise léxica é uma análise do interpretador em sí, os programas são lidos por um parser, que divide o código em tokens.
Todo programa é dividido em linhas lógicas que são separadas pelo token NEWLINE ou NOVA LINHA, as linhas físicas são trechos de código divididos pelo caracter ENTER. Linhas lógicas não podem ultrapassar linhas físicas com exceção de junção de linhas, por exemplo:
if resultado > 2 \ and 1 <= 5 \ and 2 < 5: print ('Resultado: %f') % (d)
ou
meses_do_ano = ['janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro']
Para a delimitação de blocos de códigos os delimitadores são colocados em uma pilha e diferenciados por INDENT e DEDENT. Iniciando a pilha com valor 0 (zero) e colocando valores maiores que os anteriores na pilha. Para cada começo de linha, o nível de indentação é comparado com o valor do topo da pilha, se o número da linha for igual ao topo da pilha, a pilha não é alterada, se o valor for maior a pilha recebe o nível de indentação da linha e o nome INDENT (empilhamento) se o nível de indentação for menor, então é desempilhado até chegar a um nível de indentação recebendo o nome DEDENT (desempilhamento) e se não encontrar nenhum valor é gerado um erro de indentação.
Abaixo um exemplo de permutação, retirado do capítulo 2.1 sobre Estrutura de linhas na Análise léxica do Manual de Referência da linguagem (Language Reference Manual):
def perm(l): NOVA LINHA INDENT if len(l) <= 1: NOVA LINHA INDENT return[1] NOVA LINHA DEDENT r = [ ] NOVA LINHA for i in range(len(l)): NOVA LINHA INDENT s = l[:i] + l[i+1:] NOVA LINHA p = perm(s) NOVA LINHA DEDENT for x in p: NOVA LINHA INDENT r.append(l[i:i+1]+x) NOVA LINHA DEDENT return r