Skip to content

Instantly share code, notes, and snippets.

@rns
Created May 12, 2015 11:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rns/962fdb4f30d0681cc07d to your computer and use it in GitHub Desktop.
Save rns/962fdb4f30d0681cc07d to your computer and use it in GitHub Desktop.
unspaced minus warning
use 5.010;
use strict;
use warnings;
use Data::Dumper;
$Data::Dumper::Indent = 0;
$Data::Dumper::Terse = 1;
$Data::Dumper::Deepcopy = 1;
use Marpa::R2;
my $g = Marpa::R2::Scanless::G->new( { source => \(<<'END_OF_SOURCE'),
:default ::= action => [ name, value]
lexeme default = action => [ name, value] latm => 1
s ::= e+ separator => sep
sep ~ [,\s]+
e ::= n
|| e '*' e
| e (ws) '*' (ws) e
| e '/' e
| e (ws) '/' (ws) e
|| e '+' e
| e (ws) '+' (ws) e
| (<awkward minus start>) e '-' e (<awkward minus end>)
| e (ws) '-' (ws) e
n ~ [\d]+
ws ~ [\s]+
<awkward minus start> ::=
<awkward minus end> ::=
event 'awkward minus start' = nulled <awkward minus start>
event 'awkward minus end' = nulled <awkward minus end>
END_OF_SOURCE
} );
my $input = <<EOI;
12, 34 - 56, 34-56, 78
EOI
my $r = Marpa::R2::Scanless::R->new( {
grammar => $g,
trace_terminals => 0
} );
my $awkward_minus_start_pos;
INPUT: for(
my $pos = $r->read( \$input );
$pos < length($input);
$pos = $r->resume($pos)
) {
EVENTS: {
for my $event (@{ $r->events }) {
my ($name) = @{$event};
if ($name eq 'awkward minus start') {
$awkward_minus_start_pos = $pos
}
elsif ($name eq 'awkward minus end') {
say STDERR "Warning: awkward minus at $awkward_minus_start_pos in '",
$r->literal($awkward_minus_start_pos, $pos - $awkward_minus_start_pos),
"', please use spaces on both sides.";
}
} # for my $event
}
}
say Dumper ${ $r->value };
Warning: awkward minus at 13 in '34-56', please use spaces on both sides.
['s',['e',['n','12']],['e',['e',['n','34']],'-',['e',['n','56']]],['e',['e',['n','34']],'-',['e',['n','56']]],['e',['n','78']]]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment