HEX

Warning: set_time_limit() [function.set-time-limit]: Cannot set time limit - prohibited by configuration in /home/u547966/brikov.ru/www/wp-content/plugins/admin-menu-editor/menu-editor.php on line 745
Server: Apache
System: Linux 4.19.0-0.bpo.9-amd64 x86_64 at red40
User: u547966 (5490)
PHP: 5.3.29-mh2
Disabled: syslog, dl, popen, proc_open, proc_nice, proc_get_status, proc_close, proc_terminate, posix_mkfifo, chown, chgrp, accelerator_reset, opcache_reset, accelerator_get_status, opcache_get_status, pcntl_alarm, pcntl_fork, pcntl_waitpid, pcntl_wait, pcntl_wifexited, pcntl_wifstopped, pcntl_wifsignaled, pcntl_wifcontinued, pcntl_wexitstatus, pcntl_wtermsig, pcntl_wstopsig, pcntl_signal, pcntl_signal_dispatch, pcntl_get_last_error, pcntl_strerror, pcntl_sigprocmask, pcntl_sigwaitinfo, pcntl_sigtimedwait, pcntl_exec, pcntl_getpriority, pcntl_setpriority
Upload Files
File: //usr/share/doc/libparse-recdescent-perl/examples/demo_OOparsetree.pl
#!/usr/bin/perl -sw

# PARSE AND EVALUATE LOGICAL EXPRESSIONS WITH A OO PARSE TREE

$::RD_AUTOACTION =
	q{ bless [$item[-1]], $item[0] };

use Parse::RecDescent;

my $parse = Parse::RecDescent->new(<<'EOG');

	expr	:	set | clear | disj
	set	:	'set' atom
	clear	:	'clear' atom
	disj	:	<leftop: conj 'or' conj>
				{ bless $item[-1], $item[0] }
	conj	:	<leftop: unary 'and' unary>
				{ bless $item[-1], $item[0] }
	unary	:	neg | bracket | atom
	bracket :	'(' expr ')'  { $item[2] }
	neg	:	'not' unary
	atom	:	/[a-z]+/i
EOG

while (<>)
{
	my $tree = $parse->expr($_);
	print $tree->eval(), "\n" if $tree;
}

BEGIN {@var{qw(a c e)} = (1,1,1);}

sub returning
{
 	 # local $^W;
	 # print +(caller(1))[3], " returning ($_[0])\n";
	$_[0];
}

sub expr::eval     { returning $_[0][0]->eval() }
sub disj::eval     { returning join '', map {$_->eval()} @{$_[0]} }
sub conj::eval     { returning ! join '', map {! $_->eval()} @{$_[0]} }
sub unary::eval    { returning $_[0][0]->eval() }
sub neg::eval	   { returning ! $_[0][0]->eval() }
sub set::eval      { returning $::var{$_[0][0]->name()} = 1 }
sub clear::eval    { returning $::var{$_[0][0]->name()} = 0 }
sub atom::eval     { returning $::var{$_[0][0]} }
sub atom::name     { returning $_[0][0] }