s representação de expressão para c

5

Experimentando vários idiomas ultimamente (clojure especialmente) eu me pergunto se existem representações s baseadas em expressões de (subconjuntos) de c, então você poderia usar lisp / closure para escrever macros e então converter a árvore s de expressão c para puro c.

Eu não estou pedindo um -c-compiladores de lisp / scheme / clojure, mas mais de usar o lisps para transformar uma árvore de sintaxe c.

Um pouco da razão pela qual estou fazendo esta pergunta: eu realmente gosto de certas macros de clojure como as macros de threading -> doto etc. E eu sinto que elas seriam ótimas em um ambiente não FP também.

    
por wirrbel 29.06.2013 / 09:35
fonte

1 resposta

2

Você pode obter isso de qualquer representação AST de um programa em C. Apenas ande na árvore e jogue-a como uma expressão S. Tudo que você precisa agora é um bom analisador de C que irá construir um AST.

Eu entendo que você pode dobrar o GNU para fazer isso. Não sei como.

Existem ferramentas que podem exportar versões XML da AST, que são trivialmente equivalentes às expressões-S. Nosso kit de ferramentas de reengenharia de software DMS é um desses. Pode até mesmo reter algumas das diretivas do pré-processador. Não um dump de C, mas um dump de Java fazendo exatamente a mesma coisa pode ser encontrado aqui .

O que você achará um pouco mais difícil é regenerar o texto fonte válido da árvore. Se você não pode fazer isso, fazer transformações na árvore parece inútil.

Você queria fazer isso para aplicar transformações ao código em C. Sim, você pode fazer com as operações de árvore no lisp com relativa facilidade. Mas você tem código dessas transformações em lisp. O DMS fornece a capacidade de realizar transformações, usando a sintaxe de superfície da linguagem (por exemplo, transfomations escritas usando a sintaxe C para padrões). Isso os torna geralmente mais fáceis de escrever, porque a sintaxe da superfície não precisa conhecer o detalhe microscópico da AST. (DMS também tem built-in prettyprinting das árvores).

    
por 07.10.2013 / 06:48
fonte