Python/Conceitos básicos/Análise léxica

Origem: Wikilivros, livros abertos por um mundo aberto.

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