本文共 884 字,大约阅读时间需要 2 分钟。
在我最开始使用Bison-flex时,出于某些原因,涉及到题目这个问题。在此来说明一下该如何操作。
如有错漏,还望指摘。首先,《Flex与Bison中文版》中说明了,Bison-Flex一般以FILE*
变量yyin
作为指定输入,如果没有特别指定,yyin
默认为标准输入。所以当我们想分析文件中的内容的时候,就不得不涉及,如何来更改输入源呢,改成某个文件,或者指定的字符串变量?
改成指定文件:
这里用到了yyrestart
函数。这个函数的作用就是将输入源改为指定文件。具体用法如下: FILE* f;f = fopen("dir", "r); //打开文件yyrestart(f);yylex();
将输入源改成指定字符串:
这里需要用到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;
转载地址:http://ftxzi.baihongyu.com/