2013-07-11 6 views
5

में संघर्ष को कम मैं Bison के लिए नया हूँ और मैं पारी में परेशानी आ रही/संघर्ष को कम करने ... मैं फ़ाइल से array data[] को लोड करने के लिए कोशिश कर रहा हूँ:शिफ्ट/जंगली भैंसों

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

यहाँ हिस्सा है मेरी जंगली भैंसों कोड की:

conflicts: 5 shift/reduce 

किसी भी विचार है जहाँ मैं गलत हो गया:

%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); } 
     ; 

%%    

मैं इस त्रुटि मिलती है?

उत्तर

11

आप -v विकल्प का उपयोग bison प्राप्त करने के लिए एक बहुत अधिक जानकारी है जो आप बदलाव का निदान/संघर्ष को कम करने में मदद कर सकते युक्त एक .output फ़ाइल का उत्पादन कर सकते हैं। विशेष रूप से, यह आपको वस्तुओं की सूची समेत प्रत्येक पार्सर राज्य दिखाएगा, और यह भी संकेत देगा कि किन राज्यों के संघर्ष हैं।

लेकिन इस मामले में, समस्या बहुत सरल है। इसके अनिवार्य को छीन आपके पास:

List: Record 
    | List Record 
    ; 

Record: Something 
     | /* Nothing */ 
     ; 

की उपेक्षा क्या Something की परिभाषा है, समस्या यह है कि एक ListRecords, एक के बाद एक के किसी भी संख्या हो सकते हैं, और एक Record खाली हो सकता है। इसका मतलब है कि कुछ भी Records खाली किसी भी संख्या के रूप में पार्स नहीं किया जा सकता है, जो पूरी तरह संदिग्ध है। इनपुट में लगातार दो Somethings को 0, 1, 2, 42, या 273 खाली Records से अलग किया जा सकता है। चूंकि पार्सर यह नहीं जान सकता कि नया Something (शिफ्ट) पार्स करना शुरू करें या खाली Record (कम करें) को निकालने के लिए, यह शिकायत करता है कि एक बदलाव/संघर्ष कम हो गया है।

इस मामले में समाधान बहुत सरल है। हम देख सकते हैं कि एक गैर-खाली SomethingNL के साथ समाप्त होना चाहिए; संभवतः इरादा यह था कि File में Records की कोई भी संख्या शामिल है, प्रत्येक अपनी लाइन पर। तो हम फिर से लिखने कर सकते हैं:

File: List EOF 
    ; 

List: Record 
    | List NL Record 
    ; 

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

अब एक Record, खाली है या नहीं, या तो एक EOF या एक NL द्वारा पालन किया जाना चाहिए। इसे सीधे Record द्वारा पीछा नहीं किया जा सकता है।

संबंधित मुद्दे