C Flex规范文本

C Flex规范文本,c,flex-lexer,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))); } [0-9]+{LETTER}{yyle

我正在尝试为
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))); }
[0-9]+{LETTER}{yyless(yyleng-1);yy_push_状态(X_REAL);aux=atof(yytext);}
“k”[0-9]+{yytext[0]=”;printf(“%f”),((atof(yytext)*10^(3))+aux*10^(3));)
但是,我在尝试将
放入文本的第一个字符时出错:

在成员函数“virtual int AtScanner::yylex()”中: 错误:从“常量字符*”到“字符”的转换无效 错误:“double”和“int”类型的操作数对二进制“operator^”无效


如何操作yytext?

您不能修改
yytext
,它是
const

您应该走另一条路:也许只是使用分配一个新字符串

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

还有一个问题:
10^3
不能产生1000,在C语言中它是位异或运算符(感谢@Chris指出这一点)。因此,只需将普通1000改为1000

因此,最终代码应该如下所示:

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

您不能修改
yytext
,它是
const

您应该走另一条路:也许只是使用分配一个新字符串

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

还有一个问题:
10^3
不能产生1000,在C语言中它是位异或运算符(感谢@Chris指出这一点)。因此,只需将普通1000改为1000

因此,最终代码应该如下所示:

<X_REAL>"k"[0-9]+   { char* number = strdup(yytext);
                      number[0] = '.';
                      printf("%f", ((atof(number) * 1000) + aux * 1000));
                      free(number); }
修改文本(或副本)似乎是一种不好的方式。为什么不直接提取数字呢

[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); }
修改文本(或副本)似乎是一种不好的方式。为什么不直接提取数字呢

[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); }

我只想用一个点来代替这封信。我现在试着这样做:“k”[0-9]+{std::string num=newstd::string(yytext);num[0]=”;printf(“%f”),((atof(yytext)*10^(3))+aux*10^(3)));它给了我:错误:从'std::string*'转换为非标量类型'std::string'请求的错误:从'const char*'转换为'char'无效错误:从'double'和'int'类型的无效操作数转换为二进制'op@pirezas:然后您必须分配一个新字符串并对其进行解析:
char*copy\u of_yytext=strdup(yytext);copy_of_yytext[0]=…;…free(copy_of_yytext);
我试过你的方法,但从const char*到char
std::string num=new std::string(yytext);
转换错误。只使用
std::string num(yytext);
strdup
对修改
yytext
的限制直接来自于。修改
yytext
是一种古老的技术;参见莱斯克和施密特(Lesk&Schmidt)()在1975年的原始论文中的第三个例子。我只想用一个点替换字母。我现在尝试了这个:“k”[0-9]+{std::string num=new std::string(yytext);num[0]=”printf(“%f”),((atof(yytext)*10^(3))+aux*10^(3)));它给了我:错误:从'std::string*'转换为非标量类型'std::string'请求的错误:从'const char*'转换为'char'无效错误:从'double'和'int'类型的无效操作数转换为二进制'op@pirezas:然后您必须分配一个新字符串并对其进行解析:
char*copy\u of_yytext=strdup(yytext);copy_of_yytext[0]=…;…free(copy_of_yytext);
我试过你的方法,但从const char*到char
std::string num=new std::string(yytext);
转换错误。只使用
std::string num(yytext);
strdup
修改
yytext
的限制直接来自于。修改
yytext
是一种古老的技术;参见莱斯克和施密特(Lesk&Schmidt)1975年原始论文中的第三个例子.
pow
非常慢,乘以/除以10几次会更快。
pow
非常慢,乘以/除以10几次会更快。