Спецификация Flex yytext - PullRequest
       15

Спецификация Flex yytext

1 голос
/ 30 марта 2011

Я пытаюсь создать гибкую спецификацию для нотации k, например: 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" для двоичного оператора "^"

Как я могу манипулировать yytext?

Ответы [ 2 ]

3 голосов
/ 30 марта 2011

Вы не можете изменить yytext, это const.

Вы должны пойти другим путем: возможно, просто выделите новую строку, используя strdup?

Другая проблема: yytext[0] - это char, поэтому должно быть и правое.Поэтому нам нужно '.' вместо ".".

Еще одна проблема: 10^3 не производит 1000, в C это побитовый исключающий оператор OR (спасибо @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)); }
1 голос
/ 30 марта 2011

Изменение 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); }
...