Fix some bugs and add informe.md
Co-authored-by: Ezequiel Bellver <ebellver@itba.edu.ar> Co-authored-by: Juan Barmasch <jbarmasch@itba.edu.ar>
This commit is contained in:
parent
d18e3f4a81
commit
4548d77dee
|
@ -4,13 +4,11 @@ project(BFBCompiler C)
|
|||
|
||||
add_custom_command(
|
||||
OUTPUT ../src/frontend/syntactic-analysis/bison-parser.c ../src/frontend/syntactic-analysis/bison-parser.h
|
||||
# COMMAND bison -d ../src/frontend/syntactic-analysis/bison-grammar.y -o ../src/frontend/syntactic-analysis/bison-parser.c)
|
||||
COMMAND bison -d ../src/frontend/syntactic-analysis/bison-grammar.y -o ../src/frontend/syntactic-analysis/bison-parser.c)
|
||||
# COMMAND bison -Wcounterexamples -d ../src/frontend/syntactic-analysis/bison-grammar.y -o ../src/frontend/syntactic-analysis/bison-parser.c)
|
||||
COMMAND bison -t -d ../src/frontend/syntactic-analysis/bison-grammar.y -o ../src/frontend/syntactic-analysis/bison-parser.c)
|
||||
# COMMAND bison -t -d ../src/frontend/syntactic-analysis/bison-grammar.y -o ../src/frontend/syntactic-analysis/bison-parser.c)
|
||||
|
||||
if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
|
||||
# message(NOTICE "El compilador de C es GCC.")
|
||||
|
||||
add_compile_options(-static-libgcc)
|
||||
add_compile_options(-std=gnu99)
|
||||
add_compile_options(-O3)
|
||||
|
@ -31,8 +29,6 @@ if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
|
|||
DEPENDS ../src/frontend/syntactic-analysis/bison-parser.c ../src/frontend/syntactic-analysis/bison-parser.h)
|
||||
|
||||
elseif (CMAKE_C_COMPILER_ID STREQUAL "MSVC")
|
||||
# message(NOTICE "El compilador de C es Microsoft Visual Studio.")
|
||||
|
||||
add_custom_command(
|
||||
OUTPUT ../src/frontend/lexical-analysis/flex-scanner.c
|
||||
COMMAND flex --wincompat -o ../src/frontend/lexical-analysis/flex-scanner.c ../src/frontend/lexical-analysis/flex-patterns.l
|
||||
|
@ -49,34 +45,26 @@ add_executable(BFBCompiler
|
|||
src/backend/semantic-analysis/analyzer.c
|
||||
src/backend/code-generation/generator.c
|
||||
src/backend/free-tree/free-tree.c
|
||||
# src/backend/domain-specific/numerical-methods.c
|
||||
src/backend/support/logger.c
|
||||
src/frontend/lexical-analysis/flex-actions.c
|
||||
src/frontend/lexical-analysis/flex-scanner.c
|
||||
src/frontend/syntactic-analysis/bison-actions.c
|
||||
src/frontend/syntactic-analysis/bison-parser.c)
|
||||
|
||||
# include(CheckFunctionExists)
|
||||
# check_function_exists(pow POW_FUNCTION_EXISTS)
|
||||
# # check_symbol_exists(pow "math.h" POW_FUNCTION_EXISTS)
|
||||
# if (NOT POW_FUNCTION_EXISTS)
|
||||
# target_link_libraries(BFBCompiler m)
|
||||
# else ()
|
||||
# target_link_libraries(BFBCompiler)
|
||||
# endif ()
|
||||
|
||||
file(GLOB_RECURSE correct_use_cases "doc/examples/correct/use-case-*.b" )
|
||||
file(GLOB_RECURSE incorrect_use_cases "doc/examples/incorrect/use-case-*.b" )
|
||||
|
||||
enable_testing()
|
||||
foreach(test ${correct_use_cases})
|
||||
add_test(NAME ${test}
|
||||
COMMAND ${CMAKE_SOURCE_DIR}/run.sh ${test}
|
||||
# COMMAND ${CMAKE_SOURCE_DIR}/run.sh ${test}
|
||||
COMMAND ${CMAKE_BINARY_DIR}/BFBCompiler ${test}
|
||||
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
|
||||
endforeach()
|
||||
foreach(test ${incorrect_use_cases})
|
||||
add_test(NAME ${test}
|
||||
COMMAND ${CMAKE_SOURCE_DIR}/run.sh ${test}
|
||||
# COMMAND ${CMAKE_SOURCE_DIR}/run.sh ${test}
|
||||
COMMAND ${CMAKE_BINARY_DIR}/BFBCompiler -v
|
||||
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
|
||||
set_tests_properties(${test} PROPERTIES WILL_FAIL TRUE)
|
||||
endforeach()
|
||||
|
|
50
README.md
50
README.md
|
@ -17,29 +17,63 @@ Debe instalar
|
|||
- [Flex v2.6.4](https://github.com/westes/flex)
|
||||
- [GCC v11.1.0](https://gcc.gnu.org/)
|
||||
- [Make v4.3](https://www.gnu.org/software/make/)
|
||||
- [Octave v7.1.0](https://www.gnu.org/software/octave)
|
||||
- [Python v3.10.5](https://www.python.org/)
|
||||
- [Pip v21.0](https://pip.pypa.io/en/stable/installation/)
|
||||
- [SymPy v1.5.1](https://pypi.org/project/sympy/)
|
||||
|
||||
Estos se encuentran disponibles en el repositorio de la vasta mayoría de distribuciones de Linux/macOS.
|
||||
### Linux/macOS
|
||||
|
||||
Si en lugar de trabajar con un entorno _Linux_, se está construyendo el proyecto sobre un entorno _Microsoft Windows_, se debe instalar _Microsoft Visual Studio 2022_ con las extensiones para desarrollar aplicaciones en _C/C++_, así como también las herramientas requeridas, con excepción del compilador _GCC_ y la herramienta _Make_.
|
||||
Estos se encuentran disponibles en el repositorio de la vasta mayoría de distribuciones.
|
||||
|
||||
### Windows
|
||||
|
||||
Se debe instalar _Microsoft Visual Studio 2022_ con las extensiones para desarrollar aplicaciones en _C/C++_, así como también las herramientas requeridas, con excepción del compilador _GCC_ y la herramienta _Make_.
|
||||
|
||||
## Compilación <a name="compilación"></a>
|
||||
|
||||
En Linux, para compilar todos los archivos, se debe ejecutar el script `compile.sh` (desde la carpeta raíz del proyecto).
|
||||
### Linux/macOS
|
||||
|
||||
En un entorno _Microsoft Windows_, en cambio, debe correr `cmake -S . -B bin` y se deberá abrir la solución generada `bin/Compiler.sln` con el IDE _Microsoft Visual Studio 2022_.
|
||||
Para compilar todos los archivos, se debe ejecutar el script `compile.sh` (desde la carpeta raíz del proyecto).
|
||||
|
||||
### Windows
|
||||
|
||||
Debe correr `cmake -S . -B bin` y luego abrir la solución generada `bin/Compiler.sln` con el IDE _Microsoft Visual Studio 2022_.
|
||||
|
||||
## Ejecución <a name="ejecución"></a>
|
||||
|
||||
El paso anterior generará el ejecutable `bin/BFBCompiler`.
|
||||
|
||||
Usted puede pasarle tanto un archivo:
|
||||
|
||||
```bash
|
||||
./bin/BFBCompiler ${FILE}
|
||||
```
|
||||
|
||||
como entrada estándar:
|
||||
|
||||
```bash
|
||||
echo "fun g = x^2;" | ./bin/BFBCompiler
|
||||
```
|
||||
|
||||
Esto, a su vez, generará un archivo _.m_ que debería correrse como:
|
||||
|
||||
```bash
|
||||
octave bottler.m
|
||||
```
|
||||
|
||||
Para que este proceso sea más fácil se le provee un archivo `run.sh` (que ejecuta la compilación y octave).
|
||||
|
||||
Ahora, usted podrá pasarle un programa haciendo:
|
||||
|
||||
```bash
|
||||
./run.sh ${PROGRAM}
|
||||
./run.sh ${FILE}
|
||||
```
|
||||
|
||||
o también podría directamente escribir el programa:
|
||||
o también podría directamente escribir el programa (como se mencionó antes):
|
||||
|
||||
```bash
|
||||
./run.sh "fun x = x^2;"
|
||||
./run.sh "fun g = x^2;"
|
||||
```
|
||||
|
||||
## Testeos <a name="tests"></a>
|
||||
|
@ -50,6 +84,8 @@ Puede correrlos con:
|
|||
ctest --test-dir bin
|
||||
```
|
||||
|
||||
De esta manera se correrán todos los casos de uso que aparecen en `doc/examples`.
|
||||
|
||||
# Autores
|
||||
- Barmasch, Juan Martín (61033)
|
||||
- Bellver, Ezequiel (61268)
|
||||
|
|
|
@ -0,0 +1,73 @@
|
|||
# Informe
|
||||
|
||||
## Tabla de contenidos
|
||||
- [Introducción](#introducción-)
|
||||
- [Consideraciones adicionales](#consideraciones-adicionales-)
|
||||
- [Lenguaje](#lenguaje-)
|
||||
- [Restricciones](#restricciones-)
|
||||
- [Desarrollo y fases](#desarrollo-y-fases-)
|
||||
- [Dificultades](#dificultades-)
|
||||
- [Futuras extensiones>](#futuras-extensiones-)
|
||||
- [Bibliografía](#bibliografía-)
|
||||
|
||||
## Introducción <a name="introducción"></a>
|
||||
El presente informe detalla las decisiones tomadas por el grupo a la hora de resolver el Trabajo Práctico Especial de la materia 72.39 - Autómatas, Teoría de Lenguajes y Compiladores. El mismo consistió en diseñar y desarrollar un lenguaje y su compilador, construyendo sus dos componentes principales: el frontend, y el backend. Para esto se utilizaron el lenguaje C y Flex + Bison como analizadores léxico y sintáctico, respectivamente.
|
||||
|
||||
La idea original era "desarrolar un lenguaje que permita trabajar con funciones". El lenguaje permitirá declarar funciones, evaluarlas, conseguir el valor de la derivada de orden n en un punto, realizar integrales definidas, componer funciones, realizar operaciones aritméticas, entre otras.
|
||||
|
||||
## Consideraciones adicionales <a name="consideraciones_adicionales"></a>
|
||||
Las propiedades intrínsecas del lenguaje definido (detalladas en la siguiente sección) requieren especial atención al manejo de punto flotante durante las operaciones realizadas.
|
||||
|
||||
## Lenguaje <a name="lenguaje"></a>
|
||||
El lenguaje originalmente preveía ofrecer las siguientes prestaciones:
|
||||
|
||||
1. Se podrán crear una o varias funciones, las mismas pueden ser partidas o contar con un dominio acotado.
|
||||
2. Se podrán evaluar las funciones.
|
||||
3. Se podrán calcular las derivadas de cualquier orden en un punto.
|
||||
4. Se podrán calcular integrales definidas.
|
||||
5. Se podrán componer funciones.
|
||||
6. Las variables podrán ser de tipo function, string o double.
|
||||
7. Las variables podrán ser vectores de alguno de los tipos anteriores.
|
||||
8. Se proveerán operadores relacionales como <, >, =, !=, <= y >=.
|
||||
9. Se proveerán operaciones aritméticas básicas como +, -, * y /.
|
||||
10. Se proveerán operaciones lógicas básicas como AND, OR y NOT.
|
||||
11. Se proveerán estructuras de control básicas de tipo IF-THEN-ELSE, FOR y WHILE.
|
||||
|
||||
Sin embargo, a la hora de implementarlo, se debió prescindir de algunas de ellas a causa de las restricciones temporales del proyecto (a saber: definir variables de tipo string y definir vectores de algún tipo de dato).
|
||||
|
||||
En contraste, al resolver algunas de las dificultades detalladas en la sección [Dificultades](#dificultades-), se pudo añadir nueva funcionalidad gracias a las soluciones propuestas. Esta consiste en poder conseguir la función derivada de orden n (simbólica) de una f cualquiera, en lugar de limitarnos a evaluar la derivada en un punto. Es por esto también que se eliminó la opción de pasarle un error a la derivada (como se había planteado en la primera entrega).
|
||||
|
||||
Una limitación que consideramos importante destacar de nuestro lenguaje es que, a la hora de definir funciones partidas, en ningún momento se valida que los dominios definidos para dicha función sean excluyentes, retornando, en el caso de no lo sean, la suma de ambas partes de la funciión. A su vez, si se intenta evaluar una función en un punto no contenido en su dominio, la misma retornará 0. Esto se debe a que la forma en la que pudimos resolver la función partida fue multiplicar la función en cuestión por un booleano que indica si la variable de entrada pertenece o no al dominio indicado.
|
||||
|
||||
|
||||
## Restricciones del lenguaje <a name="restricciones"></a>
|
||||
variables o funciones no pueden ser x
|
||||
solo se peuden escribir funciones que tengan a x como incognita
|
||||
las variables y funciones son globales
|
||||
no es tipado -> puedo pisar una funcion con una variable
|
||||
algo mas?
|
||||
|
||||
|
||||
• Descripción de la gramática/sintaxis del lenguaje diseñado.
|
||||
• Descripción del desarrollo del proyecto y de las fases del compilador.
|
||||
|
||||
## Desarrollo y fases <a name="desarrollo_y_fases"></a>
|
||||
|
||||
|
||||
## Dificultades <a name="dificultades"></a>
|
||||
Al realizar el backend del trabajo surgieron dificultades relacionadas a los métodos numéricos usados, principalmente debido al error de la representacion de punto flotante. Es por esto que se optó por el uso de `octave` y la librería `SymPy` para el calculo de derivadas, que deriva la función de manera simbólica (sin utilizar métodos numéricos). Así mismo se utiliza la función `quadv` que utiliza el método de [Simpson 3/8 compuesto][2] para el cálculo de integrales.
|
||||
|
||||
Aquí surgieron distintas alternativas:
|
||||
1. Hacer un llamado a octave cada vez que necesitemos derivar o integrar.
|
||||
2. Generar código octave.
|
||||
3. Generar código C++ con octave [embebido][1].
|
||||
|
||||
De aquí se descartó rápidamente la primera opción pues es muy ineficiente. Se estaría haciendo un `fork` por cada llamado a `Derivate` o `Integrate` lo cual resultaría muy costoso. Por otro lado, la tercera opción también se dejó de lado ya que si bien se embebía a C++ y se generaba un código objeto (siendo así la más eficiente de las tres) hubiera requerido investigar sobre C++ y la API de `octave` y no era el objetivo de este trabajo. Es por todo esto que se terminó optando por la segunda opción (pese a ser interpretado).
|
||||
|
||||
## Futuras extensiones <a name="futuro"></a>
|
||||
Se pueden agregar arrays (que no impondría una gran dificultad) y distintas funcionalidades como por ejemplo taylor, limites, etc. Estas últimas tampoco serían díficiles pues `octave` las soporta de forma nativa (con el paquete de `symbolics` que es el que se usa actualmente).
|
||||
|
||||
## Bibliografía <a name="bibliografía"></a>
|
||||
[1]: https://docs.octave.org/interpreter/Getting-Started-with-Oct_002dFiles.html
|
||||
[2]: http://www.unsj.edu.ar/unsjVirtual/metodos/wp-content/uploads/2015/09/NotasMetodos-Cap3.pdf
|
||||
|
2
run.sh
2
run.sh
|
@ -6,6 +6,8 @@ fi
|
|||
|
||||
if [ -f "$1" ]; then
|
||||
cat "$1" | ./bin/BFBCompiler
|
||||
[ $? -eq 0 ] && octave bottler.m
|
||||
else
|
||||
echo "$1" | ./bin/BFBCompiler
|
||||
[ $? -eq 0 ] && octave bottler.m
|
||||
fi
|
||||
|
|
12
src/main.c
12
src/main.c
|
@ -11,10 +11,6 @@
|
|||
CompilerState state;
|
||||
|
||||
int main(int argc, char ** argv) {
|
||||
// #ifdef YYDEBUG
|
||||
// yydebug = 1;
|
||||
// #endif
|
||||
|
||||
state.succeed = false;
|
||||
|
||||
char * outputFile = NULL;
|
||||
|
@ -22,7 +18,7 @@ int main(int argc, char ** argv) {
|
|||
FILE * file = fopen(argv[1], "r+");
|
||||
if (file == NULL) {
|
||||
perror("Error abriendo el archivo");
|
||||
abort();
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
yyin = file;
|
||||
|
||||
|
@ -31,10 +27,10 @@ int main(int argc, char ** argv) {
|
|||
}
|
||||
argc--;
|
||||
|
||||
int c = getopt(argc, argv, "ho:");
|
||||
int c = getopt(argc, argv, "vo:");
|
||||
switch (c) {
|
||||
case 'h':
|
||||
LogInfo("Suckerberg");
|
||||
case 'v':
|
||||
printf("BFBCompiler v0.1\n");
|
||||
exit(EXIT_SUCCESS);
|
||||
case 'o':
|
||||
outputFile = optarg;
|
||||
|
|
Loading…
Reference in New Issue