使用Flex和Bison解析字符串令牌时出现问题

时间:2018-07-24 07:51:58

标签: bison flex-lexer

我是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)效果很好...)

在此先感谢您的帮助:)

1 个答案:

答案 0 :(得分:1)

  

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

如果某些东西的类型不正确,则编译器将产生错误或至少一个警告(除非您禁用了警告,正在显式转换值或使用空指针,在这种情况下您不会这样做) 。因此,当出现类型错误时,您通常会知道它。这不是这里的问题。

char *yycopy = strdup(yytext);
// ...
yylval.var == yycopy;
free(yycopy);

在这里,您要使var指向strdup返回的内存,然后立即释放该内存。因此,var现在指向释放的内存,任何取消引用它的尝试都会导致不确定的行为。

在处理完字符串之前,您不应该释放它们的内存(这很可能是程序的结尾,因为这些字符串很可能会出现在您的AST中,也可能会出现在IR中)。