From cac12eb12c468dd43a11f91eb785cfafc90eb960 Mon Sep 17 00:00:00 2001 From: romildo Date: Mon, 24 Oct 2016 13:22:23 -0200 Subject: [PATCH] More details on a task 2 --- doc/eplan-compiler.tex | 20 +++++++++++++++++--- eplan-compiler.pdf | Bin 188228 -> 188903 bytes 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/doc/eplan-compiler.tex b/doc/eplan-compiler.tex index b5ad9c0..28c6ed6 100644 --- a/doc/eplan-compiler.tex +++ b/doc/eplan-compiler.tex @@ -1261,7 +1261,7 @@ \section{Análise semântica} Implementar \textbf{literais inteiros} no compilador de \lang{}. \begin{enumerate} \item Para desenvolver esta atividade faça o \emph{checkout} da - \alert{versão 0.15} do projeto. + \alert{versão 0.16} do projeto. \item Definir uma nova classe \pyginline|types.INT| para representar o tipo \texttt{int} de \lang{}. @@ -1275,6 +1275,12 @@ \section{Análise semântica} \item implementar o método \pyginline|semantic_| \item implementar o método \pyginline|codegen| \end{itemize} + + \item Modifique a classe \pyginline|absyn.ExpBinOp| de forma que + os operadores aritméticos aceitem operandos inteiros e + reais. Neste momento não é necessário fazer conversão implícita + dos operandos de inteiro para real. Por hora os operandos devem + ser do mesmo tipo numérico. \item Acrescentar na gramática da linguagem: \begin{itemize} @@ -1303,10 +1309,18 @@ \section{Análise semântica} \end{enumerate} \begin{tips} - \item Na geração de código use o método + \item Na geração de código use os métodos \href{http://bytedeco.org/javacpp-presets/llvm/apidocs/org/bytedeco/javacpp/LLVM.html#LLVMConstInt-org.bytedeco.javacpp.LLVM.LLVMTypeRef-long-int-}{\pyginline|LLVMConstInt|} - \end{tips} + + \href{http://bytedeco.org/javacpp-presets/llvm/apidocs/org/bytedeco/javacpp/LLVM.html#LLVMBuildAdd-org.bytedeco.javacpp.LLVM.LLVMBuilderRef-org.bytedeco.javacpp.LLVM.LLVMValueRef-org.bytedeco.javacpp.LLVM.LLVMValueRef-java.lang.String-}{\pyginline|LLVMBuildAdd|} + + \href{http://bytedeco.org/javacpp-presets/llvm/apidocs/org/bytedeco/javacpp/LLVM.html#LLVMBuildSub-org.bytedeco.javacpp.LLVM.LLVMBuilderRef-org.bytedeco.javacpp.LLVM.LLVMValueRef-org.bytedeco.javacpp.LLVM.LLVMValueRef-java.lang.String-}{\pyginline|LLVMBuildSub|} + + \href{http://bytedeco.org/javacpp-presets/llvm/apidocs/org/bytedeco/javacpp/LLVM.html#LLVMBuildMul-org.bytedeco.javacpp.LLVM.LLVMBuilderRef-org.bytedeco.javacpp.LLVM.LLVMValueRef-org.bytedeco.javacpp.LLVM.LLVMValueRef-java.lang.String-}{\pyginline|LLVMBuildMul|} + + \href{http://bytedeco.org/javacpp-presets/llvm/apidocs/org/bytedeco/javacpp/LLVM.html#LLVMBuildSDiv-org.bytedeco.javacpp.LLVM.LLVMBuilderRef-org.bytedeco.javacpp.LLVM.LLVMValueRef-org.bytedeco.javacpp.LLVM.LLVMValueRef-java.lang.String-}{\pyginline|LLVMBuildSDiv|} +\end{tips} \end{frame} diff --git a/eplan-compiler.pdf b/eplan-compiler.pdf index 3907114a212eba4fa70b061c0f55082a1325309f..75412bd01727bc7980da9aaf169edfb50b190f83 100644 GIT binary patch delta 10884 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