Perl 为什么Parse::RecDescent会给我所有这些警告和错误?
下面的Perl文件解析代码让人非常痛苦[最后一次回复是在PM@follow:Perl 为什么Parse::RecDescent会给我所有这些警告和错误?,perl,parsing,parse-recdescent,Perl,Parsing,Parse Recdescent,下面的Perl文件解析代码让人非常痛苦[最后一次回复是在PM@follow: !/usr/bin/perl-w 严格使用; 使用警告; #使用诊断; 使用Parse::RecDescent; 使用数据::转储程序; #在Parse::RecDescent模块中启用警告。 $::RD_ERRORS=1;#确保解析器在遇到错误时死亡 $::RD_WARN=1;#启用警告。这将对未使用的规则发出警告&c。 $::RD_HINT=1;#给出提示以帮助解决问题。 #$::RD_TRACE=1;#解析器的跟
!/usr/bin/perl-w
严格使用;
使用警告;
#使用诊断;
使用Parse::RecDescent;
使用数据::转储程序;
#在Parse::RecDescent模块中启用警告。
$::RD_ERRORS=1;#确保解析器在遇到错误时死亡
$::RD_WARN=1;#启用警告。这将对未使用的规则发出警告&c。
$::RD_HINT=1;#给出提示以帮助解决问题。
#$::RD_TRACE=1;#解析器的跟踪
#$::AUTOSTUB=1;
my$grammar=Dump([$text],“fieldStuff”]);
$return={fieldName=>$item[2],fieldValue=>$item[3]};
}
元字段:/^\#/metaName元字段值
{
#打印“[*]已获取名为\'”$item{metaName}.\'的元字段,值为\'.$item{metaFieldValue}.\'\n”;
#打印“[*]已获取名为\'”$item[2].\'的元字段,其值为\'.$item[3]。“\'\n”;
$return={metaName=>$item[2],metaFieldValue=>$item[3]};
}
记录正文:字段
{
打印“\n[*]个字段\n”;
#打印main::Dumper\@项;
#打印数据::转储程序->转储([@item],“字段)”);
$return='字段';
#如果((长度($text)>3)和&(0=@item))
如果(长度($text)>2)
{
$return=undf;
}
}
|
元域(s)
{
打印“\n[*]元字段\n”;
#打印main::Dumper\@项;
#打印数据::转储程序->转储([@item],“元字段]);
$return='metaField';
#如果((长度($text)>3)和&(0=@item))
如果(长度($text)>2)
{
$return=undf;
}
}
|
#
#startOfRecord:RECORDSTART recordBody(s/$/)RECORDEND
startOfRecord:RECORDSTART recordBody RECORDEND
#startOfRecord:RECORDSTART(元字段)RECORDEND
#startOfRecord:RECORDSTART(字段)metaField(字段))RECORDEND
{
#打印main::Dumper\@项;
$return='something';
#$return=$item[1];
1.
}
|
#
_地理语法_
#$skeletonPattern=“#输入_类型[\t]*”;
#我的$metaFieldPattern=qr/[\t]*.#([^\t]+)[\t]+(.*)/o;#“#输入类型SCDR+”,“#文件名已处理\u 01_20080616001403.cdr”等
#我的$normalFieldPattern=qr/([\t]*)([0-9]*)F[\t]+([^\t]+)[\t]+([^\t\r\n]+)(.*)/;#“1F S#U Diagnostic162”或“F S#U Diagnostic162”或“F S#U Diagnostic162”是同义词,等等
我的$testData0=我认为在XP上选择ActivePerl很好;唯一的问题是语法
recordBody的语法规则规定,内部只能有多个字段或多个元字段,中间不能有任何内容
如果您需要字段/元字段的混合,我建议创建一些人工规则anyField
anyField : field | metaField
recordBody : anyField(s)
它是有效的,但我不明白为什么-你能给我指一个资源,让我澄清对我的基本误解吗?还要注意,根据你的建议,语法仍然失败,只有$testData4(meta)有空值的字段,不同于其他$testData'sSorry,我知道没有指针-我只使用了关于(ANTLR表示法)G:(X*)(Y*)和G:(X | Y)*之间区别的常识。前者说“如果你选择第一个选项,匹配所有的X而不是Y;否则,匹配所有的Y而不是X”“匹配X或Y,然后匹配X或Y。。。"“具有空值的元字段”问题可能是由您的元名称规则引起的,尤其是结尾处的“\n”;“这会占用换行符,而下面的元字段值没有任何匹配项。如果您希望每行有一个字段,最好不要在名称/值中处理行尾…而是在字段规则中处理;这有助于保留您的san。”你可能想看看这里:寻找一些关于空格处理的指针。
RECORD
F ptc_record_length 00B6
F ptc_charging_start_time 20090604093721
F ptc_charging_end_time 20080604093721
F ptc_called_msrn_ton FF
F ptc_term_mcz_duration 060000
.
[*] field(s)
Parsing done sucessfully!
RECORD
#input_id 91210758171x001_0013
#input_type PTC
#output_type MTC
#source_id 01
#filename TTFILE01-0001-20080101000000
#jingalama valuewith#inIt andaSpace
.
[*] metaField(s)
Parsing done sucessfully!
RECORD
F ptc_record_length 00B6
F ptc_charging_start_time 20090604093721
F ptc_charging_end_time 20080604093721
F ptc_called_msrn_ton FF
F ptc_term_mcz_duration 060000
#input_id 91210758171x001_0013
#input_type PTC
#output_type MTC
#source_id 01
#filename TTFILE01-0001-20080101000000
#jingalama valuewith#inIt andaSpace
.
[*] field(s)
Bad input!
RECORD
#input_id 91210758171x001_0013
#input_type PTC
#output_type MTC
#source_id 01
#filename TTFILE01-0001-20080101000000
#jingalama valuewith#inIt andaSpace
F ptc_record_length 00B6
F ptc_charging_start_time 20090604093721
F ptc_charging_end_time 20080604093721
F ptc_called_msrn_ton FF
F ptc_term_mcz_duration 060000
.
[*] metaField(s)
Bad input!
RECORD
#input_id 91210758171x001_0013
#output_id
#input_type PTC
#output_type PTC
#addkey
#source_id 01
#filename TTFILE01-0001-20080101000000
F ptc_record_length 00B6
F ptc_record_type
F ptc_charging_start_time 20090604093721
F ptc_charging_end_time 20080604093721
F ptc_called_msrn_ton FF
F ptc_term_mcz_duration 060000
F ptc_term_mcz_change_direction
.
[*] metaField(s)
Bad input!
print() on closed filehandle ERROR at C:/laPerl/site/lib/Parse/RecDescent.pm line 2905.
Variable "$errortext" is not available at C:/laPerl/site/lib/Parse/RecDescent.pm line 2906.
Variable "$errorprefix" is not available at C:/laPerl/site/lib/Parse/RecDescent.pm line 2906.
Use of uninitialized value $errorprefix in formline at C:/laPerl/site/lib/Parse/RecDescent.pm line 2850.
Use of uninitialized value $errortext in formline at C:/laPerl/site/lib/Parse/RecDescent.pm line 2850.
Use of uninitialized value $errortext in formline at C:/laPerl/site/lib/Parse/RecDescent.pm line 2852.
write() on closed filehandle ERROR at C:/laPerl/site/lib/Parse/RecDescent.pm line 2906.
...
anyField : field | metaField
recordBody : anyField(s)