Syntax error in JISON with simple grammar

97 views Asked by At

I'm trying to implement a very simple parser, but I'm having a problem. I have the following grammar:

%lex

%options flex case-insensitive

CaracterEscape              [\'\"\\bfnrtv]
Escape                      \\{CaracterEscape}
CaracterCadena              [^\"\\]+
CadenaDoble                 ({Escape}|{CaracterCadena})
LiteralCadena               \"{CadenaDoble}*\"
CaracterChar                [^\'\\]
CadenaSimple                {Escape}|{CaracterChar}
LiteralChar                 \'{CadenaSimple}\'

%%

\s+                                     {}                               
"//".*                                  {}
[/][*][^*]*[*]+([^/*][^*]*[*]+)*[/]     {}

"+"                         return 'A_MAS';
"-"                         return 'A_MENOS';
"*"                         return 'A_MULTI';
"/"                         return 'A_DIV';
"**"                        return 'A_POTENCIA';
"%"                         return 'A_MOD';

"++"                        return 'O_INCREMENTO';
"--"                        return 'O_DECREMENTO';

"="                         return 'O_ASIGNACION';

"<"                         return 'R_MENOR_QUE';
">"                         return 'R_MAYOR_QUE';
"<="                        return 'R_MENOR_IGUAL';
">="                        return 'R_MAYOR_IGUAL';
"=="                        return 'R_IGUAL';
"!="                        return 'R_DIFERENTE';

"||"                        return 'L_OR';
"&&"                        return 'L_AND';
"^"                         return 'L_XOR';
"!"                         return 'L_NOT';

","                         return 'S_COMA';
";"                         return 'S_PUNTO_COMA';
":"                         return 'S_DOS_PUNTOS';
"("                         return 'S_PAR_APERTURA';
")"                         return 'S_PAR_CIERRE';
"{"                         return 'S_LLAVE_APERTURA';
"}"                         return 'S_LLAVE_CIERRE';

"int"                       return 'T_INT';
"double"                    return 'T_DOUBLE';
"char"                      return 'T_CHAR';
"boolean"                   return 'T_BOOLEAN';
"string"                    return 'T_STRING';

"if"                        return 'I_IF';
"else"                      return 'I_ELSE';
"switch"                    return 'I_SWITCH';
"case"                      return 'I_CASE';
"default"                   return 'I_DEFAULT';
"break"                     return 'I_BREAK';
"for"                       return 'I_FOR';
"while"                     return 'I_WHILE';
"do"                        return 'I_DO_WHILE';
"continue"                  return 'I_CONTINUE';

"void"                      return 'P_VOID';
"const"                     return 'P_CONSTANTE';

"call"                      return 'F_CALL';
"return"                    return 'F_RETURN';
"print"                     return 'F_PRINT';
"println"                   return 'F_PRINTLN';
"typeof"                    return 'F_TYPEOF';

[0-9]+\b                    return 'ENTERO';
[0-9]+("."[0-9]+)?\b        return 'DECIMAL';
{LiteralChar}               return 'CARACTER';
{LiteralCadena}             return 'CADENA';
                            
("true"|"false")            return 'BOOLEANO';

[a-zA-Z_][a-zA-Z0-9_]*      return 'ID';

<<EOF>>                     return 'EOF';

.                           {
                                console.error(`Error lexico: ${yytext}, en:\nlinea: ${yylloc.first_line}, columna: ${yylloc.first_column + 1}`);
                            }

/lex

%{
%}

%left           'L_OR'
%left           'L_AND'
%left           'L_XOR'
%nonassoc       'R_MENOR_QUE' 'R_MAYOR_QUE' 'R_MENOR_IGUAL' 'R_MAYOR_IGUAL' 'R_IGUAL' 'R_DIFERENTE'
%left           'R_IGUAL' 'R_DIFERENTE'
%left           'R_MAYOR_QUE' 'R_MENOR_QUE' 'R_MAYOR_IGUAL' 'R_MENOR_IGUAL'
%left           'A_MAS' 'A_MENOS'
%left           'A_MULTI' 'A_DIV' 'A_MOD'
%right          'A_POTENCIA'
%right          'UMINUS' 'L_NOT'
%right          'O_INCREMENTO' 'O_DECREMENTO'
//%right          'S_PAR_APERTURA'

%start axioma

%%

axioma          :           S_LLAVE_APERTURA instrucciones S_LLAVE_CIERRE  EOF {                                
                            };

instrucciones   :           instrucciones instruccion {
                     
                                }
                            }
                |           instruccion {
                         
                            };

instruccion     :           asignacion fin_instr {
                     
                            }                
                |           call func {
}
                            }
                |           error {
                                console.log(`Error sintactico en: linea ${@1.first_line}, columna ${@1.first_column} `);
                            };


expresion       :           expresion A_MAS expresion {                                
                     
                            }
                |           expresion A_MENOS expresion {
                     
                            }
                |           expresion A_MULTI expresion {
                     
                            }
                |           expresion A_DIV expresion {
                     
                            }
                |           expresion A_POTENCIA expresion {
                     
                            }
                |           expresion A_MOD expresion {
                     
                            }
                |           A_MENOS expresion %prec UMINUS {
                     
                            }
                |           expresion R_MENOR_QUE expresion {
                     
                            }
                |           expresion R_MAYOR_QUE expresion {
                     
                            }
                |           expresion R_MENOR_IGUAL expresion {
                     
                            }
                |           expresion R_MAYOR_IGUAL expresion {
                     
                            }
                |           expresion R_IGUAL expresion {
                     
                            }
                |           expresion R_DIFERENTE expresion {
                     
                            }
                |           expresion L_AND expresion {
                     
                            }
                |           expresion L_OR expresion {
                     
                            }
                |           expresion L_XOR expresion {
                     
                            }
                |           L_NOT expresion {                                
                     
                            }
                |           S_PAR_APERTURA expresion S_PAR_CIERRE {
                     
                            }
                |           ENTERO {
                     
                            }
                |           DECIMAL {
                     
                            }
                |           CARACTER {
                     
                            }
                |           CADENA {
                     
                            }
                |           BOOLEANO {                                
                     
                            }
                |           ID {
                     
                            };

asignacion      :           ID O_ASIGNACION expresion {
                     
                            }
                |           ID O_INCREMENTO {                                
                     
                            }
                |           ID O_DECREMENTO {                                
                     
                            };

lista_params    :           lista_params COMA expresion {
                     
                            }
                |           expresion {
                     
                            };

call_func       :           F_CALL ID S_PAR_APERTURA S_PAR_CIERRE {
                            }
                |           F_CALL ID S_PAR_APERTURA lista_params S_PAR_CIERRE {
};

fin_instr       :           S_PUNTO_COMA;

The grammar contains more productions but it is this part that is creating conflicts. The problem comes when trying to parse the following text:

{
    call add(2, 3)
}

JISON tells me that there was a syntactic error in '(', however the characters are provided by the lexical analyzer, so I think the problem may be the grammar but I really don't understand what the cause is. Any ideas?

The output is: Error sintactico en: linea 2, columna 18

0

There are 0 answers