所以我正在将Bison用于我正在进行的项目。我的野牛文件看起来与此相似:
%{
#include <iostream>
....
%}
%union
{
int intVal;
double dVal;
char charVal;
char* strVal;
}
%token ID NUMBER INT DOUBLE CHAR STR END
%type <strVal> ID
%type <strVal> INT DOUBLE CHAR STR END
%type <intVal> NUMBER
%type <strVal> dataType
%start program
%%
program: expressions
...
dataType: INT
| DOUBLE
| CHAR
| STR
varDef: dataType ID { std::cout << $1 << endl; }
....
当我编译并运行它并尝试通过它运行“int a”时,它将打印出$ 2的varDef(“a”)但是当我告诉它打印$ 1时,我得到了
terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_S_construct null not valid
我也尝试将我的%union更改为
%union
{
struct {
....
};
}
并没有改变一件事。我知道我做错了什么?
答案 0 :(得分:4)
你没有采取任何行动:
dataType: INT
| DOUBLE
| CHAR
| STR
野牛的默认操作是
{ $$ = $1 }
作为代币
%token ID NUMBER INT DOUBLE CHAR STR END
没有类型你传递的东西没有任何价值,没有类型传递给*char
(我看到你现在已经解决了,但希望我的解释能解释原因)
答案 1 :(得分:0)
如果有人感兴趣我就解决了。我改变了
dataType: INT { $$ = "int"; }
| DOUBLE { $$ = "double"; }
....
所以我实际上是将一些null传递给了cout。谢谢你的帮助!