Perl Parse :: RecDescent在';'之后不会检测到更多文本

时间:2015-11-15 23:41:10

标签: perl grammar

就像标题所说,我不希望在'''之后检测到更多文字。 使用Parse :: RecDescent我有这个:

$parser = new Parse::RecDescent (q{

    id:   /[a-zA-Z_][a-zA-Z0-9]+/
    data:   "int"|"string"|"float"
    var:data id ';'
});



while(my $line = <DATA>)
        {
          if ($parser->var($line))
          {
            print "Its a var:\t$line\n";
          }
        }

在我的txt文件中,我有:

  

int x; gdgh

和Perl将其打印为“Its a var”

1 个答案:

答案 0 :(得分:0)

您打印输入。所以当然它打印输出。你的解析器甚至不会产生任何有价值的东西,你显然希望它产生它解析的东西,但你没有提供代码来做到这一点。

my $parser = Parse::RecDescent->new(<<'__EOI__');

    {
       my %valid_types = map { $_ => 1 } qw( int string float );
    }

    start    : <skip:''> var_decl
    type     : WS IDENT { $valid_types{$item[2]} } { join '', @item[1,2] }
    var_decl : WS type WS IDENT WS ';'             { join '', @item[1..6] }

    WS       : /\s*/
    IDENT    : /[a-zA-Z_][a-zA-Z0-9]+/
__EOI__

while (my $line = <DATA>) {
   if (defined( my $output = $parser->start($line) )) {
      print "$output\n";
   }
}

不太通用的

my $parser = Parse::RecDescent->new(<<'__EOI__');

    {
       my %valid_types = map { $_ => 1 } qw( int string float );
    }

    start    : var_decl <skip:''> /.*/ { length($item[2]) }
    type     : IDENT { $valid_types{$item[1]} }
    var_decl : type IDENT ';'

    IDENT    : /[a-zA-Z_][a-zA-Z0-9]+/
__EOI__

while (my $line = <DATA>) {
   if (defined( my $extra = $parser->var($line) )) {
      print substr($line, 0, -$extra), "\n";
   }
}

两种解决方案都未经过测试。