我是Flex和Bison的初学者(我对C有一些基本知识),并且正在创建一个简单的解析器。
这里的目标是填充以下结构:
struct numvariable {
int nodetype; /* type V */
char* value;
};
为此,首先,我尝试在lexer中打印用户输入的char *(正在工作:打印用户输入的值),然后在解析器中打印(不工作,null)。 / p>
这是lexer.l文件中的相应行(此处正确输入了用户输入的字符串):
[a-zA-Z][a-zA-Z0-9]* {
char *yycopy = strdup(yytext);
printf("lexer %s\n", yycopy);
yylval.var == yycopy;
free(yycopy);
return NAME;
}
以下是parser.y文件:
%{
#include <stdio.h>
#include <stdlib.h>
#include <cstring>
#include "header.h"
extern int yylex(void);
struct ast *result;
%}
%union {
struct ast *a;
char *var;
}
%token <var> NAME
%type <a> exp
%%
calclist: /* nothing */
| calclist exp { result = $2; }
;
exp: NAME { $$ = newvar($1); }
;
%%
struct ast *newvar(char *val)
{
printf("parser %s\n", val);
struct numvariable *a =
(struct numvariable *)malloc(sizeof(struct numvariable));
a->nodetype = 'V';
// a->value = val;
return (struct ast *)a;
}
我试图使其尽可能简单,请告诉我是否有任何缺少的信息来理解问题。
我认为$ 1不是char *类型,但是它的类型是什么?以及如何将其转换为char *?我想我在词法分析器和解析器之间缺少某些内容,因为我不知道为什么char *是在词法分析器中而不是在解析器中打印的... (将相同的代码应用于数字(将char *更改为double)效果很好...)
在此先感谢您的帮助:)
答案 0 :(得分:1)
我认为$ 1不是char *类型,但是它的类型是什么?
如果某些东西的类型不正确,则编译器将产生错误或至少一个警告(除非您禁用了警告,正在显式转换值或使用空指针,在这种情况下您不会这样做) 。因此,当出现类型错误时,您通常会知道它。这不是这里的问题。
char *yycopy = strdup(yytext); // ... yylval.var == yycopy; free(yycopy);
在这里,您要使var
指向strdup
返回的内存,然后立即释放该内存。因此,var
现在指向释放的内存,任何取消引用它的尝试都会导致不确定的行为。
在处理完字符串之前,您不应该释放它们的内存(这很可能是程序的结尾,因为这些字符串很可能会出现在您的AST中,也可能会出现在IR中)。