flex/bison中的唯一令牌标识符

flex/bison中的唯一令牌标识符,bison,flex-lexer,Bison,Flex Lexer,有没有办法为flex读取的每个令牌创建uniquie标识符 例: flex: "+" {yylval.string =yytext;return PLUS;} [0-9]+ { yylval.string =yytext; return INT;} E: INT PLUS INT { Node($1.ID);Node(PLUS.ID);Node($3.ID);Edge(PLUS.ID,$1.ID);Edge(PLUS.ID,$3.ID); } 野牛: "+" {yylva

有没有办法为flex读取的每个令牌创建uniquie标识符

例:

flex:

"+"     {yylval.string =yytext;return PLUS;}

[0-9]+ {
yylval.string =yytext;
return INT;}
E: INT PLUS INT 
{
Node($1.ID);Node(PLUS.ID);Node($3.ID);Edge(PLUS.ID,$1.ID);Edge(PLUS.ID,$3.ID);
}
野牛:

"+"     {yylval.string =yytext;return PLUS;}

[0-9]+ {
yylval.string =yytext;
return INT;}
E: INT PLUS INT 
{
Node($1.ID);Node(PLUS.ID);Node($3.ID);Edge(PLUS.ID,$1.ID);Edge(PLUS.ID,$3.ID);
}
每次有输入时,都会创建唯一的节点。 这只是我想完成的一个例子。调用Node(…)和Edge(…)时,将打印到文件中,该文件稍后将转换为图形。 我希望它们是独一无二的,因为我想创建以下内容:

而不是这个:


其他类型的解决方案也受欢迎

显而易见且最简单的方法是使用一个全局变量,并在每次需要一个新的节点ID时递增它。无论是在lexer中还是在解析器中这样做,都或多或少是不相关的;这两种方式都有争议。如果您在解析器中这样做,那么您可以使用局部变量,以防您对全局变量过敏(尽管在这种情况下,您也可以使用“可重入”flex扫描仪)