我正在使用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不起作用。
答案 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 */ }
;