当我在 Ubuntu Linux 中运行此野牛代码时,我收到以下警告:
- shift/reduce conflict [-Wconflicts-sr]
- reduce/reduce conflicts [-Wcolficts-sr]
这是一个更清晰的屏幕截图:http: //i.imgur.com/iznzSsn.png
编辑:减少/减少错误在
line 86 : typos_dedomenwn
line 101: typos_synartisis
并且移位/减少错误在:
line 129: entoli_if
我找不到如何解决它们,有人可以帮忙吗?
这是下面的野牛代码:
%{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int totalerrors=0;
extern int yylex();
extern FILE *yyin;
extern int lineno; //Arithmos grammis pou kanei parse
//error handling
void yyerror(const char *msg) {
}
//filling the error array
void printError(char y[],int x){
//param 1: error string
//param 2: line number
char temp[15];
char temp2[5];
char final[256];
sprintf(temp2,"%d: ",x);
strcpy(temp, "In Line ");
strcat(temp,temp2);
strcpy(final,"");
strcat(final,temp);
strcat(final,y);
printf("%d) %s\n",totalerrors+1,final);
totalerrors++;
}
%}
%start start
%token T_sigkritikos_telestis
%token T_typos_dedomenwn
%token T_typos_synartisis
%token T_stathera
%token T_newline
%token T_kefalida_programmatos
%token T_extern
%token T_void
%token T_return
%token T_if
%token T_else
%token T_plus
%token T_minus
%token T_mult
%token T_div
%token T_percentage
%token T_int
%token T_bool
%token T_string
%token T_true
%token T_false
%token T_id
%token T_semic
%token T_comma
%token T_openpar
%token T_closepar
%token T_ampersand
%token T_begin
%token T_end
%token T_excl
%token T_or
%token T_equals
%token T_semileft
%token T_semiright
%%
start: exwterikes_dilwseis T_kefalida_programmatos tmima_orismwn tmima_entolwn;
exwterikes_dilwseis: exwteriko_prwtotypo exwterikes_dilwseis
| ;
exwteriko_prwtotypo: T_extern prwtotypo_synartisis;
tmima_orismwn: orismos tmima_orismwn
| ;
orismos: orismos_metavlitwn
| orismos_synartisis
| prwtotypo_synartisis;
orismos_metavlitwn: typos_dedomenwn lista_metavlitwn T_semic;
typos_dedomenwn: T_int
| T_bool
| T_string;
loop1: T_comma T_id
| ;
lista_metavlitwn: T_id loop1;
orismos_synartisis: kefalida_synartisis tmima_orismwn tmima_entolwn;
prwtotypo_synartisis: kefalida_synartisis T_semic;
kefalida_synartisis: typos_synartisis T_id T_openpar lista_typikwn_parametrwn T_closepar
| typos_synartisis T_id T_openpar T_closepar;
typos_synartisis: T_int
| T_bool
| T_void;
lista_typikwn_parametrwn: typikes_parametroi loop2;
loop2: T_comma typikes_parametroi
| ;
typikes_parametroi: typos_dedomenwn T_ampersand T_id;
tmima_entolwn: T_begin loop3 T_end;
loop3: entoli loop3
| ;
entoli: apli_entoli T_semic
| domimeni_entoli
| sintheti_entoli;
sintheti_entoli: T_semileft loop3 T_semiright;
domimeni_entoli: entoli_if;
apli_entoli: anathesi
| klisi_sunartisis
| entoli_return
| ;
entoli_if: T_if T_openpar geniki_ekfrasi T_closepar entoli else_clause
| T_if T_openpar geniki_ekfrasi T_closepar entoli;
else_clause: T_else entoli;
anathesi: T_id T_equals geniki_ekfrasi;
klisi_sunartisis: T_id T_openpar lista_pragmatikwn_parametrwn T_closepar
| T_id T_openpar T_closepar;
lista_pragmatikwn_parametrwn: pragmatiki_parametros loop4;
loop4: T_semic pragmatiki_parametros loop4
| ;
pragmatiki_parametros: geniki_ekfrasi;
entoli_return: T_return geniki_ekfrasi
| T_return;
geniki_ekfrasi: genikos_oros loop5;
loop5: T_or T_or genikos_oros loop5
| ;
genikos_oros: genikos_paragontas loop6;
loop6: T_ampersand T_ampersand loop6
| ;
genikos_paragontas: T_excl genikos_protos_paragontas
| genikos_protos_paragontas;
genikos_protos_paragontas: apli_ekfrasi tmima_sigrisis
| apli_ekfrasi;
tmima_sigrisis: T_sigkritikos_telestis apli_ekfrasi;
apli_ekfrasi: aplos_oros loop7;
loop7: T_plus aplos_oros loop7
| T_minus aplos_oros loop7
| ;
aplos_oros: aplos_paragontas loop8;
loop8: T_mult aplos_paragontas loop8
| T_div aplos_paragontas loop8
| T_percentage aplos_paragontas loop8
| ;
aplos_paragontas: T_plus aplos_prot_oros
| T_minus aplos_prot_oros
| aplos_prot_oros;
aplos_prot_oros: T_id
| stathera
| klisi_sunartisis
| T_openpar geniki_ekfrasi T_closepar;
stathera: T_true
|T_false;
%%
int main(int argc, char *argv[]){
++argv; --argc; //agnooume to onoma tou exe
if (argc==1) {
FILE *fp = fopen(argv[0],"r");
if (fp!=NULL) {
printf("Reading input from file: %s\n",argv[0]);
printf("Output:\n\n");
yyin = fp;
yyparse();
} else {
printf("File doesn't exist\n");
return 1;
}
} else if (argc>1) {
printf("Only one file allowed for input...\n");
return 1;
} else {
printf ("Parsing from stdin..\n");
yyparse();
}
if (totalerrors==0) {
printf("All good!\n");
printf("===================================\n");
printf("Parsing complete! No errors found!!\n");
} else {
printf("===================================\n");
printf("Total Errors: %d\n",totalerrors);
}
return 0;
}