Bison/Flex解析器获取字符串作为令牌值

Bison/Flex解析器获取字符串作为令牌值,bison,flex-lexer,Bison,Flex Lexer,我目前正在使用bison和flex作为标记器开发一个verilog解析器。我的语法很好,现在我的目标是将收集的数据存储在数据库中。 (如果你不知道什么是verilog,这并不重要,但你可以在这里找到信息:) 我目前一直在获取令牌值。我的语法主要由字符串和一些数字组成 我浏览了互联网,找到了一些有用的东西,让我写出了这样的法律规则: [A-Za-z_]+[A-Za-z0-9_$]* { lline = yylineno;yylval.str = strdup(yytext); re

我目前正在使用bison和flex作为标记器开发一个verilog解析器。我的语法很好,现在我的目标是将收集的数据存储在数据库中。 (如果你不知道什么是verilog,这并不重要,但你可以在这里找到信息:)

我目前一直在获取令牌值。我的语法主要由字符串和一些数字组成

我浏览了互联网,找到了一些有用的东西,让我写出了这样的法律规则:

[A-Za-z_]+[A-Za-z0-9_$]* {
    lline = yylineno;yylval.str = strdup(yytext);
    return K_IDENTIFIER;
}
在我的bison输入文件.y中,我做了一些调整

#define YYSTYPE char*
....
%union {char* str;
  double val;
}
%token<str>K_IDENTIFIER
...
beginning of the grammar rules
#定义YYSTYPE字符*
....
%联合{char*str;
双val;
}
%令牌K_标识符
...
语法规则的开头
现在,当我有一个包含K_标识符的语法规则,比如

module : K_MODULE K_IDENTIFIER list_of_ports_parameters K_POINTVIRG
{cout << "the value of K_IDENTIFIER is :"<< $2.str << endl;}
list_of_module_itemsE
    K_ENDMODULE
module:K_模块K_标识符列表K_端口K_参数K_点virg

{cout对于
%union
,没有必要为
YYSTYPE
定义
;这可能是问题的一部分。Bison将自动选择合适的union成员,因此您只需要
$2
引用值,而不需要
$2.str
,即:

{ cout << "the value of K_IDENTIFIER is: " << $2 << endl; }

{我很确定你是想用gnu Flex而不是Adobe Flex来标记它,所以我重新标记了它。是的,谢谢你的排印修复。我稍微整理了一下你的格式。如果你有一大块代码,请将其缩进四个空格。这比尝试使用反勾号要好得多。非常感谢,这就成功了!我知道我应该这样做之前的寄存器堆栈溢出^^