#!/bin/bash # # mktheoryof # Morgan Deters for CVC4 # Copyright (c) 2010 The CVC4 Project # # The purpose of this script is to create theoryof_table.h from a # template and a list of theory kinds. # # Invocation: # # mktheoryof template-file theory-kind-files... # # Output is to standard out. # copyright=2010 cat <&2 exit 1 fi seen_theory_builtin=true elif [ -z "$1" -o -z "$2" ]; then echo "$kf:$lineno: error: \"theory\" directive missing class or header argument" >&2 exit 1 elif ! expr "$1" : '\(::*\)' >/dev/null; then echo "$kf:$lineno: warning: theory class \`$1' isn't fully-qualified (e.g., ::CVC4::theory::foo)" >&2 elif ! expr "$1" : '\(::CVC4::theory::*\)' >/dev/null; then echo "$kf:$lineno: warning: theory class not under ::CVC4::theory namespace" >&2 fi theoryof_table_includes="${theoryof_table_includes}#include \"theory/$b/$2\" " theoryof_table_registers="${theoryof_table_registers} /* from $b */ void registerTheory($1* th) { " } function variable { # variable K ["comment"] lineno=${BASH_LINENO[0]} do_theoryof "$1" } function operator { # operator K #children ["comment"] lineno=${BASH_LINENO[0]} do_theoryof "$1" } function nonatomic_operator { # nonatomic_operator K #children ["comment"] lineno=${BASH_LINENO[0]} do_theoryof "$1" } function parameterized { # parameterized K #children ["comment"] lineno=${BASH_LINENO[0]} do_theoryof "$1" } function constant { # constant K T Hasher header ["comment"] lineno=${BASH_LINENO[0]} do_theoryof "$1" } function do_theoryof { check_theory_seen theoryof_table_registers="${theoryof_table_registers} d_table[::CVC4::kind::$1] = th; " } function check_theory_seen { if ! $seen_theory; then echo "$kf:$lineno: error: no \"theory\" declaration found (it has to be first)" >&2 exit 1 fi } while [ $# -gt 0 ]; do kf=$1 seen_theory=false b=$(basename $(dirname "$kf")) source "$kf" check_theory_seen theoryof_table_registers="${theoryof_table_registers} } " shift done ## output text=$(cat "$template") for var in theoryof_table_includes theoryof_table_registers; do eval text="\${text//\\\$\\{$var\\}/\${$var}}" done error=`expr "$text" : '.*\${\([^}]*\)}.*'` if [ -n "$error" ]; then echo "$template:0: error: undefined replacement \${$error}" >&2 exit 1 fi echo "$text"