build_parser.pl
:
use strict;
use warnings;
use Parse::RecDescent qw( );
Parse::RecDescent->Precompile(<<'__EOS__', "Parser");
{
# The code in rules is also covered by these pragmas.
use strict;
use warnings;
sub dequote { substr($_[0], 1, -1) =~ s/\\(.)/$1/srg }
}
start : assign /\Z/ { $item[1] }
assign : lvalue '=' expr { [ 'assign', $item[1], $item[3] ] }
lvalue : IDENT
expr : NUM_LIT { [ 'num_const', $item[1] ] }
| STR_LIT { [ 'str_const', $item[1] ] }
# TOKENS
# ----------------------------------------
IDENT : \w+
NUM_LIT : /[0-9]+/
STR_LIT : /'(?:[^'\\]++|\\.)*+'/s { dequote($item[1]) }
| /"(?:[^"\\]++|\\.)*+"/s { dequote($item[1]) }
__EOS__
根据您的需要调整字符串文字的定义(但请记住同时调整规则和dequote
)。
运行build_parser.pl
会生成Parser.pm
,可以如下使用:
use strict;
use warnings;
use FindBin qw( $RealBin );
use lib $RealBin;
use Data::Dumper qw( Dumper );
use Parser qw( );
my $parser = Parser->new();
print(Dumper( $parser->start('x = 2') ));