2011-09-11 67 views
2

我在Windows XP(版本5.1.2600)上使用來自活動狀態的Perl版本5.12.4。安裝了ParseLex 2.20。 嘗試從Apress的Pro Perl解析書中運行此代碼。無法使用Parse :: Lex解析:: Lex

#!/usr/bin/perl 

use Parse::Lex; 

#defines the tokens 
@token=qw( 
BegParen [\(] 
EndParen [\)] 
Operator [-+*/^] 
Number [-?\d+|-?\d+\.\d*] 
); 
$lexer=Parse::Lex->new(@token); #Specifies the lexer 
$lexer->from(STDIN); #Specifies the input source 

TOKEN: 
while(1){ #1 will be returned unless EOI 
$token=$lexer->next; 
if(not $lexer->eoi){ 
    print $token->name . " " . $token->text . " " . "\n"; 
} 
else {last TOKEN;} 
} 

由於這不起作用,我簡化了Number [ - ?\ d +]。 它告訴我「無法調用方法」名稱「未定義的值」。它不承認$ token->名稱& $ token-> text。 我在這裏錯過了什麼?請幫忙。

根據亞歷山大的建議,我已將代碼更改爲$ lexer-> from(* STDIN);並且能夠成功從stdin中讀取數據,並且改變了Number [( - ?\ d +)|( - ?\ d +。\ d *)]現在當我向STDIN提供43.4 * 15^2時,我得到的輸出是:

Number 4 
Number 3 
Number . 
Number 4 
Operator * 
Number 1 
Number 5 
Operator^
Number 2 
Can't call method "name" on an undefined value at listing1-1.pl line 20, <STDIN>. 

這裏第20行是print $ token-> name,「」,$ token-> text,「\ n」。

+0

你試圖解析什麼輸入? – bvr

+0

我的輸入是43.4 * 15^2。 –

+0

錯誤是由輸入字符串中的換行符引起的。我建議添加'WS \ s +'標記來解析這些標記。 – bvr

回答

2

它應該是 「數量 - \ d + | - \ d + \ d *?」,並從標準輸入 「從」 方法應該叫這種方式來閱讀:

$lexer->from(\*STDIN); 

更新全碼具有更好的錯誤處理和修復:

#!/usr/bin/perl 

use Parse::Lex; 

#defines the tokens 
my @token=(qw( 
BegParen [\(] 
EndParen [\)] 
Operator [-+*/^] 
Number -?\d+(?:\.\d*)? 
NEWLINE \n 
    ), 
    qw(ERROR (?s:.*)), sub { 
     print STDERR "ERROR: buffer content->", $_[0]->lexer->buffer, "<-\n"; 
     die qq!can\'t analyze: "$_[1]"!; 
    } 
); 
my $lexer=Parse::Lex->new(@token); #Specifies the lexer 
$lexer->from(\*STDIN); #Specifies the input source 

TOKEN: 
while(1){ #1 will be returned unless EOI 
    my $token=$lexer->next; 
    if (not $lexer->eoi){ 
    print $token->name . " " . $token->text . " " . "\n"; 
    } 
    else {last TOKEN;} 
} 

另請參閱Parse::Lex documentation

+0

你對STDIN的閱讀建議是完美的。現在我在STDIN上給它43.4 * 15^2並獲得輸出----------------------數字4 3號碼 號碼。 數4 操作員* 數1 編號5 算^ 數2 上E處未定義的值無法調用方法 「姓名」:/indigoworkspace/properlparsing/listing1-1.pl線20,線1 。線20是print $ token-> name,「」,$ token-> text,「\ n」。 –

+0

謝謝亞歷山大,它像微風一樣工作。現在我有更好的理解。 –