2017-01-15 4 views
0

Я пытаюсь использовать lex для обнаружения числа с плавающей запятой. Следующий код с входом + 4.23e-21 дает OUTPUTИспользование lex для обнаружения чисел с плавающей запятой

{4,23} е-21

Я хочу, чтобы напечатать

{+ 4.23e-21}

Что я делаю не так и как это исправить?

%{ 
#include <stdio.h> 

int N_count = 0; 
%} 

Sign [+-] 

Num [0-9] 

Expo [eE]{Sign}?{Num}+ 

F {Sign}?({Num}*\.{Num}+)(Expo)? 
%% 
{F} {printf("Float = {%s}\n", yytext); N_count++;} 

%% 

int main() 
{ 

    yyin = fopen("test.txt", "r"); 
    yylex(); 
    printf("%d\n", N_count); 
    return 0; 

} 

ответ

0

Попробуйте использовать ({Expo}) вместо (Expo) при указании F. Я также рекомендую Sign "+"|"-" избежать незавершенного диапазона символов [х-у] в Sign [+-].

+0

'[+ -]' и '[- +]' работают в любой системе с регулярным выражением даже в умеренно posix, включая любую производную lex, о которой я знаю, потому что '-' следует рассматривать как обычный символ в начале и конце класса символов. – rici

+0

@rici достаточно справедливо. Но это немного эзотерическое правило, тогда как «двойные кавычки подавляют метасимволы» просты и просты. :-) – Jens

+0

... но не будет работать за пределами индивидуальной гибкой среды. Обратные косые черты вводят другое неясное правило (базовое или расширенное?), Так что «положить - в начале или в конце и поставить» в начале »правило имеет некоторое обаяние :-) – rici