Flex规范yytext

时间:2011-03-29 21:20:27

标签: c flex-lexer

我正在尝试为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?

2 个答案:

答案 0 :(得分:3)

您无法修改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); }

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


Per @ rici的评论,修改yytext应该没问题,所以代码可以简化如下:

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

答案 1 :(得分:1)

修改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); }