我试图为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); }

注意,我没有检查计算的正确性。
根据@rici的注释,修改yytext应该是可以的,因此代码可以简化如下:
<X_REAL>"k"[0-9]+   { yytext[0] = '.';
                      printf("%f", ((atof(yytext) * 1000) + aux * 1000)); }

10-08 12:50