Compiler construction bison中的多属性

Compiler construction bison中的多属性,compiler-construction,semantics,bison,lexical-analysis,Compiler Construction,Semantics,Bison,Lexical Analysis,我在bison中进行语义分析,我想使用与令牌关联的多属性。我的代码的一个相关部分是: %union semrec { int Type; char *id; } %start prog %token <id> tIDENT %union semrec { int型; 字符*id; } %启动程序 %象征性潮水 在这里,我只能将“id”属性与tIDENT标记一起使用。我还想将“Type”属性与tIDENT标记相关联。为此,我尝试了以下方法: %token

我在bison中进行语义分析,我想使用与令牌关联的多属性。我的代码的一个相关部分是:

%union semrec
{
    int Type;
    char *id;

}

%start prog

%token <id>  tIDENT
%union semrec
{
int型;
字符*id;
}
%启动程序
%象征性潮水
在这里,我只能将“id”属性与tIDENT标记一起使用。我还想将“Type”属性与tIDENT标记相关联。为此,我尝试了以下方法:

 %token <id>  tIDENT
 %token <Type>  tIDENT
 %token <id> <Type> tIDENT
%token tIDENT
%象征性潮水
但它给了我一个重新声明的警告。我还尝试了以下方法:

 %token <id>  tIDENT
 %token <Type>  tIDENT
 %token <id> <Type> tIDENT
%token tIDENT
它也不起作用。我能做什么?我认为这只是一个小的语法问题


谢谢。

你不能这样做:你必须定义你的
%union
,这样所有有多个“属性”的符号都有一个
结构来定义所有这些“属性”。差不多

%union
{
  struct
  {
    int type;
    char *id;
  } type_id;
}
%type <type_id> tIDENT
%union
{
结构
{
int型;
字符*id;
}类型标识;
}
%类型潮汐
并使用
$1.type
$1.id


但是请注意,我非常怀疑你做的事情是否正确。您很可能需要AST(抽象语法树)。您应该查找相关信息。

谢谢,但这次我遇到了以下错误:在扫描仪中,我有这样的内容:[A-Za-z][A-Za-z0-9]*{yylval.id=(char*)strdup(yytext);return tIDENT;}现在它说“YYSTYPE”没有名为“id”的成员,您还必须调整扫描仪,类似于
yylval.type\u id.id=strdup(yytext)
。您可能应该仔细阅读Bison关于语义值的文档。现在可以了,当我将其更改为[A-Za-z][A-Za-z0-9]*{yylval.type_id.id=(char*)strdup(yytext);return tIDENT;}。非常感谢你!