Bison 多个具有属性的非终结符
Bison multiple nonterminals with attributes
我正在使用 bison 和 flex 创建(在未来的某个地方)抽象语法树 (AST)。现在,我只想有一个算术表达式(例如 +),比如 expression->expression '+' expression |常量,但我希望表达式具有两个属性:代码(即规则右侧第一个元素的值 (RHS)、+ 和第二个表达式的值的字符串)。
我创建了以下结构:
%union {
struct{
char* code;
char* varn;
} attributes;
int intval;
}
这会将它们都保存为字符串(现在,我只想打印它们)。
标记和项目以及语法按以下方式定义:
%token <intval> CONST
%type <attributes> expr
%%
expr:
expr '+' expr
{
printf("%s ",.val);
printf("%s \n",.val);
printf("code: %s %s\n",.code,.code);
}
expr:
CONST
{
int source=;
char temp[100];
sprintf(temp, "%d", source);
$$.val=strcat(temp,"1");
$$.code=temp;
printf("val for %d is %s; code is %s\n",,$$.val,$$.code);
}
%%
在 flex 中,我将 CONST 的值 (intval) 设置为元素本身(因此 4 的 val 将为 4)。当应用第二条规则时,程序会正确打印值。但是,当应用第一个时(打印整个内容时),两个表达式都具有相同的值。
varn for 4 is 41; code is 41
varn for 5 is 51; code is 51
51 51
code: 51 51
(添加1只是为了测试一些东西,它不是计划的一部分)
我不明白为什么。如果我将 expr 更改为 int
类型
%type <intval> expr
它工作正常。
您的代码与以下内容并无太大不同:
char temp[100];
strcpy(temp,"hello");
char *str1=temp;
strcpy(temp,"world");
char *str2=temp;
printf("%s %s\n",str1,str2);
str1
和 str2
都指向内存中的同一点,因此您将获得输出 "world world"。您需要为每个字符串分配内存,以便它们在内存中有自己的位置。
然后在 "expr '+' expr" 模式中,您将 free
每个字符串并创建新的字符串以向上传递解析链。
我正在使用 bison 和 flex 创建(在未来的某个地方)抽象语法树 (AST)。现在,我只想有一个算术表达式(例如 +),比如 expression->expression '+' expression |常量,但我希望表达式具有两个属性:代码(即规则右侧第一个元素的值 (RHS)、+ 和第二个表达式的值的字符串)。
我创建了以下结构:
%union {
struct{
char* code;
char* varn;
} attributes;
int intval;
}
这会将它们都保存为字符串(现在,我只想打印它们)。 标记和项目以及语法按以下方式定义:
%token <intval> CONST
%type <attributes> expr
%%
expr:
expr '+' expr
{
printf("%s ",.val);
printf("%s \n",.val);
printf("code: %s %s\n",.code,.code);
}
expr:
CONST
{
int source=;
char temp[100];
sprintf(temp, "%d", source);
$$.val=strcat(temp,"1");
$$.code=temp;
printf("val for %d is %s; code is %s\n",,$$.val,$$.code);
}
%%
在 flex 中,我将 CONST 的值 (intval) 设置为元素本身(因此 4 的 val 将为 4)。当应用第二条规则时,程序会正确打印值。但是,当应用第一个时(打印整个内容时),两个表达式都具有相同的值。
varn for 4 is 41; code is 41
varn for 5 is 51; code is 51
51 51
code: 51 51
(添加1只是为了测试一些东西,它不是计划的一部分)
我不明白为什么。如果我将 expr 更改为 int
类型%type <intval> expr
它工作正常。
您的代码与以下内容并无太大不同:
char temp[100];
strcpy(temp,"hello");
char *str1=temp;
strcpy(temp,"world");
char *str2=temp;
printf("%s %s\n",str1,str2);
str1
和 str2
都指向内存中的同一点,因此您将获得输出 "world world"。您需要为每个字符串分配内存,以便它们在内存中有自己的位置。
然后在 "expr '+' expr" 模式中,您将 free
每个字符串并创建新的字符串以向上传递解析链。