Pergunta

Eu estou tentando escrever meu próprio brinquedo My Toy Idioma -> compilador MSIL, a fim de obter uma melhor compreensão de como compiladores trabalho. Eu tenho a análise e léxico de trabalho, eu construí as árvores de expressão e usando a API árvore System.Linq.Expressions expressão, eu tenho um intérprete trabalhando. Agora eu gostaria de emitir algumas assembleias verdadeira MSIL.

O problema é que eu não consigo descobrir como realmente construir essas assembléias. A classe MethodBuilder só aceita corpos de método MSIL matérias , então eu tenho que obter o MSIL crua da minha árvore de expressão. Chamando Expression.Compile () retorna um delegado trabalhando, mas eu não sou capaz de obter a sua MSIL subjacente. Chamando MethodInfo.GetMethodBody () lança um InvalidOperationException uma vez que não é implementado nessa classe criança específica.

Como posso vincular esse delegado em uma nova montagem?

Foi útil?

Solução

Apenas encontrou. A versão DLR de LambdaExpression expõe um método CompileToMethod que faz exatamente o que eu preciso.

lambdaExpression.CompileToMethod(myMethodBuilder);

Outras dicas

A fim de emitir IL-primas que você precisa para definir a sua própria AST. Você precisa obter AssemblyBuilder então ModuleBuilder e, em seguida, você pode definir método de nível de módulo ou obter novos TypeBuilder e agora MethodBuilder para definir método em nível de classe.

Você disse que você já tem lexer e analisador. Isso significa que você pode construir AST. Então, basta percorrer as expressões analisada e emitem o seu IL.

código

Mesmo se você for gerado (por compilar) você não vai ser capaz de fazer algo útil com ele desde que o código gerado depende de infra-estrutura. Por exemplo, se você precisa compilar fechamentos, então você deve criar classe ou outra loja fo variáveis ??lexicais e assim por diante (como transferência de controle lexical não o que requer a utilização de Exceções em .net)

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