有法

2011-08-07 81 views
1

我的問題法如下:有法

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,不4245.等(這些縮進匹配)

輸出:

1. 
1. 
.1 
    .1 

12 
12 

我的目標是匹配整數和浮點數。

這裏有人能告訴我上面有什麼不對嗎?

+0

那是你的完整的LEX文件?你在做什麼來處理空白?你能顯示一個運行lex的確切日誌,然後運行yylex,以及你提供的輸入的確切副本嗎? –

+0

@Ira Baxter,是的,它是**完整的** LEX文件。 – lexer

+0

你能重現嗎? – lexer

回答

1

晚回答你的問題......但是這是非常值得,我試着更換*你在原來的lex文件(DNUM第二圖案)與+了(因爲這可以確保你至少有一個小數點右邊的數字以便將數字計爲小數......),至少它對我來說似乎很有用。希望這有助於未來的人。


法文件:

%{ 
#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.