cer-0 / 5cv14

Práctica de la materia de compiladores
0 stars 0 forks source link

La gramatica while() acepta condiciones anidadas (con espacios) #9

Closed DavidENicolasC closed 9 months ago

DavidENicolasC commented 9 months ago

Como se comentó, la gramática while() reconoce las condiciones anidadas.

Para el siguiente programa:

int a, b, y, c, w, u;
int xy, d, f, h, i, j, k, o, p, q;

y = 5;
a = 3 * y + 5;

while( ( a == 3 && ( 5 == 8 ) ) && 4 <= 9 || ( ( b == c ) || 7 == 0 ) )
{
    y = 8;
    a = 4;

    while( ( 5 == 7 ) || a != c )
    {
        w = 5 * u;
    }

    xy = 57;
    d = 8.2;
}

f = 3;

Se muestra solamente la derivación para la estructura while(), por simplicidad.

=> G
=> while(C){G}
=> while((C)){G}
=> while((CR)){G}
=> while((CR OL C)){G}
=> while((ID OR NE OL C)){G}
=> while((ID == NE OL C)){G}
=> while((ID == NE && C)){G}
=> while((ID == NE && (C))){G}
=> while((ID == NE && (CR))){G}
=> while((ID == NE && (NE OR NE)) OL C){G}
=> while((ID == NE && (NE == NE)) OL C){G}
=> while((ID == NE && (NE == NE)) && C)){G}
=> while((ID == NE && (NE == NE)) && CR){G}
=> while((ID == NE && (NE == NE)) && CR OL C){G}
=> while((ID == NE && (NE == NE)) && NE OR NE OL C){G}
=> while((ID == NE && (NE == NE)) && NE <= NE OL C){G}
=> while((ID == NE && (NE == NE)) && NE <= NE || C){G}
=> while((ID == NE && (NE == NE)) && NE <= NE || (C)){G}
=> while((ID == NE && (NE == NE)) && NE <= NE || ((C))){G}
=> while((ID == NE && (NE == NE)) && NE <= NE || ((CR))){G}
=> while((ID == NE && (NE == NE)) && NE <= NE || ((ID OR ID) OL C){G}
=> while((ID == NE && (NE == NE)) && NE <= NE || ((ID == ID) OL C){G}
=> while((ID == NE && (NE == NE)) && NE <= NE || ((ID == ID) || C){G}
=> while((ID == NE && (NE == NE)) && NE <= NE || ((ID == ID) || CR)){G}
=> while((ID == NE && (NE == NE)) && NE <= NE || ((ID == ID) || NE OR NE)){G}
=> while((ID == NE && (NE == NE)) && NE <= NE || ((ID == ID) || NE == NE)){G}
=> while((ID == NE && (NE == NE)) && NE <= NE || ((ID == ID) || NE == NE)){G
=> while((ID == NE && (NE == NE)) && NE <= NE || ((ID == ID) || NE == NE)){ID = S
=> while((ID == NE && (NE == NE)) && NE <= NE || ((ID == ID) || NE == NE)){ID = NE;
=> while((ID == NE && (NE == NE)) && NE <= NE || ((ID == ID) || NE == NE)){ID = NE;G
=> while((ID == NE && (NE == NE)) && NE <= NE || ((ID == ID) || NE == NE)){ID = NE;ID = S
=> while((ID == NE && (NE == NE)) && NE <= NE || ((ID == ID) || NE == NE)){ID = NE;ID = NE;
=> while((ID == NE && (NE == NE)) && NE <= NE || ((ID == ID) || NE == NE)){ID = NE;ID = NE;G
=> while((ID == NE && (NE == NE)) && NE <= NE || ((ID == ID) || NE == NE)){ID = NE;ID = NE;while(C){G}
=> while((ID == NE && (NE == NE)) && NE <= NE || ((ID == ID) || NE == NE)){ID = NE;ID = NE;while((C)){G}
=> while((ID == NE && (NE == NE)) && NE <= NE || ((ID == ID) || NE == NE)){ID = NE;ID = NE;while((CR)){G}
=> while((ID == NE && (NE == NE)) && NE <= NE || ((ID == ID) || NE == NE)){ID = NE;ID = NE;while((NE OR NE) OL C){G}
=> while((ID == NE && (NE == NE)) && NE <= NE || ((ID == ID) || NE == NE)){ID = NE;ID = NE;while((NE == NE) OL C){G}
=> while((ID == NE && (NE == NE)) && NE <= NE || ((ID == ID) || NE == NE)){ID = NE;ID = NE;while((NE == NE) || C){G}
=> while((ID == NE && (NE == NE)) && NE <= NE || ((ID == ID) || NE == NE)){ID = NE;ID = NE;while((NE == NE) || CR){G}
=> while((ID == NE && (NE == NE)) && NE <= NE || ((ID == ID) || NE == NE)){ID = NE;ID = NE;while((NE == NE) || ID OR ID){G}
=> while((ID == NE && (NE == NE)) && NE <= NE || ((ID == ID) || NE == NE)){ID = NE;ID = NE;while((NE == NE) || ID != ID){G}
=> while((ID == NE && (NE == NE)) && NE <= NE || ((ID == ID) || NE == NE)){ID = NE;ID = NE;while((NE == NE) || ID != ID){G
=> while((ID == NE && (NE == NE)) && NE <= NE || ((ID == ID) || NE == NE)){ID = NE;ID = NE;while((NE == NE) || ID != ID){ID = S
=> while((ID == NE && (NE == NE)) && NE <= NE || ((ID == ID) || NE == NE)){ID = NE;ID = NE;while((NE == NE) || ID != ID){ID = NE * S
=> while((ID == NE && (NE == NE)) && NE <= NE || ((ID == ID) || NE == NE)){ID = NE;ID = NE;while((NE == NE) || ID != ID){ID = NE * ID;
=> while((ID == NE && (NE == NE)) && NE <= NE || ((ID == ID) || NE == NE)){ID = NE;ID = NE;while((NE == NE) || ID != ID){ID = NE * ID;}
=> while((ID == NE && (NE == NE)) && NE <= NE || ((ID == ID) || NE == NE)){ID = NE;ID = NE;while((NE == NE) || ID != ID){ID = NE * ID;}G
=> while((ID == NE && (NE == NE)) && NE <= NE || ((ID == ID) || NE == NE)){ID = NE;ID = NE;while((NE == NE) || ID != ID){ID = NE * ID;}ID = S
=> while((ID == NE && (NE == NE)) && NE <= NE || ((ID == ID) || NE == NE)){ID = NE;ID = NE;while((NE == NE) || ID != ID){ID = NE * ID;}ID = NE;
=> while((ID == NE && (NE == NE)) && NE <= NE || ((ID == ID) || NE == NE)){ID = NE;ID = NE;while((NE == NE) || ID != ID){ID = NE * ID;}ID = NE;G        
=> while((ID == NE && (NE == NE)) && NE <= NE || ((ID == ID) || NE == NE)){ID = NE;ID = NE;while((NE == NE) || ID != ID){ID = NE * ID;}ID = NE;ID = S
=> while((ID == NE && (NE == NE)) && NE <= NE || ((ID == ID) || NE == NE)){ID = NE;ID = NE;while((NE == NE) || ID != ID){ID = NE * ID;}ID = NE;ID = ND; 
=> while((ID == NE && (NE == NE)) && NE <= NE || ((ID == ID) || NE == NE)){ID = NE;ID = NE;while((NE == NE) || ID != ID){ID = NE * ID;}ID = NE;ID = ND;}

Nota: Como se mencionó, la gramática while(), por el momento requiere que se escriban las expresiones condicionales con espacios entre los paréntesis, como en el ejemplo de arriba.

labard1ni commented 9 months ago

Hice algunas pruebas y el único error que encontré es cuando creas un while y no lo cierras con la segunda '}', lo muestra así:

=> G
=> while(C){G}
=> while(CR){G}
=> while(ID OR NE){G}
=> while(ID == NE){G}
=> while(ID == NE){G
=> while(ID == NE){ID = S
=> while(ID == NE){ID = NE;
=> while(ID == NE){ID = NE;G
=> while(ID == NE){ID = NE;ID = S
=> while(ID == NE){ID = NE;ID = NE;

El archivo fuente era:

while( a == 2 )
{
    y = 8;
    a = 4;

Y en cambio cuando lo que haces es no cerrar los parentesis, si imprime error sintáctico:

=> G
=> while(C){G}
=> while(CR){G}
Error Sintactico: Se esperaba un parentesis de cierre o una expresion logica