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.