Analisador lexico
Uma operação unária é uma função com somente uma variável de entrada.
Abaixo segue alguns exemplos de operações unárias.
Endereçamento: &x;
Incremento e decremento: ++i ou i++; −−i ou i−−;
Negação lógica: !x;
Complemento: ~x.
Funções de Precedência
Compiladores reais não precisam armazenar a tabela de precedência. Podemos estabelecer funções computacionais para isso.
São estabelecidas 2 funções, F e G, chamadas 'de precedência', que irão mapear os símbolos terminais existentes para números inteiros.
Com o uso das funções de precedência, gasta-se menos espaço para seu armazenamento do que se gastaria para armazenar toda a tabela.
Entretanto, algumas tabelas podem não ser representadas por funções de precedência.
Para se estabelecer qual a precedência entre 2 operadores a e b, compara-se o valor de f(a) com o valor de g(b).
Para isso, devemos observar que, para quaisquer símbolos a e b existentes, deveremos ter: f(a) < g(b) para a < b f(a) = g(b) para a = b f(a) > g(b) para a > b
Na prática, a função F será calculada para os símbolos que estiverem na pilha e a função G para os tokens que estão sendo lidos.
Problema: Como sempre a comparação das funções retorna um valor, as entradas inválidas, sem representação na tabela de precedência, não serão identificadas, e portanto em princípio tais erros não serão detectados. A detecção do erro será feita quando, ao se fazer uma redução, não for possível identificar um handle na pilha.
Exemplo de tabela de funções de precedência:
Observa-se, pela tabela de funções acima, que * > +, pois F(*) = 4 e g(+) = 1 e 4 > 1.
Entretanto, podemos concluir, dado que f(id) = 6 e g(id) = 5 , que id > id, o que não é verdade, porque não existe precedência entre dois identificadores (normalmente tal entrada fica vazia na tabela de precedência).
Para encontrar as funções de precedência, usamos o seguinte algoritmo, cuja entrada será uma matriz de precedência de operadores e cuja saída serão