BISON token parsing conflict - Why?



  • hallöchen,

    vllt kennt ihr ja das Problem das BISON immer den Fehler "1> Konflikte: 1 Schiebe/Reduziere, 1 Reduziere/Reduziere" bringt.

    Ich versteh jedoch nicht ganz wieso. Hab es auch mit unterteilung versucht, ohne erfolg der bringt immernoch den Konflikt.

    In folgendem Code versuch ich lediglich den 'Aufbau' (siehe erster Kommentar im Code) zu unterscheiden. Hier hab ich jetzt nur die ersten 3 Unterscheidungen drin.

    Legende:
    FORMULAUNITS_t = Zahlen mit oder ohne Formelzeichen(R|V|A|F)
    PERCENTVALUE_t = Zahlen mit einem % dahinter
    t_areaBorder   = ";"
    ts_logicalOperator = "," "." "_"
    
    /* Aufbau
    spezi L   U
    ;220,15%
    ;220,10%,230
    ;220,210,230
    ;220,210,10%
    ;220,10%,20%
    */
    SPEZI_MIN_MAX:
    	t_areaBorder FORMULAUNITS_t ts_logicalOperator PERCENTVALUE_t
    	{// ;220,15% ---> ;220,191.30,253
    		if(t_status)
    		{
    			printf(">\tSPEZI_f_p\n");
    		}
    	}
    |
    	t_areaBorder FORMULAUNITS_t ts_logicalOperator PERCENTVALUE_t ts_logicalOperator FORMULAUNITS_t 
    	{// ;220,10%,230 ---> ;220,200,230
    		if(t_status)
    		{
    			printf(">\tSPEZI_f_p_f\n");
    		}
    	}
    |
    	t_areaBorder FORMULAUNITS_t ts_logicalOperator FORMULAUNITS_t ts_logicalOperator FORMULAUNITS_t
    	{// ;220,210,230
    		if(t_status)
    		{
    			printf(">\tSPEZI_f_f_f\n");
    		}
    	}
    

    Ausgabe nach bison.exe compile:

    1>------ Build started: Project: ICT_FLEX_BISON, Configuration: Debug Win32 ------
    1>  Konflikte: 1 Schiebe/Reduziere, 1 Reduziere/Reduziere
    1>  bison compilation
    ========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
    

    Wenn ich 2 der 3 SPEZI_MIN_MAX-Cases rausnehme dann ist kein Konflikt mehr vorhanden, steht ja auch nur noch ein Case da.

    Und folgende Änderung resultiert in der selben Ausgabe

    DO:
    	t_areaBorder FORMULAUNITS_t ts_logicalOperator
    
    SPEZI_MIN_MAX:
    	DO PERCENTVALUE_t
    	{// ;220,15% ---> ;220,191.30,253
    		if(t_status)
    		{
    			printf(">\tSPEZI_f_p\n");
    		}
    	}
    |
    	DO PERCENTVALUE_t ts_logicalOperator FORMULAUNITS_t 
    	{// ;220,10%,230 ---> ;220,200,230
    		if(t_status)
    		{
    			printf(">\tSPEZI_f_p_f\n");
    		}
    	}
    |
    	DO FORMULAUNITS_t ts_logicalOperator FORMULAUNITS_t
    	{// ;220,210,230
    		if(t_status)
    		{
    			printf(">\tSPEZI_f_f_f\n");
    		}
    	}
    

    Was jemand was ich hier übersehe, oder was ich tun soll?

    Danke schonmal,
    Adi



  • Könntest du mal ein vollständiges Beispiel posten? Die semantischen Aktionen kannst du rausnehmen. Ansonsten kannst du mit der Option -v erstmal genauere Informationen zu den Parserzuständen und in welchen davon es Konflikte gibt bekommen.


Anmelden zum Antworten