2013-07-11 31 views
5
bizon

çatışmaları azaltmak/çatışmaları azaltmak ... Ben dosyadan array data[] için yüklemeye çalışıyorum:Shift/I <code>Bison</code> yeniyim ve ben vardiya ile ilgili sorun yaşıyorum

İşte
struct _data 
{ 
    char name[50]; 
    char surname[50]; 
    int year; 
} data[1000]; 

parçasıdır benim bizon kod: yanlış gitti

conflicts: 5 shift/reduce 

konusunda fikrin:

%token ID NUM NL EOF 

%% 

File : List EOF 
     ; 
List : Record 
     | List Record 
     ; 
Record : Name Surname Year NL { count++; } 
     | NL     { count++; } 
     | /*empty*/ 
     ; 
Name : ID     { strcpy(data[count].name, yytext); } 
     ; 
Surname: ID     { strcpy(data[count].surname, yytext); } 
     ; 
Year : NUM     { data[count].year= atoi(yytext); } 
     ; 

%%    

bu hatayı alıyorum?

cevap

11

-v seçeneğini bison almak için , çakışma/azaltma sorunlarını tanımanıza yardımcı olabilecek çok daha fazla bilgi içeren bir .output dosyası üretmek için kullanabilirsiniz. Özellikle, öğelerin listesi de dahil olmak üzere her ayrıştırıcı durumunu gösterir ve ayrıca hangi durumların çakışma olduğunu gösterir.

Ancak bu durumda sorun oldukça basit. Sade tasarımı Stripped sahip:

List: Record 
    | List Record 
    ; 

Record: Something 
     | /* Nothing */ 
     ; 

Something tanımı ne yok sayarak, sorunun bir List birbiri ardına Records, bir herhangi bir sayıda oluşabilir ve Record boş olabilir olmasıdır. Bu, hiçbir şeyin tamamen belirsiz olan boş herhangi bir sayı Records olarak ayrıştırılabileceği anlamına gelir. Girişteki her iki ardışık Somethings, 0, 1, 2, 42 veya 273 boş Records ile ayrılabilir. Ayrıştırıcı yeni bir Something (shift) ayrıştırmaya veya boş bir Record (azaltma) göndermeye başlayamayacağını bilemediğinden, bir çakışma/azaltma çakışması olduğundan şikayetçi olur.

Bu durumda çözüm oldukça basittir. Boş olmayan bir Something'un bir NL ile bitmesi gerektiğini görebiliriz; Muhtemelen niyet, File'un her biri kendi satırında olan herhangi bir sayıda Records'dan oluşmasıydı. Bu yüzden yeniden yazabilirsiniz: Boş

File: List EOF 
    ; 

List: Record 
    | List NL Record 
    ; 

Record: Name Surname Year 
     | /* Empty */ 
     ; 
Şimdi

bir Record, ya da değil, bir EOF veya NL biri tarafından takip edilmelidir. Doğrudan başka bir Record tarafından takip edilemez.