Update *.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
4548d77dee
commit
598d7b1d49
|
@ -18,9 +18,6 @@ if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
|
|||
add_compile_options(-Wno-implicit-fallthrough)
|
||||
add_compile_options(-pedantic)
|
||||
add_compile_options(-pedantic-errors)
|
||||
add_compile_options(-fsanitize=address)
|
||||
add_compile_options(-fno-omit-frame-pointer)
|
||||
add_link_options(-fsanitize=address)
|
||||
|
||||
add_custom_command(
|
||||
OUTPUT ../src/frontend/lexical-analysis/flex-scanner.c
|
||||
|
@ -57,14 +54,12 @@ 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_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_BINARY_DIR}/BFBCompiler -v
|
||||
COMMAND ${CMAKE_BINARY_DIR}/BFBCompiler ${test}
|
||||
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
|
||||
set_tests_properties(${test} PROPERTIES WILL_FAIL TRUE)
|
||||
endforeach()
|
||||
|
|
23
README.md
23
README.md
|
@ -21,15 +21,38 @@ Debe instalar
|
|||
- [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/)
|
||||
- [Symbolic v2.9.0](https://octave.sourceforge.io/symbolic/)
|
||||
|
||||
### Linux/macOS
|
||||
|
||||
Estos se encuentran disponibles en el repositorio de la vasta mayoría de distribuciones.
|
||||
|
||||
Una vez instalados `bison`, `cmake`, `flex`, `gcc`, `make`, `octave` y `python` debe instalar `SymPy` y el paquete `symbolic` de `octave`.
|
||||
|
||||
Se recomienda usar `pip` para instalar `SymPy`:
|
||||
|
||||
```bash
|
||||
pip install --user sympy==1.5.1
|
||||
```
|
||||
|
||||
Luego, debe instalar `symbolic` en octave corriendo:
|
||||
|
||||
```bash
|
||||
octave
|
||||
```
|
||||
|
||||
y una vez adentro
|
||||
|
||||
```bash
|
||||
pkg install -forge symbolic
|
||||
```
|
||||
|
||||
### 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_.
|
||||
|
||||
Consulte cómo instalar `SymPy`. La instalación de `symbolic` es idéntica al paso anterior.
|
||||
|
||||
## Compilación <a name="compilación"></a>
|
||||
|
||||
### Linux/macOS
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 66 KiB |
|
@ -32,30 +32,27 @@ El lenguaje originalmente preveía ofrecer las siguientes prestaciones:
|
|||
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?
|
||||
- No se permite definir ni variables ni funciones con nombre 'x' debido a que queda reservado para la incognita de las funciones.
|
||||
- Las funciones solo pueden tener una incognita denotada como 'x'.
|
||||
- Las variables y las funciones tienen scope global, esto viene dado por el uso de octave como motor matemático.
|
||||
- El lenguaje no es tipado, las variables pueden ser pisadas y tratadas como funciones y viceversa.
|
||||
|
||||
|
||||
• Descripción de la gramática/sintaxis del lenguaje diseñado.
|
||||
• Descripción del desarrollo del proyecto y de las fases del compilador.
|
||||
## Gramática
|
||||
Las reglas de la gramática se encuentran definidas en __bison-grammar.y__ y la sintáxis está ampliamente usada en los casos de uso en __/doc/examples/\*\*__.
|
||||
|
||||
## Desarrollo y fases <a name="desarrollo_y_fases"></a>
|
||||
|
||||
<img src="fases.png" alt="Fases del compilador">
|
||||
|
||||
## 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.
|
||||
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 cálculo de derivadas, que deriva la función de manera simbólica (sin utilizar métodos numéricos). Asimismo 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.
|
||||
|
@ -68,6 +65,8 @@ De aquí se descartó rápidamente la primera opción pues es muy ineficiente. S
|
|||
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
|
||||
|
||||
[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
|
||||
|
||||
|
|
|
@ -22,7 +22,6 @@
|
|||
Domain * domain;
|
||||
Block * block;
|
||||
Composite * composite;
|
||||
// NumArray * numArray;
|
||||
AssignVariable * assignVariable;
|
||||
|
||||
int intNumber;
|
||||
|
@ -48,10 +47,8 @@
|
|||
%type <for_st> for_statement
|
||||
%type <composite> composite
|
||||
%type <print> print
|
||||
/* %type <numArray> numArrays numArray */
|
||||
%type <doubleNumber> positive_constant
|
||||
%type <string> escapeString
|
||||
/* %type <intNumber> positive_constant */
|
||||
|
||||
%token <token> ADD
|
||||
%token <token> SUB
|
||||
|
@ -184,50 +181,16 @@ composite: ID COMPOSITE ID
|
|||
| ID COMPOSITE composite { $$ = CompositeCompGrammarAction($1, $3); }
|
||||
;
|
||||
|
||||
/* expressions: expression { $$ = $1; }
|
||||
| expression COMMA expressions { $$ = ExpressionsGrammarAction($1, $3); }
|
||||
; */
|
||||
|
||||
/* ids: ID { $$ = $1 }
|
||||
| ID COMMA ids { $$ = DoubleGrammarAction($1) }
|
||||
; */
|
||||
|
||||
/* numArray: OPEN_BRACKETS expressions CLOSE_BRACKETS { $$ = $2; }
|
||||
;
|
||||
|
||||
numArrays: numArray { $$ = DoubleGrammarAction($1) }
|
||||
| numArray COMMA numArrays { $$ = DoubleGrammarAction($1) }
|
||||
;
|
||||
|
||||
arrayNumArray: OPEN_BRACKETS numArrays CLOSE_BRACKETS { $$ = DoubleGrammarAction($1) }
|
||||
; */
|
||||
|
||||
/* idArray: OPEN_BRACKETS ids CLOSE_BRACKETS { $$ = DoubleGrammarAction($1) }
|
||||
; */
|
||||
|
||||
escapeString: ESCAPESTRING { $$ = EscapedStringGrammarAction($1); }
|
||||
| ESCAPESTRING ADD escapeString { $$ = EscapedStringsGrammarAction($1, $3); }
|
||||
;
|
||||
/*
|
||||
escapeStrings: escapeString { $$ = $1 }
|
||||
| escapeString COMMA escapeStrings { $$ = DoubleGrammarAction($1) }
|
||||
;
|
||||
|
||||
escapeStringArray: OPEN_BRACKETS escapeStrings CLOSE_BRACKETS { $$ = DoubleGrammarAction($1) }
|
||||
;
|
||||
*/
|
||||
evaluate: EVALUATE ID IN OPEN_PARENTHESIS expression CLOSE_PARENTHESIS { $$ = EvaluateGrammarAction($2, $5); }
|
||||
/* | EVALUATE ID IN numArray { $$ = DoubleGrammarAction($1) } */
|
||||
| ID OPEN_PARENTHESIS expression CLOSE_PARENTHESIS { $$ = EvaluateGrammarAction($1, $3); }
|
||||
/* | EVALUATE idArray IN OPEN_PARENTHESIS expression CLOSE_PARENTHESIS { $$ = DoubleGrammarAction($1) } */
|
||||
/* | EVALUATE idArray IN numArray { $$ = DoubleGrammarAction($1) } */
|
||||
/* | idArray OPEN_PARENTHESIS expression CLOSE_PARENTHESIS { $$ = DoubleGrammarAction($1) } */
|
||||
;
|
||||
|
||||
integrate: INTEGRATE ID BETWEEN OPEN_PARENTHESIS expression AND_INT expression CLOSE_PARENTHESIS { $$ = IntegrateGrammarAction($2, $5, $7); }
|
||||
| INTEGRATE ID OPEN_PARENTHESIS expression AND_INT expression CLOSE_PARENTHESIS { $$ = IntegrateGrammarAction($2, $4, $6); }
|
||||
/* | INTEGRATE idArray BETWEEN OPEN_PARENTHESIS expression AND_INT expression CLOSE_PARENTHESIS { $$ = DoubleGrammarAction($1) }
|
||||
| INTEGRATE idArray OPEN_PARENTHESIS expression AND_INT expression CLOSE_PARENTHESIS { $$ = DoubleGrammarAction($1) } */
|
||||
| integrate ERR positive_constant { $$ = ErroredIntegrateGrammarAction($1, $3); }
|
||||
;
|
||||
|
||||
|
@ -241,8 +204,6 @@ statements: statement
|
|||
|
||||
derivative: DERIVATIVE ID IN OPEN_PARENTHESIS expression CLOSE_PARENTHESIS { $$ = SimpleDerivativeGrammarAction($2, $5); }
|
||||
| DERIVATIVE INTEGER ID IN OPEN_PARENTHESIS expression CLOSE_PARENTHESIS { $$ = GradedDerivativeGrammarAction($2, $3, $6); }
|
||||
/* | DERIVATIVE idArray IN OPEN_PARENTHESIS expression CLOSE_PARENTHESIS { $$ = DoubleGrammarAction($1) }
|
||||
| DERIVATIVE INTEGER idArray IN OPEN_PARENTHESIS expression CLOSE_PARENTHESIS { $$ = DoubleGrammarAction($1) } */
|
||||
| derivative ERR positive_constant { $$ = ErroredDerivativeGrammarAction($1, $3); }
|
||||
;
|
||||
|
||||
|
|
|
@ -70,7 +70,6 @@ int main(int argc, char ** argv) {
|
|||
LogError("Se produjo un error en la aplicacion.");
|
||||
result = EXIT_FAILURE;
|
||||
break;
|
||||
// return -1;
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
|
|
Loading…
Reference in New Issue