Beefy Boxes and Bandwidth Generously Provided by pair Networks
XP is just a number
 
PerlMonks  

Re: Still having trouble with regexes! Please help

by choroba (Cardinal)
on Jan 31, 2016 at 14:48 UTC ( [id://1154138]=note: print w/replies, xml ) Need Help??


in reply to Still having trouble with regexes! Please help

As I've shown you, there are other solutions than using regular expression to solve the problem. As it seems, your original question didn't involve the negation of a literal. It's easy to adapt the non-regex solutions to handle it, adapting the regex solution is left as an exercise for the reader.

Also note that your new expression is invalid: the number of left and right parentheses isn't the same. I added one more ) to the end.

Walking the string manually:

#!/usr/bin/perl use warnings; use strict; for my $given ( "(A & B)'", "((A & B)' | (A & C & (A & B & D)'))", "((A | B)' & (C | (D & (E & F)))')'", "((A & B)' | (A & C & (A & B & D | (A & (B' & D)')'))" ) { my @left; my $calc = $given; my $last; for my $pos (0 .. length($given) - 1) { my $current = substr $given, $pos, 1; push @left, $pos if '(' eq $current; $last = pop @left if ')' eq $current; if ("'" eq $current) { substr $calc, $pos, 1, q(); if (')' eq substr $calc, $pos - 1, 1) { # Negated parenthe +ses. substr $calc, $last, 0, '!'; } else { # Negated literal. substr $calc, $pos - 1, 0, '!'; } } } print "Given: $given\n"; print "Calculated: $calc\n"; }

Writing a parser (no change required, I just changed the whitespace behaviour to make it even easier):

#!/usr/bin/perl use warnings; use strict; use Marpa::R2; my $dsl = << '__DSL__'; :default ::= action => concat lexeme default = latm => 1 Expression ::= '(' Expression ')' assoc => group | literal | Expression quote action => negation || Expression operator Expression quote ~ ['] # ' operator ~ [&|] literal ~ [A-Z] :discard ~ sp sp ~ [\s]+ __DSL__ my $i = 0; sub concat { $i++; join ' ', @_[ 1 .. $#_ ] } sub negation { $i++; "!$_[1]" } my $grammar = 'Marpa::R2::Scanless::G'->new({ source => \$dsl }); for my $given ( "(A & B)'", "((A & B)' | (A & C & (A & B & D)'))", "((A | B)' & (C | (D & (E & F)))')'", "((A & B)' | (A & C & (A & B & D | (A & (B' & D)')'))) +" ) { my $calc = $grammar->parse(\$given, { semantics_package => 'main' +}); print "Given: $given\n"; print "Calculated: $$calc\n"; }
($q=q:Sq=~/;[c](.)(.)/;chr(-||-|5+lengthSq)`"S|oS2"`map{chr |+ord }map{substrSq`S_+|`|}3E|-|`7**2-3:)=~y+S|`+$1,++print+eval$q,q,a,

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1154138]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others wandering the Monastery: (8)
As of 2024-04-23 13:14 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found