Есть проблема с lex - PullRequest
       35

Есть проблема с lex

1 голос
/ 07 августа 2011

Мой лекс выглядит следующим образом:

LNUM    [0-9]+
DNUM([0-9]*"."[0-9]+)|([0-9]+"."[0-9]*)                                                                                    
%%
{LNUM} {
printf("\t");ECHO;printf("\r\n");
}

{DNUM} {
printf("\t");ECHO;printf("\r\n");
}

Но оказывается, что он может соответствовать только числам, таким как 4.12 .2, но не 42, 45. и т. Д. (С отступом совпадают)

Вывод:

1.
1.
.1
    .1

12
12

Моя цель - сопоставить как целые числа, так и числа с плавающей точкой.

Может кто-нибудь здесь сказать мне, что случилось выше?

1 Ответ

1 голос
/ 14 марта 2013

Поздний ответ на ваш вопрос ... но ради чего я пытался заменить *, который вы имели в исходном файле lex (второй шаблон для DNUM), на + (потому что это гарантирует, что у вас есть по крайней мере одна цифра справа от десятичной запятой, чтобы число считалось десятичным ...) Надеюсь, что это поможет кому-то в будущем.


Файл lex:

%{
#include <iostream>
using namespace std;
%}

LNUM    [0-9]+
DNUM    ([0-9]*"."[0-9]+)|([0-9]+"."[0-9]+) 

%option noyywrap

%%
{LNUM}*  { cout << "lnum: " << yytext << endl; }
{DNUM}*  { cout << "dnum: " << yytext << endl; }
%%

int main(int argc, char ** argv)
{
    yylex();
    return 0;
}

пример ввода (в командной строке):

$ echo "4.12 .2 42 45. " | ./lexer
dnum: 4.12
dnum: .2
lnum: 42
lnum: 45.
...