使用Flex和Bison解析字符串标记时出现问题
我是Flex和Bison的初学者,我有一些C的基本知识,我正在创建一个简单的解析器 这里的目标是填充以下结构:使用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
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);