PATH:
usr
/
share
/
doc
/
perl-Parse-RecDescent-1.967009
/
demo
#!/usr/bin/perl -ws #SHARED SYMBOL_TABLE my %symbol_table = (); package Operation; sub new { my ($class, %args) = @_; bless \%args, $class; } package Assignment_Op; @ISA = qw( Operation ); sub eval { my ($self) = @_; $symbol_table{$self->{var}->{name}} = $self->{value}->eval(); } package Addition_Op; @ISA = qw ( Operation ); sub eval { my ($self) = @_; return $self->{left}->eval() + $self->{right}->eval(); } package Multiplication_Op; @ISA = qw ( Operation ); sub eval { my ($self) = @_; return $self->{left}->eval() * $self->{right}->eval(); } package IfThenElse_Op; @ISA = qw ( Operation ); sub eval { my ($self) = @_; if ($self->{condition}->eval() ) { return $self->{true_expr}->eval(); } else { return $self->{false_expr}->eval(); } } package LessThan_Op; @ISA = qw ( Operation ); sub eval { my ($self) = @_; return $self->{left}->eval() < $self->{right}->eval(); } package Value_Op; @ISA = qw( Operation ); sub eval { my ($self) = @_; return $self->{value}; } package Variable_Op; @ISA = qw( Operation ); sub eval { my ($self) = @_; return $symbol_table{$self->{name}}; } package Sequence_Op; sub new { my ($class, $list_ref) = @_; bless $list_ref, $class; } sub eval { my ($self) = @_; my $last_val; foreach my $statement ( @$self ) { $last_val = $statement->eval(); } return $last_val; } package main; use Parse::RecDescent; my $grammar = q { Script: Statement(s) /^$/ { Sequence_Op->new( $item[1] ) } Statement: Assignment | IfThenElse | Expression | <error> Assignment: Variable '<-' Expression { Assignment_Op->new( var => $item[1], value => $item[3]) } Expression: Product "+" Expression { Addition_Op->new( left => $item[1], right => $item[3] ) } | Product Product: Value "*" Product { Multiplication_Op->new( left => $item[1], right => $item[3] ) } | Value Value: /\d+/ { Value_Op->new( value => $item[1] ) } | Variable Variable: /(?!if)[a-z]/ { Variable_Op->new( name => $item[1] ); } IfThenElse: 'if' Condition 'then' Statement 'else' Statement { IfThenElse_Op->new( condition => $item[2], true_expr => $item[4], false_expr => $item[6]) } Condition: Expression '<' Expression { LessThan_Op->new( left => $item[1], right => $item[3] ) } }; my $parser = Parse::RecDescent->new($grammar) or die "Bad grammar"; local $/; my $script = <DATA>; my $tree = $parser->Script($script) or die "Bad script"; print $tree->eval(); __DATA__ a <- 1 b <- 2 if a<b then c <- 3 else c <- 99 b*c+a
[-] demo_cpp.pl
[edit]
[-] demo_autorule.pl
[edit]
[-] demo_errors.pl
[edit]
[-] demo_piecewise.pl
[edit]
[-] demo_logic.pl
[edit]
[-] demo_skipcomment.pl
[edit]
[-] demo_implicit.pl
[edit]
[-] demo_separators.pl
[edit]
[-] demo_perlparsing.pl
[edit]
[-] demo_street.pl
[edit]
[-] demo_scoredsep.pl
[edit]
[-] demo.c
[edit]
[-] demo_textgen.pl
[edit]
[-] demo.pl
[edit]
[-] demo_calc.pl
[edit]
[+]
..
[-] demo_another_Cgrammar.pl
[edit]
[-] demo_matchrule2.pl
[edit]
[-] demo_mccoy.pl
[edit]
[-] demo_restructure_painful.pl
[edit]
[-] demo_methods.pl
[edit]
[-] demo_language.pl
[edit]
[-] demo_selfmod.pl
[edit]
[-] demo_OOautoparsetree.pl
[edit]
[-] demo_codeblock.pl
[edit]
[-] demo_simplequery.pl
[edit]
[-] demo_restructure_easy.pl
[edit]
[-] demo_tokens.pl
[edit]
[-] demo_decomment.pl
[edit]
[-] demo_recipe.pl
[edit]
[-] demo_delete.pl
[edit]
[-] demo_lisplike.pl
[edit]
[-] demo_bad.pl
[edit]
[-] demo_arithmetic.pl
[edit]
[-] demo_leftassoc.pl
[edit]
[-] demo_PerlCSV.pl
[edit]
[-] demo_metaRD.pm
[edit]
[-] demo_derived.pl
[edit]
[-] demo_opreps.pl
[edit]
[-] demo_matchrule.pl
[edit]
[-] demo_LaTeXish_autoact.pl
[edit]
[-] demo_operator.pl
[edit]
[-] demo_autoscoresep.pl
[edit]
[-] demo_Cgrammar_v2.pl
[edit]
[-] demo_NL2SQL.pl
[edit]
[-] demo_Cgrammar.pl
[edit]
[-] demo_randomsentence.pl
[edit]
[-] demo_template.pl
[edit]
[-] demo_quicklist.pl
[edit]
[-] demo_itemhash.pl
[edit]
[-] demo_buildcalc.pl
[edit]
[-] demo_leftop.pl
[edit]
[-] demo_decomment_nonlocal.pl
[edit]
[-] demo_dot.pl
[edit]
[-] demo_LaTeXish.pl
[edit]
[-] demo_precalc.pl
[edit]
[-] demo_eval.pl
[edit]
[-] demo_autostub.pl
[edit]
[-] demo_whoson.pl
[edit]
[-] demo_lexer.pl
[edit]
[-] demo_OOparsetree.pl
[edit]
[-] demo_parsetree.pl
[edit]
[-] demo_simple.pl
[edit]
[-] demo_embedding.pl
[edit]
[-] demo_simpleXML.pl
[edit]
[-] demo_undumper.pl
[edit]