Bison具有属性的多个非终结符

问题描述 投票:2回答:1

我正在使用bison和flex来创建(在未来的某个地方)一个抽象的合成树(AST)。现在,我想只有一个算术表达式(例如+),类似于表达式 - >表达式'+'表达式|常量,但我希望表达式有两个属性:代码(这是一个字符串,其中包含规则右侧第一个元素的值(RHS),一个+和第二个表达式的值)。

我创建了以下结构:

%union {
    struct{
        char* code;
        char* varn;
    } attributes;

    int intval;
}

这将把它们都作为字符串(现在,我只想打印它们)。令牌和项目以及语法按以下方式定义:

%token <intval> CONST
%type <attributes> expr

%%
expr:
    expr '+' expr 
    {
        printf("%s ",$1.val);
        printf("%s \n",$3.val);
        printf("code: %s %s\n",$1.code,$3.code);
    }
expr:
    CONST 
    {
        int source=$1;
        char temp[100];
        sprintf(temp, "%d", source);
        $$.val=strcat(temp,"1");
        $$.code=temp;
        printf("val for %d is %s; code is %s\n",$1,$$.val,$$.code);
    }

%%

在flex中,我将CONST的值(intval)设置为元素本身(因此val的值为4)。应用第二个规则时,程序将正确打印该值。但是,当应用第一个时(打印整个事物时),两个表达式都具有相同的val。

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

它工作正常。

c parsing bison abstract-syntax-tree flex-lexer
1个回答
0
投票

您的代码所做的与以下内容并没有太大不同:

char temp[100];

strcpy(temp,"hello");
char *str1=temp;

strcpy(temp,"world");
char *str2=temp;

printf("%s %s\n",str1,str2);

str1str2都指向记忆中的同一点,因此你将获得输出“世界世界”。您需要为每个字符串分配内存,以便它们在内存中占有一席之地。

然后在“expr'+'expr”模式中,你将free每个字符串并创建新的字符串来传递解析链。

© www.soinside.com 2019 - 2024. All rights reserved.