Convert tabs to spaces

Co-authored-by: Ezequiel Bellver <ebellver@itba.edu.ar>
Co-authored-by: Juan Barmasch <jbarmasch@itba.edu.ar>
This commit is contained in:
Santiago Lo Coco 2022-04-19 07:25:53 -03:00
parent ac68ed4224
commit b01b910188
10 changed files with 323 additions and 336 deletions

View File

@ -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)

View File

@ -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);
}

View File

@ -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;
}

View File

@ -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);
}

View File

@ -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;

View File

@ -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;
}

View File

@ -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;
/**

View File

@ -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;
}

View File

@ -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
;
%%

View File

@ -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;
}