bison 左右递归生成链表的小例子

%{
#include
#include "apps_conf_flex.h"
using namespace std;
struct mod_r_test
{
    int pri;
    mod_r_test *next;
};
int yyerror(const char *errmsg);
void print_test(mod_r_test* mods);
%}

%union{
    string* qstr;
    int num;
    mod_r_test *r_test;
}

%token   QSTR ID
%token NUM WORKDIR PRI MOD
%type mod_items mod_item app

%%
app:
mod_items
{
    print_test($$);
    //printf("app:%d\n",$$);
};

mod_items:
mod_item mod_items
{
    //printf("mod_item:%d,%d\n",$1,$2);
    $1->next = $2; $$ = $1;
}
|mod_item
{
    //printf("mod_items:%d\n",$$);
};

mod_item:
PRI '=' NUM
{
    $$ = new mod_r_test;
    $$->pri=$3;
    $$->next=0;
    //printf("pri:%d\n",$$);
};

%%
void print_test(mod_r_test* mods){
    for(mod_r_test *head=mods;head!=0;head =head->next){
        printf("pri=%d\n",head->pri);
    }
}

int yyerror(const char *errmsg){
    printf("%s: %s ,at line %d\n",errmsg,yytext,yylineno);
}


你可能感兴趣的:(原创文章)