c/c++语言开发共享如何在flex和bison中获取令牌的字符串值?

我的.lex文件中有这个令牌:

[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。

谢谢你的帮助

    在没有%union声明的情况下,bison将YYSTYPE定义为int,因此所有符号值都是整数。 事实上,你有一些解决这个问题的方法:

    1)yylval | union解决方案(推荐):
    您可能知道yylval是词法分析器用来存储yytext变量( yylval = yytext; )的全局变量,因此您应该告诉词法分析器您要存储哪些类型。您可以简单地将此行添加到YACC语法的标题中:

     #define YYSTYPE char * 

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

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

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

    然后在你的lex中你会有

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

    2)使用yytext:

    建议:对于yacc i中规则之后的回调,个人更喜欢使用函数。 不像你那样完整的代码:)

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

    这里的yytext将具有您的ALPHANUM标记的值,因为它是下一个标记。

      以上就是c/c++开发分享如何在flex和bison中获取令牌的字符串值?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/562481.html

      (0)
      上一篇 2021年2月4日
      下一篇 2021年2月4日

      精彩推荐