FLEX & BISON Multiple Variables from FLEX to BISON



  • Hallöchen Leute,

    hoffe jemand kennt sich damit ein bisschen aus 😉

    hier erstmal mein Code:
    ICT_FLEX.l

    %{
    	#include <stdio.h>
    	#include <string.h>
    	#include "y.tab.h"
    %}
    
    %%
    [a-zA-Z0-9]+[\,][UUT]*	{
    			 yylval.string=strdup(yytext);
    			 return TYPE;
    			} /* Get beginning [R,UUT...] */
    [a-zA-Z]*[\;][a-zA-Z]*	{ 
                              yylval.string=strdup(yytext);
    			  return INFO_SPEZIFIED; 
                            } /* Anything with a ; between characters */
    %%
    
    int yywrap()
    {
    	return 1;
    }
    
    main()
    {
    	yyparse();
    }
    

    ICT_BISON.y

    %{
    #include <stdio.h>
    #include <string.h>
    
    void yyerror(const char *str)
    {
    	fprintf(stderr,"error: %s\n",str);
    }
    %}
    
    %union 
    {
    	char *string;
    }
    
    %token <string> INFO_SPEZIFIED
    %token <string> TYPE
    
    %%
    commands:
    	| commands command
    	;
    command:
    	anything | doSomething
    
    doSomething:
    	TYPE
    	{
    		string test = $1; <----------------------------------- Problem
    		printf("\ttype('%s')\n",test);
    	}
    	;
    anything:
    	INFO_SPEZIFIED
    	{
    		printf("\ttxt('%s')\n",$1);
    	}
    	;
    %%
    

    Mein Vorhaben:
    Ich weiß nicht wie ich nun bei "doSomething" den Wert den ich reinbekomme von den $1 variablen in eine richtige bekomme, bsp. einen String genannt test.

    Also ich gebe einfach Beispielsweise R,UUT_1_XY an meine exe. Diese soll dann in FLEX erkennen, ahhh das is TYPE und übergib dann "R,UUT". In BISON will ich diesen Wert der in $1 drin zu finden ist in eine Variable machen sodass ich nur noch das vor dem Komma habe also "R" und nicht "R,UUT".

    Kann mir jemand sagen wie das gehen soll?

    Adi



  • Habs selbst rausgefunden 😉

    in .l (flex)

    heater			{ return TOKHEATER; }
    [a-z0-9]+		{ yylval.character=strdup(yytext);
    				  return WORD; }
    

    in .y (bison)

    %{
    #include <stdio.h>
    #include <string.h>
    
    char *s_heater="default";
    %}
    
    %union 
    {
    	int integer;
    	char *character;
    }
    
    %token TOKHEATER 
    %token <character> WORD
    
    %% 
    heater_select:
    	TOKHEATER WORD
    	{
    		s_heater=$2;
    		printf("\tSelected heater '%s'\n",s_heater);
    	}
    	;
    ...
    

Anmelden zum Antworten