Action没有声明类型错误

时间:2014-05-07 04:01:16

标签: c types bison

我正在使用Flex和Bison的语法编写一种非常简单的编程语言。但我是初学者,所以我不确定如何使用它们。

除了一些基本操作(如算术和逻辑运算,赋值等),我还有一个需要被这种语言识别的函数:这​​个函数叫做“ftoc”,它需要一个数字参数。

在我的flex .l文件中,我有(以及其他)这些定义:

DIGITO [0-9]
PUNTO ["."]
CONST_REAL {DIGITO}+{PUNTO}{DIGITO}+
CONST_ENTERA {DIGITO}+
P_A ["("]
P_C [")"]

我对“ftoc”函数也有这个规则:

"FtoC" { printf("%s\n", yytext);return FTOC;}

我的野牛.y文件有这个联合接受三种数据类型:

%union {
    char *text;
    int integer;
    double real;
}

它还有以下令牌定义:

%token <integer> CONST_ENTERA
%token <real> CONST_REAL
%token <text> INTEGER
%token <text> REAL
%token <text> STRING
%token P_A P_C
%token FTOC

涉及“ftoc”功能的规则是:

conversion:
    FTOC P_A constante P_C
;
constante:
    CONST_ENTERA
    | CONST_REAL
;

现在,我需要编写一个函数,每次找到函数时都会打印“ftoc”加上它的参数。例如,如果解析器发现函数用作: FtoC(57.6)我需要它来打印“ ftoc57.6 ”。

我打印它的功能看起来有点像这样:

printFtoc(char* function, double argument){
    snprintf("%s, %f", function, argument);
}

我的问题是我应该如何将参数传递给此函数。我在“转换”规则中尝试使用$ n,如下所示:

FTOC P_A constante P_C {printFtoC($1, $3)}

然后我在Bison中遇到2个错误(每个$ n一个),说“转换”没有声明类型。

我一直在尝试阅读Bison文档,但我并没有真正得到我应该做的事情。从我得到的其他问题和论坛,我可能需要用%type或%token做一些事情,但我真的不知道。

我只需要找到函数名称和参数,但不知道如何实现它,因为$ n不起作用。

1 个答案:

答案 0 :(得分:1)

错误会告诉您确切的错误 - 您在$3的规则中使用constante,但您尚未为constante声明类型}。你可能需要一个类似的声明:

%type<real> constante

告诉Bison constante在联盟的real字段中。您在该操作中也遇到$1问题,因为FTOC没有类型。您可以通过给FTOC类型并将lex规则适当地修改为yylval,或者通过删除$1并使用字符串文字"ftoc"代替

来解决这个问题。

任何给定的非终端只能有一种类型,因此您需要在constante规则中添加操作。使用上面的%type声明,您将拥有:

constante: CONST_ENTERA  { $$ = $1; /* implicit int->double conversion */ }
         | CONST_REAL    { $$ = $1; /* simple assignment of a double */ }
;