如何通过野牛行动插入或将对象返回或传递给野牛解析器?

时间:2013-01-26 08:08:30

标签: c++ bison

我有一个GUI程序,它使用bison来解析文件(包含IC的引脚连接列表)。 输入文件类似于>

3 = NAND2(1, 2)
6 = NAND2(4, 5)
8 = NAND2(9, 10)
11 = NAND2(12, 13)

而且(简化)语法就像 - >

start : spec { cout << "Parse Complete!"; }
      ;

spec : '{' expr_list '}'
     ;

expr_list : expr_list expr | expr
          ;

expr : INT '=' FUNC '(' args ')' { /*WANT TO INSERT ACTION HERE */ }
     ;

在提到的地方,我想执行一个操作 - 在我的容器中插入已解析的值(map)。 bison生成的文件是.cpp,但实际上它是C。我可以轻松地包含所需的头文件。我也可以简单地调用非成员函数(如cout)。

我的问题是 - 如何在对象(容器类型)中插入值?我可以在语法文件中创建一个对象,但是我该如何返回呢?

其他方法是在GUI代码中创建一个(容器类型的)对象,然后将其传递给解析器。

请告诉我们如何实现任何方法。

2 个答案:

答案 0 :(得分:1)

使用返回值优化,我只是想按值返回一个地图。

答案 1 :(得分:0)

解决方案是extern

我在GUI的 .cpp 文件中创建了(全局)对象(我调用解析器),如:

QStringList *icNameList;

然后在头文件中(由bison文件包含)

extern QStringList *icNameList;

最后在野牛文件中,我可以做类似的事情:

abc : xyz { icNameList->append(getTokenString()); }
    ;