names = John Joe "Mary Sue" James
####
startrule: calculation
statement: grouped_op | number
grouped_op: '(' calculation ')'
calculation: add_calculation | subtract_calculation
add_calculation: statement '+' statement
subtract_calculation: statement '-' statement
number: /\d+/
##
##
#!/usr/bin/perl -wT
use strict;
use Parse::RecDescent;
my $parser = new Parse::RecDescent( q{
startrule: calculation eofile
statement: grouped_op | number
grouped_op: '(' calculation ')'
calculation: add_calculation | subtract_calculation
add_calculation: statement '+' statement
subtract_calculation: statement '-' statement
number: /\d+/
eofile: /^\Z/
} );
my @tests = (
"3", # BAD
"4 + ", # BAD
"4 + 8", # GOOD
"4 + 8 +", # BAD
"6 + (3 - 2)", # GOOD
"6 + ()3 - 2", # BAD
"(6 + (3 - 2)) + 1", # GOOD
"(6 + (3 - 2) + 1)", # BAD
"(6 + 3" # BAD
);
foreach my $test ( @tests ) {
print $test . ': ' .
( defined($parser->startrule( $test ) )?"good":"bad") . "\n";
}
##
##
#!/usr/bin/perl -wT
use strict;
use Parse::RecDescent;
my $parser = new Parse::RecDescent( q{
startrule: calculation eofile { $return = $item[1]; }
statement: grouped_op | number
grouped_op: '(' calculation ')' { $return = $item[2]; }
calculation: add_calculation | subtract_calculation
add_calculation: statement '+' statement { $return = $item[1]+$item[3]; }
subtract_calculation: statement '-' statement { $return = $item[1]-$item[3]; }
number: /\d+/
eofile: /^\Z/
} );
my @tests = (
"4 + 8",
"6 + (3 - 2)",
"(6 + (3 - 2)) + 1",
);
foreach my $test ( @tests ) {
print $test . ': ' . $parser->startrule( $test ) . "\n";
}
# Output is:
#4 + 8: 12
#6 + (3 - 2): 7
#(6 + (3 - 2)) + 1: 8