Flex规范yytext

我试图为k表示法建立一个flex规范,例如: 3k5 = 3500 。 我有以下几点:

[0-9]+{LETTER}      { yyless(yyleng-1); yy_push_state(X_REAL); aux = atof(yytext); }
<X_REAL>"k"[0-9]+   { yytext[0] = "." ; printf("%f", ((atof(yytext) * 10^(3)) + aux * 10^(3))); }

但是,当我试图放置"."时出现错误"." 在yytext的第一个字符中:

在成员函数'virtual int AtScanner :: yylex()'中:错误:从'const char *'无效转换为'char'错误:类型'double'和'int'的无效操作数给二进制'operator ^'

我如何操作yytext?


你不能修改yytext ,它是const

你应该换一种方式:也许只是使用strdup分配一个新的字符串?

其他问题: yytext[0]是一个char ,所以应该是rhs。 所以我们需要'.' 而不是"."

还有一个问题: 10^3不生成1000,在C中它是按位异或运算符(感谢@Chris指出了这一点)。 所以只需要把普通的1000代替。

所以,最终的代码应该如下所示:

<X_REAL>"k"[0-9]+   { char* number = strdup(yytext);
                      number[0] = '.';
                      printf("%f", ((atof(number) * 1000) + aux * 1000));
                      free(number); }

请注意,我没有检查计算的正确性。


修改yytext(或副本)似乎是一个很好的解决方法。 为什么不直接提取数字?

[0-9]+k[0-9]+    { char *p;
                   long first = strtol(yytext, &p, 10);
                   long second = strtol(p+1, 0, 10);
                   double value = first*1000.0 + second*pow(10.0, p-yytext-yyleng+4.0);
                   printf("%f", value); }
链接地址: http://www.djcxy.com/p/57863.html

上一篇: Flex Specification yytext

下一篇: Compilation error with flex file