mslomp
(usa Slackware)
Enviado em 18/04/2009 - 11:11h
então cara, em suma, a partir daí você precisará revisitar cada sentença, e conforme sua variante, ir emitindo instruções (insn) de sua máquina alvo. o mais usual é construir uma árvore para cada bloco de sentenças relacionadas, onde cada nó será um token.
exemplo:
a = b + c
ficará
.........../===b
a===+
...........\===c
(coloquei na horizontal pois na vertical perderia a formatação :D)
supondo que você tenha templates insn tipo:
move #n,#regi
add #n,#regi
onde #n é um valor imediato e #regi é um registrador imediato,
a primeira transformação óbvia é:
move a,r1
ao passar pelo próximo nó (+):
add b,r1
add c,r1
há alguns livros bons no assunto, como o Compiler Design Handbook, Engineering a Compiler, e também o famoso livro do dragão, entre outros.
dê uma olhada também no GCC Internals, em especial os capítulos 10 e 16.
uma boa leitura também é o Let's Build a Compiler, disponível gratuitamente, inclusive em formato pdf.
e, como o google sempre é nosso amigo, faça uma busca por 'compiler back-end'