更改Bison-Flex的输入源

在我最开始使用Bison-flex时,出于某些原因,涉及到题目这个问题。在此来说明一下该如何操作。
如有错漏,还望指摘。

首先,《Flex与Bison中文版》中说明了,Bison-Flex一般以FILE*变量yyin作为指定输入,如果没有特别指定,yyin默认为标准输入。所以当我们想分析文件中的内容的时候,就不得不涉及,如何来更改输入源呢,改成某个文件,或者指定的字符串变量?

  1. 改成指定文件
    这里用到了yyrestart函数。这个函数的作用就是将输入源改为指定文件。具体用法如下:

    FILE* f;
    f = fopen("dir", "r); //打开文件
    yyrestart(f);
    yylex();
    
  2. 将输入源改成指定字符串
    这里需要用到yy_switch_to_buffer函数。这个函数的作用是将输入源改为指定的缓存。

    首先需要创建缓存,类型为YY_BUFFER_STATE(其在Flex生成的文件中定义,是struct yy_buffer_state*型变量),再用yy_scan_string函数将字符串扫描进缓存中。最后用yy_switch_to_buffer来更换到新的缓存。

    在词法分析后,还需要使用yy_delete_buffer函数和yylex_destroy函数来析构内存。

    具体方法如下:

    int parser(char* input)
    {
        //创建缓存,并将字符串扫描进缓存中
        YY_BUFFER_STATE bp = yy_scan_string(input);
        
        //分配失败
        if (bp == nullptr) {
    		cout << "error on creating YY_BUFFER_STATE" << endl;
    		return -1;
    	}
    	//将输入源转为指定内存
    	yy_switch_to_buffer(bp);
    	
    	//词法语法分析
    	yyparse();
    	
    	//清理内存
    	yy_delete_buffer(bp);
    	yylex_destroy();
    	return 0;
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值