2011-12-26 83 views
3

我有这个令牌我.lex文件:如何在flex和bison中获取令牌的字符串值?

[a-zA-Z0-9]+ { yylval = yytext; return ALPHANUM; } 

这个代码我.Y文件:

Sentence: "Sphere(" ALPHANUM ")." 
{ 
FILE* file = fopen("C:/test.txt", "a+"); 
char st1[] = "polySphere -name "; 
strcat(st1, $2); 
strcat(st1, ";"); 
fprintf(file,"%s", st1); 
fclose(file); 
} 

我得到这个错误,当我尝试编译:

警告:传递'strcat'的参数2使得整型指针没有转换

所以$ 2是一个int,我如何使它成为一个字符串?

例如:“Sphere(worldGlobe)”。我想要$ 2在这里获得字符串值worldGlobe。

感谢所有帮助

+0

我删除了Flex标签;这是用于Adobe Flex并添加了引用词法分析器的gnu-flex标签和[我相信]您正在寻找的内容。 – JeffryHouser 2011-12-26 04:00:31

+0

您能否向我们展示您的.y文件中的联合声明以及来自.y文件的ALPHANUM的令牌声明? – MtnViewJohn 2011-12-26 04:46:27

+1

假设您有多个yylval类型。如果你所有返回的都是char *,那么你应该在.y文件的序言部分有'#define YYSTYPE char *'。 – MtnViewJohn 2011-12-26 05:28:36

回答

6

在没有%union声明,野牛定义YYSTYPE为int,所以所有的 符号值都是整数。 其实你有此问题的几个解决方案:

1)的yylval |联合解决方案(推荐):
正如你可能知道的yylval是所使用的词法分析器来存储yytext中变量一个全局变量(yylval = yytext;)所以你应该告诉你的词法分析器哪些类型将向store.you可以简单地将此行添加到您的YACC语法头:

#define YYSTYPE char * 

,你会在这里只存储字符串值。

顺便说一句,如果你想存储你应该在你的yacc文件中指定不同的类型:

%union { 
    char *a; 
    double d; 
    int fn; 
} 

然后在你的法,你将有

[a-zA-Z0-9]+ { **yylval.a** = yytext; return ALPHANUM; } 

2)使用yytext中:

建议:对于yacc中的规则之后的回调我个人更喜欢使用函数。而不是整个代码:)

这个解决方案非常简单。
Sentence: "Sphere("{callback_your_function(yytext);} ALPHANUM ")."

yytext中这里有你自己的ALPHANUM代币的价值,因为它的下一个标记。

+10

我会小心将原始yytext指针粘贴到yylval中。当你下一次操作时,缓冲区被覆盖。如果您有一个解析器将收集多个此类标记放入规则中,并且您同时以$ 1,$ 2引用它们,则这不是一种合适的方法。如果您只是在循环中调用yylex()并逐个处理令牌,则可能会有问题。 – Kaz 2012-03-06 06:56:52