#!/bin/perl ## Generate the operators (the functions that do the work) ## for all things that benefit from parameterization ## The syntactic elements, which take the arguments and decide ## which function to call, are elsewhere $prefixOp = "Op_" ; ## Templates $prefixOpNumeric = "${prefixOp}Numeric" ; @tNumericOp = ( { "SYMBOL" => "+" , "CLASS" => "${prefixOpNumeric}Add" , "OPNAME" => "add" } , { "SYMBOL" => "-" , "CLASS" => "${prefixOpNumeric}Subtract" , "OPNAME" => "sub" } , { "SYMBOL" => "*" , "CLASS" => "${prefixOpNumeric}Multiply" , "OPNAME" => "mul" } , { "SYMBOL" => "/" , "CLASS" => "${prefixOpNumeric}Divide" , "OPNAME" => "div" } , { "SYMBOL" => "%" , "CLASS" => "${prefixOpNumeric}Modulus" , "OPNAME" => "mod" } , ) ; $prefixOpBoolean = "${prefixOp}" ; @tBooleanOp = ( { "SYMBOL" => "&&" , "CLASS" => "${prefixOp}BooleanLogicalAnd" , "PART_TEST" => "!" , "PART_RET" => "VAL_FALSE" , "OPNAME" => "and" } , { "SYMBOL" => "||" , "CLASS" => "${prefixOp}BooleanLogicalOr" , "PART_TEST" => "" , "PART_RET" => "VAL_TRUE" , "OPNAME" => "or" } ) ; # Numerics @tCompareNum = ( { "SYMBOL" => "==" , "CLASS" => "${prefixOpNumeric}Equal" , "OPNAME" => "eq" } , { "SYMBOL" => "!=" , "CLASS" => "${prefixOpNumeric}NotEqual" , "OPNAME" => "ne" } , { "SYMBOL" => "<" , "CLASS" => "${prefixOpNumeric}LessThan" , "OPNAME" => "lt" } , { "SYMBOL" => "<=" , "CLASS" => "${prefixOpNumeric}LessThanOrEqual" , "OPNAME" => "le" } , { "SYMBOL" => ">" , "CLASS" => "${prefixOpNumeric}GreaterThan" , "OPNAME" => "gt" } , { "SYMBOL" => ">=" , "CLASS" => "${prefixOpNumeric}GreaterThanOrEqual" , "OPNAME" => "ge" } , ) ; # DateTime $prefixOpDateTime = "${prefixOp}DateTime" ; @tCompareDT = ( { "SYMBOL" => "==" , "CLASS" => "${prefixOpDateTime}Equal" , "OPNAME" => "eqDT" } , { "SYMBOL" => "!=" , "CLASS" => "${prefixOpDateTime}NotEqual" , "OPNAME" => "neDT" } , { "SYMBOL" => "<" , "CLASS" => "${prefixOpDateTime}LessThan" , "OPNAME" => "ltDT" } , { "SYMBOL" => "<=" , "CLASS" => "${prefixOpDateTime}LessThanOrEqual" , "OPNAME" => "leDT" } , { "SYMBOL" => ">" , "CLASS" => "${prefixOpDateTime}GreaterThan" , "OPNAME" => "gtDT" } , { "SYMBOL" => ">=" , "CLASS" => "${prefixOpDateTime}GreaterThanOrEqual" , "OPNAME" => "geDT" } , ) ; #$dir = "src/com/hp/hpl/jena/query/expr" ; $templ_numeric = readFile("templ_op_numeric.java") ; $templ_boolean = readFile("templ_op_boolean.java") ; $templ_compareNum = readFile("templ_op_compare_num.java") ; $templ_compareDT = readFile("templ_op_compare_dt.java") ; subst($templ_numeric, \@tNumericOp) ; subst($templ_boolean, \@tBooleanOp) ; subst($templ_compareNum, \@tCompareNum) ; subst($templ_compareDT, \@tCompareDT) ; subst($templ_builtin, \@tBuiltins) ; sub subst { my($template, $nodes) = @_ ; foreach my $a (@$nodes) { my $file = $template ; my $java= "$$a{CLASS}.java" ; print "Class: $java\n" ; $file = substOne($java, $file, $a) ; # Check if ( $file =~ m/\#(.*)\#/g ) { $sym = $1 ; print STDERR "Unresolved symbol: $sym: $java\n" ; next ; } output($java, $file) ; } } sub output { my ($java, $file) = @_ ; # Output open(J, ">$java") || die $! ; binmode J ; #open(J,">&STDOUT") || die $! ; print J $file ; close J ; } sub substOne { my ($class, $file, $a) = @_ ; foreach $k (keys %$a) { #warn "$k: Empty string in substitution\n" if ( $$a{$k} eq '' ) ; $file =~ s/\#$k\#/$$a{$k}/g ; } return $file ; } sub readFile { my $f = @_[0] ; open my $fh, "$f" or die "$f: $!"; local $/; my $content = <$fh>; close $fh; # Remove any excess carriage returns $file =~ s/\r//g ; return $content ; }