繁体   English   中英

字符串向量中的野牛输入

[英]Bison input from string vector

我有要在野牛中解析的字符串向量。 我应该远程接收此消息,并且我不想写入文件并回读。 我的字符串向量可能很大。

到目前为止,这是我尝试过的

  1. 将所有字符串添加到一个字符串并使用yy_scan_string

  2. 我还尝试将所有字符串添加到缓冲区和yy_scan_string。

我尝试按以下方式构建可执行文件:

bison -d logic.y
flex logic.l
g++ logic.tab.c lex.yy.c -lfl -o logic

但我收到错误:

undefined reference to `yy_scan_string'.

这是我的解析器:

%{

#include <cstdio>
#include <iostream>
#include <string.h>
#include <vector>
#include <algorithm>
#include <Server.h>
using namespace std;

//stuff from flex that bison needs to know about:
extern "C" int yylex();
typedef struct yy_buffer_state * YY_BUFFER_STATE;
extern "C" int yyparse();
extern "C" YY_BUFFER_STATE yy_scan_string(const char * str);
//extern "C" void yy_delete_buffer(YY_BUFFER_STATE buffer);
extern int line_num;

vector<string> statements;

void yyerror(const char *s);

%}

//C union holding each of the types of tokens that Flex could return
%union { 
    char const *sval;
}

//symbol defination

//end of declaration section
%%        
//Start of grammar section

//grammar

//end of grammar section
%%

int main(int argc, char *argv[]) {
    try
    {
        logicMessage = server.getLogic();

        statements = logicMessage->get_LogicStatements ();       

        string  single = "";

        for (vector<string>::iterator it=statements.begin(); it!=statements.end(); ++it)
            single += *it; 

        char* buffer = new char[single.length()+1];
        strcpy(buffer,single.c_str());

        yy_scan_string(single.c_str());
        yyparse();

        //yy_delete_buffer(buffer);
        return 0;
    }
    catch(IPC_RETURN_CODE IPC_CODE)
    {
        std::cerr<< "IPC Error Code:" <<IPC_CODE;
    }
}

void yyerror(const char *s) {
    cout << "Parse error on line " << line_num << "!  Message: " << s << endl;
    // might as well halt now:
    exit(-1);
}

您确实不需要那些extern "C"声明,它们使您的构建过程变得复杂。

(现代) bisonflex都可以生成可以用C或C ++编译的代码,尽管如果以相同的方式编译它们,则会发现代码更简单。 在这种情况下,您将无需使用extern声明,因为所有外部函数都将针对您使用的语言进行正确编译。

请注意,使用g++进行编译时,扩展名为.c文件将被编译为C ++程序。 因此, lex.yy.c被编译为C ++程序,并且外部函数(包括yylexyy_scan_string )具有正常的C ++链接(和名称修饰),并且在不同的翻译单元中将它们声明为external "C"将创建链接。错误。

尽管有上述情况,我通常使用-o选项flexbison创建具有适当扩展名的文件名。 使用flex--header-file选项来生成包含导出函数声明的头文件,例如yy_scan_string ,也可能是有用的。

我已经读过您需要在词法分析器文件中放置“%option reentrant”。 在这里查看更多信息。 似乎您需要创建一个yyscan_t类型对象也可以传入。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM