“错误:非法声明子程序”是什么意思?

时间:2010-07-05 05:39:42

标签: perl

我的Perl模块出错“错误:非法声明子程序”。那是什么意思?我尝试使用谷歌搜索并得到the following unhelpful information

  

有一个新的编译错误,   非法声明子程序,用于   一个模糊的语法错误案例。

导致错误的代码是这样的(截断以显示问题):

    $dbh->do ($stm); # ACTUAL ERROR IS THE SEMICOLON HERE
    or croak "Can't insert using '$stm': ", $dbh->errstr;
    return $dbh->last_insert_id ('', '', '', '');
}

sub insert_check # ERROR MESSAGE IS PRINTED FOR THIS LINE
{
    my ($dba, $table, $set) = @_;

2 个答案:

答案 0 :(得分:4)

这是非法的Perl代码:'或'是中缀运算符,因此无法启动语句。

删除';'修复代码(或生成代码的代码)并且错误将消失。

答案 1 :(得分:0)

填补足够的空白以重现问题

 1  #! /usr/bin/perl
 2  
 3  use Carp;
 4  
 5  sub foo {
 6      $dbh->do ($stm);
 7      or croak "Can't insert using '$stm': ", $dbh->errstr;
 8      return $dbh->last_insert_id ('', '', '', '');
 9  }
10  
11  sub insert_check
12  {
13      my ($dba, $table, $set) = @_;
14  }

然后将它提供给编译器,我得到了

$ perl5.10.1 -cw kinopiko.pl
syntax error at prog.pl line 7, near "or"
Illegal declaration of subroutine main::insert_check at prog.pl line 11.

如您所见,第一个错误是杂散分号的结果。就Perl的语法而言,第6行在语法上是正确的。

通常,由于实现解析器的常用技术,您希望在第一个错误处开始修复语法错误。想象一下,使用编译器只诊断它遇到的第一个错误。 “我快到了!”你认为只会对下一次运行感到失望 - 然后是下一次和下次运行。为了避免让用户感到沮丧并推动一些人超越边缘,解析器会尽力继续按page 205 of flex & bison所述继续:

  

Bison错误恢复

     

Bison有一些错误恢复的规定,可以使用特殊用途的错误令牌。本质上,错误令牌用于在语法中查找同步点,处理可以继续进行。那可能是 ,不确定。有时,恢复尝试不会删除足够的错误状态以继续,并且错误消息将级联。解析器将到达处理可以继续的点,否则整个解析器将中止。

     

报告语法错误后,bison解析器会丢弃解析堆栈中的符号,直到找到可以移动错误令牌的状态。然后它会读取并丢弃输入令牌,直到找到一个可以跟随语法中的错误令牌的令牌。后一个过程称为重新同步。然后它恢复在恢复状态下解析,该状态不报告后续解析错误。一旦成功移动了三个令牌,它就会假定恢复完成,离开恢复状态,并恢复正常解析。

请注意,generating perl's parser中包含bison

如果您足够好奇,可以深入了解解析器在重新同步后发现自己的状态,请使用-Dp or -Dpv选项启动perl DEBUGGING

  

-Dletters

     

-Dnumber

     

设置调试标志。要查看它如何执行您的程序,请使用-Dtls。 (这只有在将调试编译到Perl中时才有效。)另一个不错的值是-Dx,它列出了编译的语法树。 -Dr显示已编译的正则表达式;输出的格式在perldebguts中解释。

     

作为替代方案,请指定一个数字而不是字母列表(例如,-D14相当于-Dtls):

     

1 p标记和解析(使用v,显示解析堆栈)
  ...