Pergunta

Eu tenho um AST gerado via ANTLR e preciso convertê-lo em um DLR compatível com uma (árvores de expressão). No entanto, parece que não posso usar os matcheres de padrão de árvores para isso, pois as árvores de expressão precisam de suas subárvores na instanciação (o que não consigo). Que solução seria melhor para eu usar?

Foi útil?

Solução

Fiz algo muito parecido há alguns anos - não construí uma estrutura DLR, mas construí minha própria estrutura de árvore de expressão, que também precisava dos argumentos no tempo de construção (para obter imutabilidade).

Naquela época, eu trabalhei com o ANTLR V2 - e devo admitir que não estou familiarizado com a nova sintaxe V3, além de não me lembrar de todos os detalhes sobre como fazia isso naquela época - então, em vez de fornecer a você um totalmente Exemplo de trabalho, vou tentar contar minha história (não tenho certeza, se ela se aplicar ao seu problema também!):

Primeiro de tudo, não foi necessário construir minha estrutura a partir de o ast. Eu só usei o construtor AST da ANLTR como veículo: toda regra de construção da AST pode devolver um objeto além do próprio nó AST. O valor de retorno pode ser usado na regra externa como argumento para o construtor e assim por diante. Portanto, essa estrutura é construída automaticamente de baixo para você!

Iow, você constrói a estrutura final ao mesmo tempo em que o AST é construído (o AST é construído apenas para garantir as regras de sintaxe e pode ser jogado fora.) Essa abordagem é muito sólida e é ainda mais rápida do que primeiro a construção do AST , e depois transformando isso! Mas ainda utiliza o poder do AST Parser (em vez de apenas usar o analisador/Lexer normal). E se você precisar do AST também - basta salvá -lo em algum lugar.

Se, no entanto, você quiser andar de AST terminado - imagino que você possa usar qualquer rotina programática para fazer isso - apenas certifique -se de que funcione de baixo para construir seu resultado!

Espero que isso ajude de alguma forma!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top