使用Flex和Bison解析字符串标记时出现问题

使用Flex和Bison解析字符串标记时出现问题,bison,flex-lexer,Bison,Flex Lexer,我是Flex和Bison的初学者,我有一些C的基本知识,我正在创建一个简单的解析器 这里的目标是填充以下结构: struct numvariable { int nodetype; /* type V */ char* value; }; 为了做到这一点,首先,我尝试打印用户在lexer working中输入的char*:打印用户输入的值,然后在parser not working中打印null 以下是lexer.l文件中的对应行用户输入的字符串在此处正确打印: [a-z

我是Flex和Bison的初学者,我有一些C的基本知识,我正在创建一个简单的解析器

这里的目标是填充以下结构:

struct numvariable {
    int nodetype;    /* type V */
    char* value;
};
为了做到这一点,首先,我尝试打印用户在lexer working中输入的char*:打印用户输入的值,然后在parser not working中打印null

以下是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*?我想我在lexer和解析器之间遗漏了一些东西,因为我不知道为什么char*打印在lexer中而不是在解析器中。。。 应用于数字的相同代码将char*更改为double非常有效

提前感谢您的帮助:

我认为$1不是char*类型,但是,它的类型是什么

如果某个对象的类型不正确,编译器将生成错误或至少警告,除非禁用了警告、显式转换值或使用无效指针,而在本例中没有。所以当出现类型错误时,您通常会知道它。这不是问题所在

在这里,您让var指向strdup返回的内存,然后立即释放该内存。所以var现在指向已释放的内存,任何试图取消对它的引用都将导致未定义的行为


在使用完字符串之前,不应释放字符串的内存,因为这些字符串可能会出现在AST中,也可能出现在IR中。

非常感谢。事实上,这是问题的一部分。我认为问题的另一部分来自yylval.var==yycopy,它应该是yylval.var=yycopy。无论如何,问题已经解决了,谢谢:
char *yycopy = strdup(yytext);
// ...
yylval.var == yycopy;
free(yycopy);