A saída de um analisador precisa ser uma árvore ou também pode ser um gráfico geral?
Além disso, existe alguma linguagem existente ou plausível que use a representação geral de gráficos em vez de árvores para sua sintaxe?
A saída de um analisador precisa ser uma árvore ou também pode ser um gráfico geral?
Além disso, existe alguma linguagem existente ou plausível que use a representação geral de gráficos em vez de árvores para sua sintaxe?
Respostas:
A saída de um analisador não precisa ser uma árvore. De fato, quando você considera itens como referências do USO de uma variável à sua DEFinição sobrepostos na árvore de sintaxe abstrata, você imediatamente tem um gráfico.
O fato é que a análise geralmente é projetada para ocorrer em uma única passagem - isso foi importante por razões históricas, como falta de espaço e velocidade do processador, mas também porque é mais simples de raciocinar. As fases subsequentes decoram a árvore de análise com informações adicionais.
Existem coisas como gramáticas gráficas, embora eu não saiba se elas são usadas para analisar linguagens de programação.
A pergunta do OP está um pouco atrasada. Obviamente, um algoritmo de análise pode gerar o que quiser. A questão é mais para entender para que serve a análise e se o analisador gera um resultado que atenda a esse objetivo. Então, pode-se perguntar qual é a representação apropriada para isso, por exemplo, uma árvore ou um gráfico.
Bem, acho que um analisador é um algoritmo que fornecerá a estrutura sintática de uma sentença dada como entrada, de acordo com uma definição formal da sintaxe da linguagem.
Observe que as pessoas podem discordar sobre o que constitui a sintaxe do idioma. Alguns podem limitar isso a um backbone de linguagem formal pura, enquanto outros podem introduzir considerações semânticas um pouco mais, como tipo, gênero, número ou outras mais complexas (não estou distinguindo PNL ou linguagens de programação). A maioria das linguagens possui recursos que exigem representação gráfica, mas cabe ao "implementador" (por falta de uma palavra melhor) decidir se ele deseja incluir isso na sintaxe.
Portanto, dependendo do que você define como sintaxe, pode ser necessário gerar um tipo diferente de estrutura formal.
No caso simples de análise livre de contexto, uma árvore de análise pode funcionar, exceto pelo problema de ambiguidade abordado abaixo ou pelo fato de que você pode querer modificá-lo um pouco para obter um AST (veja abaixo).
No entanto, em casos mais complexos, você pode precisar de estruturas diferentes, geralmente representadas por links na árvore, resultando em uma estrutura gráfica. Isso depende muito da sua definição da sintaxe da linguagem.
Além disso, qual árvore você deve exibir não é óbvia. Se você usar o caso das gramáticas adjacentes a árvores (TAG), elas funcionam de tal maneira que a árvore de sintaxe não é a mesma que a árvore de derivação, embora a primeira possa ser derivada da segunda. Qual você deseja produzir pode ser uma pergunta relevante.
Há também outra questão sobre ambiguidade. Uma determinada frase, embora pertencente ao seu idioma, pode fazê-lo de muitas maneiras diferentes, pode ser atribuída a uma estrutura sintática de muitas maneiras diferentes.
Em seguida, você pode optar por gerar apenas uma dessas estruturas, escolhidas aleatoriamente ou de acordo com algum critério bem definido (por exemplo, similitude). Você também pode optar por produzir vários ou todos eles. Se você deseja produzir vários, geralmente é conveniente embalar em uma estrutura única que compartilhará o que eles têm em comum. Isso economiza espaço e tempo de computação, e a complexidade pode ser um problema real.
Quando você escolhe produzir todos eles, não tem escolha a não ser compartilhar, porque pode haver um número infinito de análises possíveis. E infinitamente pode ser representado finitamente apenas tendo um ciclo em um gráfico. Então você tem que produzir uma estrutura gráfica em geral. Mas as propriedades dessa estrutura gráfica estão relacionadas ao tipo de sintaxe formal que você escolheu.
Agora a pergunta também era sobre Árvores de Sintaxe Abstratas. Eu pulei a parte "abstrata", pois isso traria confusão, imho. De fato, a questão já é confusa em suas várias reformulações.
Em relação ao AST em perspectiva histórica, eles se originaram com a linguagem Lisp e sistemas de manipulação de programas nos anos 1960-1970. A idéia era considerar os programas como expressões grandes, como fórmulas matemáticas, tanto para fins de manipulação quanto para analisar propriedades ou definir semântica de maneira formal, que os matemáticos sabem fazer nas fórmulas. Como fórmulas, elas eram naturalmente estruturadas em árvores, mas podiam ser decoradas com várias informações que transformavam essas árvores em gráficos. Isso foi conveniente tanto formal quanto pragmaticamente e foi mais usado por compiladores e sistemas de programação.
Portanto, fundamentalmente, um AST é uma árvore, como está implícito no nome, mas pode levar mais informações. O resto está nas escolhas do implementador e aos olhos de quem vê. É um gráfico ou uma árvore decorada? No entanto, a árvore AS básica é importante, porque esse é o andaime que você cria tanto na teoria quanto na programação.
Observe que o AST era distinto da árvore de análise (a sintaxe era livre de contexto), produzida pelo algoritmo de análise estudado na teoria formal da linguagem. O motivo foi que o design da sintaxe foi restringido pela tecnologia de análise da época, ela própria pelo baixo poder de computação disponível. O resultado foi que as árvores de sintaxe eram apenas variantes torturadas daquilo que se consideraria naturalmente a estrutura do programa, e o processamento adicional, que não é realmente parte do processo formal de análise formal, teve que ser realizado para obter a versão mais limpa e simples chamada AST.
No entanto, a representação de árvores no computador, abstrata ou não, é um pouco restrita quando você deseja representar todas as estruturas de uma sentença ambígua. Em particular, isso oculta problemas de complexidade. A preservação de ambiguidades em uma estrutura de gráfico, enquanto a conversão de árvores de análise para AS Trees também pode ser um problema. No entanto, se você estiver preocupado com isso, muitas vezes é possível definir sua sintaxe concreta de forma que a árvore de análise possa servir como AST. Isso é permitido pelos algoritmos muito gerais que lidam com ambiguidade e pelo poder dos computadores atuais.
Se você analisar usando a análise GLR (Generalized LR) e se a análise da entrada for ambígua (existem várias maneiras possíveis de analisar a entrada), o resultado da análise poderá ser considerado como um DAG de análise, em vez de um analisar árvore. O DAG de análise codifica compactamente muitas análises possíveis: várias árvores de análise possíveis.
No entanto, a linha inferior continua sendo que, se você possui uma gramática livre de contexto e se a sequência de entrada é inequivocamente analisável (existe apenas uma derivação única na gramática que produz essa sequência de entrada), e se o trabalho de análise é produzir essa derivação ... então, nessas condições, a saída da análise sempre será necessariamente uma árvore de análise, porque qualquer produção de uma gramática livre de contexto possui inerentemente uma estrutura de árvore.
Certa vez, escrevi um intérprete para C no qual o "AST" para o operador + = (por exemplo) não era uma árvore. Considere a[i++] += d
onde a[i++]
está int
e d
está double
. As operações implícitas de conversão e busca foram explícitas na árvore; portanto, o problema é onde colocar a busca a[i++]
e a conversão para dobrar. Nossa solução foi abandonar árvores. O "ASG" resultante era assim
+=
/ | \
/ | \
/ | \
/ convert \
| | \
| fetch fetch
| / |
index d
/ \
a postinc
|
i
Eu mesmo fiquei intrigado com isso, até que acabei de perceber que não é a árvore que é abstrata, nem se trata de alguma "árvore de sintaxe" abstrata, mas a sintaxe é abstrata.
Portanto, para responder sua pergunta, concluo que uma árvore de sintaxe abstrata, bem como uma árvore de sintaxe concreta ou uma árvore de decisão, ou qualquer outra árvore, deveriam ser melhor uma árvore.
Por outro lado, nada deve impedir que alguém use um gráfico de sintaxe abstrata, um diagrama de sintaxe abstrata, um cubo de sintaxe abstrata ou uma especificação de sintaxe abstrata.
Suponho que uma árvore de sintaxe abstrata da "árvore de sintaxe abstrata" teria me ajudado a evitar a confusão.