Programma LexYacc Help

di il
16 risposte

16 Risposte - Pagina 2

  • Re: Programma LexYacc Help

    Comunque la grammatica che hai descritto e' molto approssimativa.
    Hai inserito troppe funzionalita' senza una logica decente.

    a AND b OR c

    come la interpreti?

    (a AND b) OR c

    oppure

    a AND (b OR c)

    ???
    A dire il vero è un caso che non ho preso in esame.
    Ovvero il mio intento era che non ci potesse essere "a AND b OR c", ma che le uniche possibilità fossero: "a AND b" oppure "a OR b". Dove "a" e "b" potessero essere espressioni matematiche ma non logiche.
    Per quanto rigurada i nomi ai ragione per ti elenco brevemente cosa intendevo:
    ISTR=ISTRUZIONE
    STMT=STATMENT
    INC=INCREMENTO
    DEC=DECREMENTO
    COND=CONDIZIONE
    OP=OPERATORE
    OPL=OPERATORE LOGICO
    LT= "<"
    GT= ">"
    LE= "<="
    GT= ">="
    NE= "!="
    EQ= "=="
  • Re: Programma LexYacc Help

    Ho cercato di aggiustare un pò meglio il file Yacc in modo da renderlo più comprensibile (ovviamente ancora manca tutta l'analisi semantica).
    Potete dirmi che genere di errori ci sono?

    File Yacc:
    
    %{
    #include<stdio.h>
    #include<stdlib.h>
    #include"lex.yy.c"
    %}
    %token digit N M I LT GT EQ LE GE NE AND OR INCREMENTO DECREMENTO FINE
    %left '+''-'
    %left '*''/'
    %right '^'
    %right '='
    %nonassoc UMINUS 
    %nonassoc WHILE
    %left GE NE LT GT LE EQ
    %left AND OR
    %%
    S:STMT FINE  {printf("\nCorretto\n");return(0);}
    
    STMT:WHILE'('COND')''{'ISTR'}'
    
    ISTR:C             
                           ;               
    COND:B AND B       
        |B OR B               
        |B                      
                           ;      
    B:C OP C      
        |C
                           ; 
    C:N'='C   
        |M'='C   
        |I'='C   
        |C'+'C              
        |C'-'C              
        |C'*'C              
        |C'/'C        
        |C'^'C              
        |'('C')'             
        |'-'C %prec UMINUS  
        |M                  
        |N                   
        |I                    
        |digit              
        |M INCREMENTO
        |N INCREMENTO
        |I INCREMENTO
        |M DECREMENTO
        |N DECREMENTO
        |I DECREMENTO
                           ;
    OP:LT 
        |GT
        |EQ
        |LE
        |GE
        |NE
                           ;
    %%
    int main()
    {
    yyparse();
    yylex();
    return FINE;
    }
    yyerror(char *s)
    {
    printf("\nError");
    }
    
    File Lex:
    
    %{
    #include "y.tab.h"
    %}
    %%
    "while" {return WHILE;}
    "&&" {return AND;}
    "||" {return OR;}
    "<=" {return LE;}
    ">=" {return GE;}
    ">" {return GT;}
    "<" {return LT;}
    "!=" {return NE;}
    "++" {return INCREMENTO;}
    "--" {return DECREMENTO;}
    "==" {return EQ;}
    [0-9]+ {yylval=yytext[0]; return (digit);}
    "m" {return M;}
    "n" {return N;}
    "i" {return I;}
    [\t];
    [\n];
    "$" {return FINE;}
    . {return yytext[0];}
    %% 
    
    Grazie di nuovo.
Devi accedere o registrarti per scrivere nel forum
16 risposte