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

%{
#include <string>
#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>  QSTR ID
%token <num> NUM WORKDIR PRI MOD
%type <r_test> 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);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值