我的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) = @_;
答案 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,显示解析堆栈)
...