无法使用Parse :: Lex进行解析

时间:2011-09-11 03:29:14

标签: perl

我在Windows XP(版本5.1.2600)上使用活动状态的Perl版本5.12.4。安装了ParseLex 2.20。 试图从Apress的Pro Perl Parsing书中运行此代码。

#!/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;}
}

由于这不起作用,我简化了数字[ - ?\ d +]。 它告诉我“无法调用方法”名称“在未定义的值上”。它无法识别$ token-> name& $令牌的>文字。 我在这里缺少什么?请帮忙。

根据Alexandar的建议,我已将代码更改为$ lexer-&gt; from(* STDIN);并且能够成功地从stdin读取。也改变了数字[( - ?\ d +)|( - ?\ d +。\ d *)]。现在,当我向STDIN输入43.4 * 15 ^ 2时,我得到的输出是:< / p>

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-&gt; name,“”,$ token-&gt; text,“\ n”。

1 个答案:

答案 0 :(得分:2)

它应该是“Number - ?\ d + | - ?\ d +。\ d *”并且从STDIN“from”方法读取应该这样调用:

$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