How to return function name with bison?

I am creating a simplified C-parser using bison and flex. I wrote a grammar rule to detect functions in my Bison file, and I want the parser to send the function name to my C monitoring program. Here is a very simplified example of what I implemented:

my monitor program

/*monitor.h*/
#ifndef MONITOR_H
#define MONITOR_H

extern int noLig;
extern char* yytext;

#endif

/*monitor.c*/
#include <stdio.h>
#include <monitor.h>
#include <project.tab.h>

int noLig=0;

int main (int argc, char * argv[]) {
    printf("flex-\n");
    int err_code=yyparse();
    if (err_code == 0) {
        printf("It went fine\n");
    } else {printf("It didn't go well\n");}
    return 0;
}

project.l file

%{
#include <stdio.h>
#include <monitor.h>
#include <project.tab.h>
%}

%%
"\"[a-zA-Z0-9]+"\"  {ECHO; yylval.str=yytext; return STR;}
[.,;=()\[\]\{\}]        { return yytext[0]; }

"char"      {ECHO; printf("-"); yylval.str=yytext; return TYPE;}
"int"       {ECHO; printf("-");yylval.str=yytext; return TYPE;}
"float"     {ECHO; printf("-");yylval.str=yytext; return TYPE;}
"double"    {ECHO; printf("-");yylval.str=yytext;return TYPE;}

[a-zA-Z][a-zA-Z0-9]* {ECHO; printf("-");yylval.str = yytext; return VAR;}

[ \t\n\b]+  {noLig++;}
"//".*      {}
.       {printf(":%cwhat is this",yytext[0]);}
%%

project.y file

%{
#include    <stdio.h>
#include    <monitor.h>
int yylex();
int yyerror ();
%}
%union {
    char *str;
    int i;
}
%define parse.error verbose
%type <i> INT
%type <str> TYPE STR VAR

%token TYPE INT STR VAR

%start Program
%%
Program: function_l
    ;

function_l: function
    | function_l function
    ;

function: TYPE VAR '(' param_prototype_ld ')' '{' instruction_l '}'
    {printf("\n\nbison-\n%s\n",$1);}
    ;

param_prototype_ld: /*empty*/
    | param_prototype_l
    ;

param_prototype_l: param_prototype
    | param_prototype_l ',' param_prototype
    ;

param_prototype: TYPE VAR
    ;

instruction_l: /*empty*/
    | VAR ';'
    | VAR instruction_l
    ;
%%
int yyerror (char* s) {
    fprintf(stderr, "Compilator3000:l.%d: %s\n", noLig, s);
}

file test.c

int main (int arg) {
    a;
}

It compiles without warning. However, when I run ./monitor < test.c, I get the following output:

flex-
int-main-int-arg-a-

bison-
int main (int arg) {
    a;
}
It went fine

Why $1does the bison variable return the entire function block? How can I get only return type? (In the end, my goal is to print the return type, function name, and argument type)

+4
source share
2

yytext , yytext, , strdup:

...
"\"[a-zA-Z0-9]+"\"  {ECHO; yylval.str=strdup(yytext); return STR;}
[.,;=()\[\]\{\}]    { return yytext[0]; }

"char"      {ECHO; printf("-"); yylval.str=strdup(yytext); return TYPE;}
"int"       {ECHO; printf("-");yylval.str=strdup(yytext); return TYPE;}
"float"     {ECHO; printf("-");yylval.str=strdup(yytext); return TYPE;}
"double"    {ECHO; printf("-");yylval.str=strdup(yytext);return TYPE;}

[a-zA-Z][a-zA-Z0-9]* {ECHO; printf("-");yylval.str = strdup(yytext); return VAR;}
...

strdup NULL, -,

char *
strdup_checked(char *str)
{
        char *p;

        if ((p = strdup(str)) == NULL) {
                perror("strdup");
                exit(EXIT_FAILURE);
        }
        return (p);
}
+3

OP , .

, .

function: TYPE VAR '(' param_prototype_ld ')' '{' instruction_l '}'
    {printf("\n\nbison-\n%s\n",$1);}
    ;

. , TYPE 1 , VAR - 2 (, , ). $$ - . function. , $$ = $2 . $$ to $1 . , struct, $ .

function_l: function
    | function_l function
    ;

. "function_l" $1, "function" - $2. $2, , "function".

"VAR" , yylval.str=strdup(yytext) , yylval.str=strdup($<pos>)

+1

Source: https://habr.com/ru/post/1653119/


All Articles