diff --git a/CMakeLists.txt b/CMakeLists.txt index 7791124..743ea63 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,55 +6,55 @@ project(Compiler C) # Compilar el parser con Bison: 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 -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) + 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 -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) # Seleccionar estrategia según el compilador de C disponible en el sistema: if (CMAKE_C_COMPILER_ID STREQUAL "GNU") - message(NOTICE "El compilador de C es GCC.") + message(NOTICE "El compilador de C es GCC.") - # Opciones para GCC: - add_compile_options(-static-libgcc) - add_compile_options(-std=gnu99) - add_compile_options(-O3) + # Opciones para GCC: + add_compile_options(-static-libgcc) + add_compile_options(-std=gnu99) + add_compile_options(-O3) - # Compilar el scanner con Flex: - add_custom_command( - OUTPUT ../src/frontend/lexical-analysis/flex-scanner.c - COMMAND flex -o ../src/frontend/lexical-analysis/flex-scanner.c ../src/frontend/lexical-analysis/flex-patterns.l - DEPENDS ../src/frontend/syntactic-analysis/bison-parser.c ../src/frontend/syntactic-analysis/bison-parser.h) - # COMMAND flex --debug -o ../src/frontend/lexical-analysis/flex-scanner.c ../src/frontend/lexical-analysis/flex-patterns.l + # Compilar el scanner con Flex: + add_custom_command( + OUTPUT ../src/frontend/lexical-analysis/flex-scanner.c + COMMAND flex -o ../src/frontend/lexical-analysis/flex-scanner.c ../src/frontend/lexical-analysis/flex-patterns.l + DEPENDS ../src/frontend/syntactic-analysis/bison-parser.c ../src/frontend/syntactic-analysis/bison-parser.h) + # COMMAND flex --debug -o ../src/frontend/lexical-analysis/flex-scanner.c ../src/frontend/lexical-analysis/flex-patterns.l elseif (CMAKE_C_COMPILER_ID STREQUAL "MSVC") - message(NOTICE "El compilador de C es Microsoft Visual Studio.") + message(NOTICE "El compilador de C es Microsoft Visual Studio.") - # Opciones para MSVC: - # add_compile_options(...) + # Opciones para MSVC: + # add_compile_options(...) - # Compilar el scanner con Flex, usando compatibilidad con Microsoft Windows: - 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 - DEPENDS ../src/frontend/syntactic-analysis/bison-parser.c ../src/frontend/syntactic-analysis/bison-parser.h) + # Compilar el scanner con Flex, usando compatibilidad con Microsoft Windows: + 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 + DEPENDS ../src/frontend/syntactic-analysis/bison-parser.c ../src/frontend/syntactic-analysis/bison-parser.h) else () - message(NOTICE "El compilador de C es desconocido.") - message(NOTICE "No se generará el scanner con Flex.") + message(NOTICE "El compilador de C es desconocido.") + message(NOTICE "No se generará el scanner con Flex.") endif () # Especificar punto de entrada del proyecto y códigos fuente (extensión *.c): add_executable(Compiler - src/main.c - src/backend/code-generation/generator.c - src/backend/domain-specific/calculator.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) + src/main.c + src/backend/code-generation/generator.c + src/backend/domain-specific/calculator.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) # Linkear el proyecto y sus librerías: target_link_libraries(Compiler) diff --git a/src/backend/code-generation/generator.c b/src/backend/code-generation/generator.c index e9c5e0f..ac6c963 100644 --- a/src/backend/code-generation/generator.c +++ b/src/backend/code-generation/generator.c @@ -6,5 +6,5 @@ */ void Generator(int result) { - LogInfo("El resultado de la expresion computada es: '%d'.", result); + LogInfo("El resultado de la expresion computada es: '%d'.", result); } diff --git a/src/backend/domain-specific/calculator.c b/src/backend/domain-specific/calculator.c index f8a86b6..a64369e 100644 --- a/src/backend/domain-specific/calculator.c +++ b/src/backend/domain-specific/calculator.c @@ -5,17 +5,17 @@ */ int Add(const int leftAddend, const int rightAddend) { - return leftAddend + rightAddend; + return leftAddend + rightAddend; } int Subtract(const int minuend, const int subtract) { - return minuend - subtract; + return minuend - subtract; } int Multiply(const int multiplicand, const int multiplier) { - return multiplicand * multiplier; + return multiplicand * multiplier; } int Divide(const int dividend, const int divisor) { - return dividend / divisor; + return dividend / divisor; } diff --git a/src/backend/support/logger.c b/src/backend/support/logger.c index 7300966..eb65ffc 100644 --- a/src/backend/support/logger.c +++ b/src/backend/support/logger.c @@ -7,35 +7,35 @@ */ void Log(FILE * const stream, const char * prefix, const char * const format, const char * suffix, va_list arguments) { - fprintf(stream, "%s", prefix); - vfprintf(stream, format, arguments); - fprintf(stream, "%s", suffix); + fprintf(stream, "%s", prefix); + vfprintf(stream, format, arguments); + fprintf(stream, "%s", suffix); } void LogDebug(const char * const format, ...) { - va_list arguments; - va_start(arguments, format); - Log(stdout, "[DEBUG] ", format, "\n", arguments); - va_end(arguments); + va_list arguments; + va_start(arguments, format); + Log(stdout, "[DEBUG] ", format, "\n", arguments); + va_end(arguments); } void LogError(const char * const format, ...) { - va_list arguments; - va_start(arguments, format); - Log(stderr, "[ERROR] ", format, "\n", arguments); - va_end(arguments); + va_list arguments; + va_start(arguments, format); + Log(stderr, "[ERROR] ", format, "\n", arguments); + va_end(arguments); } void LogErrorRaw(const char * const format, ...) { - va_list arguments; - va_start(arguments, format); - Log(stderr, "", format, "", arguments); - va_end(arguments); + va_list arguments; + va_start(arguments, format); + Log(stderr, "", format, "", arguments); + va_end(arguments); } void LogInfo(const char * const format, ...) { - va_list arguments; - va_start(arguments, format); - Log(stdout, "[INFO ] ", format, "\n", arguments); - va_end(arguments); + va_list arguments; + va_start(arguments, format); + Log(stdout, "[INFO ] ", format, "\n", arguments); + va_end(arguments); } diff --git a/src/backend/support/shared.h b/src/backend/support/shared.h index 8dae725..bd19c26 100644 --- a/src/backend/support/shared.h +++ b/src/backend/support/shared.h @@ -29,23 +29,23 @@ extern int yyparse(void); // Emular tipo "boolean". typedef enum { - false = 0, - true = 1 + false = 0, + true = 1 } boolean; // Estado global de toda la aplicación. typedef struct { - // Indica si la compilación tuvo problemas hasta el momento: - boolean succeed; + // Indica si la compilación tuvo problemas hasta el momento: + boolean succeed; - // Indica el resultado de la compilación: - int result; + // Indica el resultado de la compilación: + int result; - // Agregar una pila para almacenar tokens/nodos. - // Agregar un nodo hacia la raíz del árbol de sintaxis abstracta. - // Agregar una tabla de símbolos. - // ... + // Agregar una pila para almacenar tokens/nodos. + // Agregar un nodo hacia la raíz del árbol de sintaxis abstracta. + // Agregar una tabla de símbolos. + // ... } CompilerState; diff --git a/src/frontend/lexical-analysis/flex-actions.c b/src/frontend/lexical-analysis/flex-actions.c index 83b3f2d..c2edd4c 100644 --- a/src/frontend/lexical-analysis/flex-actions.c +++ b/src/frontend/lexical-analysis/flex-actions.c @@ -7,32 +7,32 @@ */ TokenID IntegerPatternAction(const char * lexeme) { - // LogDebug("IntegerPatternAction: '%s'.", lexeme); - yylval = atoi(lexeme); - return INTEGER; + // LogDebug("IntegerPatternAction: '%s'.", lexeme); + yylval = atoi(lexeme); + return INTEGER; } TokenID DoublePatternAction(const char * lexeme) { - // LogDebug("DoublePatternAction: '%s'.", lexeme); - yylval = atof(lexeme); - return DOUBLE; + // LogDebug("DoublePatternAction: '%s'.", lexeme); + yylval = atof(lexeme); + return DOUBLE; } TokenID StringPatternAction(const char * lexeme) { - // LogDebug("StringPatternAction: '%s'.", lexeme); - return STRING; + // LogDebug("StringPatternAction: '%s'.", lexeme); + return STRING; } TokenID EscapeStringPatternAction(const char * lexeme) { - // LogDebug("EscapeStringPatternAction: '%s'.", lexeme); - return ESCAPESTRING; + // LogDebug("EscapeStringPatternAction: '%s'.", lexeme); + return ESCAPESTRING; } void IgnoredPatternAction(const char * lexeme) { - // LogDebug("IgnoredPatternAction: '%s'.", lexeme); + // LogDebug("IgnoredPatternAction: '%s'.", lexeme); } TokenID UnknownPatternAction(const char * lexeme) { - LogDebug("UnknownPatternAction: '%s'.", lexeme); - return YYUNDEF; + LogDebug("UnknownPatternAction: '%s'.", lexeme); + return YYUNDEF; } diff --git a/src/frontend/lexical-analysis/flex-actions.h b/src/frontend/lexical-analysis/flex-actions.h index 7cca08e..5ba3e43 100644 --- a/src/frontend/lexical-analysis/flex-actions.h +++ b/src/frontend/lexical-analysis/flex-actions.h @@ -8,69 +8,69 @@ */ typedef enum TokenID { - // Por defecto, el valor "0" hace fallar el analizador sintáctico. - UNKNOWN = 0, + // Por defecto, el valor "0" hace fallar el analizador sintáctico. + UNKNOWN = 0, - // Código de error de Bison, que permite abortar el escaneo de lexemas cuando - // se presente un patrón desconocido. El número "257" coincide con el valor - // que Bison le otorga por defecto, pero además permite que el resto de - // tokens continúen desde el valor "258" lo que permite proteger los IDs - // internos que Bison reserva para crear "tokens literales": - YYUNDEF = 257, - - ADD, - SUB, - MUL, - DIV, - POW, - FUNCTION, - IF, - ELSE, - FOR, - WHILE, - PRINT, - SEMICOLON, - COMPOSITE, - SQUOTE, - DERIVATIVE, - INTEGRATE, - BETWEEN, - AND_INT, - EVALUATE, - IN, - OPEN_BRACES, - OPEN_BRACKETS, - CLOSE_BRACES, - CLOSE_BRACKETS, - OPEN_PARENTHESIS, - CLOSE_PARENTHESIS, - ASSIGN, - EQUAL, - AND, - OR, - NOT, - ADD_ASSIGN, - INCREMENT, - SUB_ASSIGN, - DECREMENT, - MUL_ASSIGN, - DIV_ASSIGN, - DQUOTE, - COMMA, - COLON, - LESSER, - LESSER_EQUAL, - GREATER, - GREATER_EQUAL, - NOT_EQUAL, - VAR, - ERR, - TAYLOR, - ESCAPESTRING, - PRINTCSV, - DOUBLE, - INTEGER, - STRING + // Código de error de Bison, que permite abortar el escaneo de lexemas cuando + // se presente un patrón desconocido. El número "257" coincide con el valor + // que Bison le otorga por defecto, pero además permite que el resto de + // tokens continúen desde el valor "258" lo que permite proteger los IDs + // internos que Bison reserva para crear "tokens literales": + YYUNDEF = 257, + + ADD, + SUB, + MUL, + DIV, + POW, + FUNCTION, + IF, + ELSE, + FOR, + WHILE, + PRINT, + SEMICOLON, + COMPOSITE, + SQUOTE, + DERIVATIVE, + INTEGRATE, + BETWEEN, + AND_INT, + EVALUATE, + IN, + OPEN_BRACES, + OPEN_BRACKETS, + CLOSE_BRACES, + CLOSE_BRACKETS, + OPEN_PARENTHESIS, + CLOSE_PARENTHESIS, + ASSIGN, + EQUAL, + AND, + OR, + NOT, + ADD_ASSIGN, + INCREMENT, + SUB_ASSIGN, + DECREMENT, + MUL_ASSIGN, + DIV_ASSIGN, + DQUOTE, + COMMA, + COLON, + LESSER, + LESSER_EQUAL, + GREATER, + GREATER_EQUAL, + NOT_EQUAL, + VAR, + ERR, + TAYLOR, + ESCAPESTRING, + PRINTCSV, + DOUBLE, + INTEGER, + STRING } TokenID; /** diff --git a/src/frontend/syntactic-analysis/bison-actions.c b/src/frontend/syntactic-analysis/bison-actions.c index f842c11..c3f43b8 100644 --- a/src/frontend/syntactic-analysis/bison-actions.c +++ b/src/frontend/syntactic-analysis/bison-actions.c @@ -9,59 +9,59 @@ */ void yyerror(const char * string) { - LogError("Mensaje: '%s' debido a '%s' (linea %d).", string, yytext, yylineno); - // LogError("En ASCII es:"); - // LogErrorRaw("\t"); - // const int length = strlen(yytext); - // for (int i = 0; i < length; ++i) { - // LogErrorRaw("[%d]", yytext[i]); - // } - // LogErrorRaw("\n\n"); + LogError("Mensaje: '%s' debido a '%s' (linea %d).", string, yytext, yylineno); + // LogError("En ASCII es:"); + // LogErrorRaw("\t"); + // const int length = strlen(yytext); + // for (int i = 0; i < length; ++i) { + // LogErrorRaw("[%d]", yytext[i]); + // } + // LogErrorRaw("\n\n"); } int ProgramGrammarAction(const int value) { - // LogDebug("ProgramGrammarAction(%d)", value); - state.succeed = true; - state.result = value; - return value; + // LogDebug("ProgramGrammarAction(%d)", value); + state.succeed = true; + state.result = value; + return value; } int AdditionExpressionGrammarAction(const int leftValue, const int rightValue) { - LogDebug("AdditionExpressionGrammarAction(%d, %d)", leftValue, rightValue); - return Add(leftValue, rightValue); + LogDebug("AdditionExpressionGrammarAction(%d, %d)", leftValue, rightValue); + return Add(leftValue, rightValue); } int SubtractionExpressionGrammarAction(const int leftValue, const int rightValue) { - LogDebug("SubtractionExpressionGrammarAction(%d, %d)", leftValue, rightValue); - return Subtract(leftValue, rightValue); + LogDebug("SubtractionExpressionGrammarAction(%d, %d)", leftValue, rightValue); + return Subtract(leftValue, rightValue); } int MultiplicationExpressionGrammarAction(const int leftValue, const int rightValue) { - LogDebug("MultiplicationExpressionGrammarAction(%d, %d)", leftValue, rightValue); - return Multiply(leftValue, rightValue); + LogDebug("MultiplicationExpressionGrammarAction(%d, %d)", leftValue, rightValue); + return Multiply(leftValue, rightValue); } int DivisionExpressionGrammarAction(const int leftValue, const int rightValue) { - LogDebug("DivisionExpressionGrammarAction(%d, %d)", leftValue, rightValue); - return Divide(leftValue, rightValue); + LogDebug("DivisionExpressionGrammarAction(%d, %d)", leftValue, rightValue); + return Divide(leftValue, rightValue); } int FactorExpressionGrammarAction(const int value) { - LogDebug("FactorExpressionGrammarAction(%d)", value); - return value; + LogDebug("FactorExpressionGrammarAction(%d)", value); + return value; } int ExpressionFactorGrammarAction(const int value) { - LogDebug("ExpressionFactorGrammarAction(%d)", value); - return value; + LogDebug("ExpressionFactorGrammarAction(%d)", value); + return value; } int ConstantFactorGrammarAction(const int value) { - LogDebug("ConstantFactorGrammarAction(%d)", value); - return value; + LogDebug("ConstantFactorGrammarAction(%d)", value); + return value; } int IntegerConstantGrammarAction(const int value) { - LogDebug("IntegerConstantGrammarAction(%d)", value); - return value; + LogDebug("IntegerConstantGrammarAction(%d)", value); + return value; } diff --git a/src/frontend/syntactic-analysis/bison-grammar.y b/src/frontend/syntactic-analysis/bison-grammar.y index 5a5b518..87a5d9d 100644 --- a/src/frontend/syntactic-analysis/bison-grammar.y +++ b/src/frontend/syntactic-analysis/bison-grammar.y @@ -69,198 +69,185 @@ %% program: statements { $$ = ProgramGrammarAction($1); } - ; + ; statement: evaluate SEMICOLON - | integrate SEMICOLON - | derivative SEMICOLON - | declare_function SEMICOLON - | if_statement - | ifelse_statement - | for_statement - | while_statement - | printCSV SEMICOLON - | print SEMICOLON - | declare_variable SEMICOLON - | assign_variable SEMICOLON - ; + | integrate SEMICOLON + | derivative SEMICOLON + | declare_function SEMICOLON + | if_statement + | ifelse_statement + | for_statement + | while_statement + | printCSV SEMICOLON + | print SEMICOLON + | declare_variable SEMICOLON + | assign_variable SEMICOLON + ; expression: positive_constant - | evaluate - | integrate - | derivative - | STRING - | expression ADD expression - | expression SUB expression - | expression MUL expression - | expression DIV expression - | expression POW expression - | OPEN_PARENTHESIS expression CLOSE_PARENTHESIS - | SUB expression - ; + | evaluate + | integrate + | derivative + | STRING + | expression ADD expression + | expression SUB expression + | expression MUL expression + | expression DIV expression + | expression POW expression + | OPEN_PARENTHESIS expression CLOSE_PARENTHESIS + | SUB expression + ; domain: expression LESSER expression - | expression LESSER_EQUAL expression - | expression GREATER expression - | expression GREATER_EQUAL expression - | expression EQUAL expression - | expression NOT_EQUAL expression - | expression LESSER expression LESSER expression - | expression LESSER_EQUAL expression LESSER expression - | expression LESSER expression LESSER_EQUAL expression - | expression LESSER_EQUAL expression LESSER_EQUAL expression - ; + | expression LESSER_EQUAL expression + | expression GREATER expression + | expression GREATER_EQUAL expression + | expression EQUAL expression + | expression NOT_EQUAL expression + | expression LESSER expression LESSER expression + | expression LESSER_EQUAL expression LESSER expression + | expression LESSER expression LESSER_EQUAL expression + | expression LESSER_EQUAL expression LESSER_EQUAL expression + ; boolean: expression LESSER expression - | expression LESSER_EQUAL expression - | expression GREATER expression - | expression GREATER_EQUAL expression - | expression EQUAL expression - | expression NOT_EQUAL expression - | boolean OR boolean - | boolean AND boolean - | OPEN_PARENTHESIS boolean CLOSE_PARENTHESIS - | NOT boolean - ; + | expression LESSER_EQUAL expression + | expression GREATER expression + | expression GREATER_EQUAL expression + | expression EQUAL expression + | expression NOT_EQUAL expression + | boolean OR boolean + | boolean AND boolean + | OPEN_PARENTHESIS boolean CLOSE_PARENTHESIS + | NOT boolean + ; positive_constant: DOUBLE - | INTEGER - ; + | INTEGER + ; declare_function: FUNCTION STRING ASSIGN function - | FUNCTION STRING ASSIGN OPEN_BRACES functions CLOSE_BRACES - ; + | FUNCTION STRING ASSIGN OPEN_BRACES functions CLOSE_BRACES + ; function: expression - | expression COLON domain - | composite - | taylor - ; + | expression COLON domain + | composite + | taylor + ; functions: function - | function COMMA functions - ; + | function COMMA functions + ; composite: STRING COMPOSITE STRING - | composite COMPOSITE STRING - ; + | composite COMPOSITE STRING + ; expressions: expression - | expression COMMA expressions - ; + | expression COMMA expressions + ; strings: STRING - | STRING COMMA strings - ; + | STRING COMMA strings + ; numArray: OPEN_BRACKETS expressions CLOSE_BRACKETS - ; + ; numArrays: numArray - | numArray COMMA numArrays - ; + | numArray COMMA numArrays + ; arrayNumArray: OPEN_BRACKETS numArrays CLOSE_BRACKETS - ; + ; stringArray: OPEN_BRACKETS strings CLOSE_BRACKETS - ; - + ; + escapeString: ESCAPESTRING - | ESCAPESTRING ADD escapeString - ; + | ESCAPESTRING ADD escapeString + ; escapeStrings: escapeString - | escapeString COMMA escapeStrings - ; + | escapeString COMMA escapeStrings + ; escapeStringArray: OPEN_BRACKETS escapeStrings CLOSE_BRACKETS - ; + ; evaluate: EVALUATE STRING IN OPEN_PARENTHESIS expression CLOSE_PARENTHESIS - | EVALUATE STRING IN numArray - | STRING OPEN_PARENTHESIS expression CLOSE_PARENTHESIS - | EVALUATE stringArray IN OPEN_PARENTHESIS expression CLOSE_PARENTHESIS - | EVALUATE stringArray IN numArray - | stringArray OPEN_PARENTHESIS expression CLOSE_PARENTHESIS - ; + | EVALUATE STRING IN numArray + | STRING OPEN_PARENTHESIS expression CLOSE_PARENTHESIS + | EVALUATE stringArray IN OPEN_PARENTHESIS expression CLOSE_PARENTHESIS + | EVALUATE stringArray IN numArray + | stringArray OPEN_PARENTHESIS expression CLOSE_PARENTHESIS + ; integrate: INTEGRATE STRING BETWEEN OPEN_PARENTHESIS expression AND_INT expression CLOSE_PARENTHESIS - | INTEGRATE STRING OPEN_PARENTHESIS expression AND_INT expression CLOSE_PARENTHESIS - | INTEGRATE stringArray BETWEEN OPEN_PARENTHESIS expression AND_INT expression CLOSE_PARENTHESIS - | INTEGRATE stringArray OPEN_PARENTHESIS expression AND_INT expression CLOSE_PARENTHESIS - | integrate ERR positive_constant - ; + | INTEGRATE STRING OPEN_PARENTHESIS expression AND_INT expression CLOSE_PARENTHESIS + | INTEGRATE stringArray BETWEEN OPEN_PARENTHESIS expression AND_INT expression CLOSE_PARENTHESIS + | INTEGRATE stringArray OPEN_PARENTHESIS expression AND_INT expression CLOSE_PARENTHESIS + | integrate ERR positive_constant + ; squotes: SQUOTE - | SQUOTE squotes - ; + | SQUOTE squotes + ; print: PRINT OPEN_PARENTHESIS expression CLOSE_PARENTHESIS - | PRINT OPEN_PARENTHESIS escapeString CLOSE_PARENTHESIS - ; + | PRINT OPEN_PARENTHESIS escapeString CLOSE_PARENTHESIS + ; statements: statement - | statement statements - ; + | statement statements + ; derivative: DERIVATIVE STRING IN OPEN_PARENTHESIS expression CLOSE_PARENTHESIS - | DERIVATIVE INTEGER STRING IN OPEN_PARENTHESIS expression CLOSE_PARENTHESIS - | STRING squotes OPEN_PARENTHESIS expression CLOSE_PARENTHESIS - | DERIVATIVE stringArray IN OPEN_PARENTHESIS expression CLOSE_PARENTHESIS - | DERIVATIVE INTEGER stringArray IN OPEN_PARENTHESIS expression CLOSE_PARENTHESIS - | stringArray squotes OPEN_PARENTHESIS expression CLOSE_PARENTHESIS - | derivative ERR positive_constant - ; + | DERIVATIVE INTEGER STRING IN OPEN_PARENTHESIS expression CLOSE_PARENTHESIS + | STRING squotes OPEN_PARENTHESIS expression CLOSE_PARENTHESIS + | DERIVATIVE stringArray IN OPEN_PARENTHESIS expression CLOSE_PARENTHESIS + | DERIVATIVE INTEGER stringArray IN OPEN_PARENTHESIS expression CLOSE_PARENTHESIS + | stringArray squotes OPEN_PARENTHESIS expression CLOSE_PARENTHESIS + | derivative ERR positive_constant + ; if_statement: IF OPEN_PARENTHESIS boolean CLOSE_PARENTHESIS OPEN_BRACKETS statements CLOSE_BRACKETS - | IF OPEN_PARENTHESIS boolean CLOSE_PARENTHESIS statement - ; + | IF OPEN_PARENTHESIS boolean CLOSE_PARENTHESIS statement + ; ifelse_statement: if_statement ELSE OPEN_BRACKETS statements CLOSE_BRACKETS - | ELSE statement - ; + | ELSE statement + ; for_statement: FOR OPEN_PARENTHESIS declare_variable SEMICOLON boolean SEMICOLON assign_variable CLOSE_PARENTHESIS OPEN_BRACKETS statements CLOSE_BRACKETS - | FOR OPEN_PARENTHESIS SEMICOLON boolean SEMICOLON assign_variable CLOSE_PARENTHESIS OPEN_BRACKETS statements CLOSE_BRACKETS - | FOR OPEN_PARENTHESIS declare_variable SEMICOLON boolean SEMICOLON assign_variable CLOSE_PARENTHESIS statement - | FOR OPEN_PARENTHESIS SEMICOLON boolean SEMICOLON assign_variable CLOSE_PARENTHESIS statement - ; + | FOR OPEN_PARENTHESIS SEMICOLON boolean SEMICOLON assign_variable CLOSE_PARENTHESIS OPEN_BRACKETS statements CLOSE_BRACKETS + | FOR OPEN_PARENTHESIS declare_variable SEMICOLON boolean SEMICOLON assign_variable CLOSE_PARENTHESIS statement + | FOR OPEN_PARENTHESIS SEMICOLON boolean SEMICOLON assign_variable CLOSE_PARENTHESIS statement + ; taylor: TAYLOR INTEGER STRING - ; + ; while_statement: WHILE OPEN_PARENTHESIS boolean CLOSE_PARENTHESIS OPEN_BRACKETS statements CLOSE_BRACKETS - | WHILE OPEN_PARENTHESIS boolean CLOSE_PARENTHESIS statement - ; + | WHILE OPEN_PARENTHESIS boolean CLOSE_PARENTHESIS statement + ; declare_variable: VAR STRING - | declare_variable ASSIGN expression - ; + | declare_variable ASSIGN expression + ; printCSV: PRINTCSV OPEN_PARENTHESIS escapeStringArray COMMA arrayNumArray COMMA escapeString CLOSE_PARENTHESIS - ; - -/* expression: positive_constant - | evaluate - | integrate - | derivative - | expression ADD expression - | expression DIV expression - | expression SUB expression - | expression POW expression - | expression MUL expression - | SUB expression - | OPEN_PARENTHESIS expression CLOSE_PARENTHESIS - ; */ + ; assign_variable: STRING ADD_ASSIGN expression - | STRING SUB_ASSIGN expression - | STRING MUL_ASSIGN expression - | STRING DIV_ASSIGN expression - | STRING INCREMENT - | STRING DECREMENT - | STRING ASSIGN expression - ; - + | STRING SUB_ASSIGN expression + | STRING MUL_ASSIGN expression + | STRING DIV_ASSIGN expression + | STRING INCREMENT + | STRING DECREMENT + | STRING ASSIGN expression + ; + %% diff --git a/src/main.c b/src/main.c index 2fc7882..cebd215 100644 --- a/src/main.c +++ b/src/main.c @@ -10,42 +10,42 @@ CompilerState state; // Punto de entrada principal del compilador. const int main(const int argumentCount, const char ** arguments) { - // #ifdef YYDEBUG - // yydebug = 1; - // #endif + // #ifdef YYDEBUG + // yydebug = 1; + // #endif - // Inicializar estado de la aplicación. - state.result = 0; - state.succeed = false; + // Inicializar estado de la aplicación. + state.result = 0; + state.succeed = false; - // Mostrar parámetros recibidos por consola. - for (int i = 0; i < argumentCount; ++i) { - LogInfo("Argumento %d: '%s'", i, arguments[i]); - } + // Mostrar parámetros recibidos por consola. + for (int i = 0; i < argumentCount; ++i) { + LogInfo("Argumento %d: '%s'", i, arguments[i]); + } - // Compilar el programa de entrada. - LogInfo("Compilando...\n"); - const int result = yyparse(); - switch (result) { - case 0: - if (state.succeed) { - LogInfo("La compilacion fue exitosa."); - // Generator(state.result); - } - else { - LogError("Se produjo un error en la aplicacion."); - return -1; - } - break; - case 1: - LogError("Bison finalizo debido a un error de sintaxis."); - break; - case 2: - LogError("Bison finalizo abruptamente debido a que ya no hay memoria disponible."); - break; - default: - LogError("Error desconocido mientras se ejecutaba el analizador Bison (codigo %d).", result); - } - LogInfo("Fin."); - return result; + // Compilar el programa de entrada. + LogInfo("Compilando...\n"); + const int result = yyparse(); + switch (result) { + case 0: + if (state.succeed) { + LogInfo("La compilacion fue exitosa."); + // Generator(state.result); + } + else { + LogError("Se produjo un error en la aplicacion."); + return -1; + } + break; + case 1: + LogError("Bison finalizo debido a un error de sintaxis."); + break; + case 2: + LogError("Bison finalizo abruptamente debido a que ya no hay memoria disponible."); + break; + default: + LogError("Error desconocido mientras se ejecutaba el analizador Bison (codigo %d).", result); + } + LogInfo("Fin."); + return result; }