2011-09-11 15 views
2

Windows XP(バージョン5.1.2600)でアクティブ状態のPerlバージョン5.12.4を使用しています.Installed ParseLex 2.20。 ApressのPro Perl Parsingの本からこのコードを実行しようとしています。はParse :: 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-> name & $ token-> textは認識されません。 ここには何が欠けていますか?助けてください。

Alexandarの提案によれば、コードを$ lexer-> from(* STDIN)に変更しました。 ([? - \ d +] |( - ?\ d +。\ d *)]を変更しました)今、私が43.4 * 15^2をSTDINに送りたときに得られる出力は

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行目は$ token-> name、 ""、$ token-> text、 "\ n"を出力します。

$lexer->from(\*STDIN); 

更新フルコード:|

+0

あなたはどのような入力を解析しようとしていますか? – bvr

+0

私の入力は43.4 * 15^2です。 –

+0

エラーは、入力文字列の改行によって発生します。これらを解析するためにWS \ s + 'トークンを追加することをお勧めします。 – bvr

答えて

2

それがあるべき "??数 - - \ dは+ \ D * \ D +" と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 演算子Eで未定義の値にメソッド "名前" を呼び出すことはできません^ 数2 :/indigoworkspace/properlparsing/listing1-1.plライン20、ライン1 .Line 20は$ token-> name、 ""、$ token-> text、 "\ n"を出力します。 –

+0

ありがとうアレクサンドル、それは風のように動作します。今私はより良い理解を持っています。 –