就像标题所说,我不希望在'''之后检测到更多文字。 使用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”
答案 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";
}
}
两种解决方案都未经过测试。