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:
parent
ac68ed4224
commit
b01b910188
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
/**
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
;
|
||||
|
||||
%%
|
||||
|
|
70
src/main.c
70
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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue