Qual é o exemplo mais simples disponível para explicar a diferença entre árvores de análise e árvores de sintaxe abstrata?

14

Para meu entendimento, um analisador cria uma árvore de análise e a descarta depois. No entanto, ele também pode exibir uma árvore de sintaxe abstrata, da qual o compilador supostamente faz uso.

Tenho a impressão de que a árvore de análise e a árvore de sintaxe abstrata são criadas no estágio de análise. Então alguém poderia explicar por que estas são diferentes?

Lógica do Combinador
fonte
3
Por que eles têm que ser diferentes? Eles não podem ser a mesma coisa de dois pontos de vista ligeiramente diferentes?
6242 S.Lott
1
Não sei se entendi esses dois "pontos de vista um pouco diferentes" :-(
Combinator Logic
Essa é a questão. Eles são a mesma coisa, daí a confusão. Você só tem palavras diferentes, dependendo do seu ponto de vista: Análise versus Geração de Código (ou Execução, no caso de um intérprete).
6242 S.Lott
Não há diferença. Com um pouco de imaginação, é possível inventar uma representação de sintaxe para qualquer possível árvore abstrata de sintaxe. Com falta de imaginação, as expressões S do Lisp seriam uma sintaxe padrão adequada para tudo.
SK-logic
1
Todos vocês deveriam ter lido a resposta antes de comentar. Há uma diferença, mas tê-los separados ou combinados é um problema de implementação.
Paul

Respostas:

20

Uma árvore de análise também é conhecida como árvore de sintaxe concreta.

Basicamente, a árvore abstrata tem menos informações que a árvore concreta. A árvore de concreto contém cada elemento da linguagem, enquanto a árvore abstrata jogou fora as peças desinteressantes.

Por exemplo, a expressão: (2 + 5) * 8

O concreto fica assim

  ( 2  + 5 )  * 8
  |  \ | / |  | |
  |   \|/  |  | |
   \___|__/   | |
       \______|/

Considerando que a árvore abstrata tem:

2  5 
 \/   
  +  8
   \/
   *

Nos casos concretos, os parênteses e todas as partes da linguagem foram incorporadas à árvore. No caso abstrato, os parênteses se foram, porque suas informações foram incorporadas à estrutura da árvore.

Winston Ewert
fonte
Você esqueceu de mencionar em qual compilador para qual idioma isso é implementado dessa maneira. Porque, você sabe, você não precisa ... o analisador também pode jogar fora o parêntese imediatamente.
Ingo
1
@ Ingo, nada na minha resposta tem algo a dizer sobre quando um compilador joga fora parênteses. Perguntando qual é a diferença entre uma árvore de análise concreta e uma árvore de análise abstrata.
Winston Ewert
Então, certamente, você pode nomear uma fonte para sua reivindicação? Ou isso é apenas sua definição particular?
Ingo
1
@ingo, docs.google.com/document/d/…
Winston Ewert
0

A primeira coisa que você precisa entender é que ninguém o obriga a escrever um analisador ou compilador de uma certa maneira. Especificamente, não é necessariamente o caso em que o resultado de um analisador deve ser uma árvore. Pode ser qualquer estrutura de dados adequada para representar a entrada.

Por exemplo, o seguinte idioma:

prog:
      definition 
    | definition ';' prog
    ;

definition: .....

pode ser representado como uma lista de definições. (Nitpickers apontam que uma lista é uma árvore degenerada, mas de qualquer maneira.)

Segundo, não há necessidade de manter a árvore de análise (ou qualquer estrutura de dados que o analisador retornou). Pelo contrário, os compiladores geralmente são construídos como uma sequência de passes, que transformam os resultados do passe anterior. Portanto, o layout geral de um compilador pode ser assim:

parser :: String             -> Maybe [Definitions]      -- parser
pass1  :: [Definitions]      -> Maybe DesugaredProg      -- desugarer
pass2  :: DesugaredProg      -> Maybe TypedProg          -- type checker
pass3  :: TypedProg          -> Maybe AbstractTargetLang -- code generation
pass4  :: AbstractTargetLang -> Maybe String             -- pretty printer

compiler :: String           -> Maybe String    -- transform source code to target code
compiler source = do
   defs  <- parser source
   desug <- pass1 defs
   typed <- pass2 desug
   targt <- pass3 typed
   pass4 targt

Bottom Line: Se você ouvir as pessoas falam sobre árvores de análise , árvores Syntac abstratas , árvores de sintaxe concretas etc., sempre substituir pela estrutura de dados adequado para o propósito determinado , e você está bem.

Ingo
fonte
2
Como isso é uma resposta para a pergunta?
Winston Ewert
@WinstonEwert Eu afirmo que "árvore de análise" e "árvore de sintaxe abstrata" são abstrações e significam nada mais do que "estruturas de dados adequadas". Portanto, a resposta é que a pergunta em sua generalidade não faz sentido, a menos que você peça a diferença entre o tipo de retorno do analisador e o tipo de retorno de alguma outra passagem no compilador XY da linguagem L.
Ingo