IR (Intermediate Representation), é a representação intermediaria que é o conjunto de estruturas de dados para representar o código processado. A vantagem da utilização de uma representação intermediária é facilmente entendida na seguinte figura:
Fonte: https://www.cs.princeton.edu/courses/archive/spr03/cs320/notes/IR-trans1.pdf
A utilização de compiladores em três estágios é empregado no projeto LLVM. Talvez tenham ouvido falar do compilador Clang, que é usado pela Apple e no repl.it. Algumas linguagens mais recentes tem usado essa plataforma, como Rust e Swift.
Um exemplo de código na LLVM IR:
Fonte: https://llvm.org/docs/LangRef.html
Uma árvore sintática (parse tree) é uma representação gráfica para a derivação, ou análise sintática, que corresponde ao programa de entrada (Cooper). Essas árvores terão os elementos presentes na sintaxe daquela linguagem, incluindo: parenteses, palavras chaves, demarcadores ..
A árvore sintática abstrata (AST — Abstract Syntax Tree) retém a estrutura essencial da árvore de derivação, mas elimina os nós irrelevantes. A precedência e o significado da expressão permanecem, mas os nós irrelevantes desapareceram (Cooper). Por exemplo, para AST não importa se um bloco é demarcado por chaves, endentação ou palavras reservadas como begin
e end
. Por exemplo, uma AST: