Activism, Apple, Computer Science, Culture, DB, Drupal, Guitar, Languages Processing, LaTeX, Left, Linux, Mac, National Geographic, Open Source, Perl, Portugal, XML, World, ...

parsers

Parser Recursivo Descendente vs Parser LL


Parser LL

Os parsers LL usam um algoritmo iterativo sendo que a escolha da produção a usar encontra-se numa tabela auxiliar de decisão. A análise das entradas é efectuada da esquerda para a direita (Left to right) e constrói uma derivação mais à esquerda (Leftmost derivation). Convém igualmente referir que um parser LL é um analisador sintáctico descendente (top-down) pois tenta deduzir as produções da gramática a partir do axioma da mesma. Mais, as gramáticas que podem ser analisadas sintacticamente por estes parsers são qualificadas de gramáticas LL.

Por vezes é usado o termo LL(k), onde k é o número de tokens (em Português, "lexemas"[1]). Estes k lexemas correspondem aos primeiros k símbolos actuais da frase de entrada ainda não consumidos e são usados para tomar decisões na análise.

O analisador sintáctico LL tem pelo menos de receber os seguintes argumentos de entrada:

Algoritmo top-down

No algoritmo top-down, ou em Português "análise sintáctica descendente", o reconhecimento é feito por expansão de regras sintácticas, substituindo símbolos não-terminais do lado esquerdo de produções pelo lado direito das produções. Isto significa que a recursividade é feita à direita, tal como acontece no LL(*). Seguidamente, a expansão das regras sintácticas verifica-se por emparelhamento dos símbolos da frase de entrada com os símbolos terminais das regras sintácticas.

De seguida descreve-se o algoritmo top-down de uma forma linear constituída por quatro passos fundamentais.

parâmetros de entrada
uma gramática G e um frase da linguagem L
resultado de retorno
um árvore de derivação
  1. Criar a raiz da árvore com o símbolo inicial da gramática.
  2. Substituir sucessivamente o símbolo não-terminal mais à esquerda da árvore de derivação pela expressão do lado direito numa produção onde o lado esquerdo é o símbolo em questão.
    Este passo termina quando o primeiro símbolo da produção for um símbolo terminal.
  3. Caso o primeiro símbolo não processado da entrada não emparelhar com o primeiro símbolo da produção seleccionada (como descrito no ponto 2) ter-se-á de recuar um passo atrás e reverter o símbolo não-terminal então substituído. Depois, pesquisar outra alternativa na gramática, isto é, procurar outra produção cujo lado esquerdo corresponda ao símbolo não-terminal em questão. Esta técnica é apelida de "backtracking". Caso não existam alternativas, o algoritmo termina sem sucesso.
  4. Emparelhar, da esquerda para a direita, os símbolos da frase de entrada com os símbolos terminais nas folhas da árvore de derivação até que aconteça umas das três hipóteses:
    • o emparelhamento de símbolos falha => o algoritmo termina sem sucesso ;
    • detecta-se um símbolo não-terminal numa folha da árvore de derivação => regressa-se ao segundo passo do algoritmo ;
    • todos os símbolos da frase de entrada foram emparelhados com todas as folhas da árvore de derivação, sendo que estas apenas contêm símbolos terminais => o algoritmo termina com sucesso.
Syndicate content