#!/bin/bash

    # Modifiy the COMMAND variable to your taste, if your shell isn't
    # mentioned.  By specifying your COMMAND-shell last it will be used;
COMMAND="/usr/bin/tcsh -f"
COMMAND=/bin/bash

    # Assuming bisonc++ is in your computer's search-path. If not, define
    # BISONCPP as the full path to bisconc++:
BISONCPP=bisonc++

    # UNCOMMENT the following variables if you want to run the examples from
    # the source distribution's documentation/regression directory rather than
    # from bisonc++ documentation's `regression' subdirectory.
SKEL=../../../../share/bisonc++
BISONCPP="../../../../tmp/bin/bisonc++ -B ${SKEL}base.h -C ${SKEL}.h -I ${SKEL}.ih -P ${SKEL}.cc"

example()
{
    let EXAMPLE=${EXAMPLE}+1

    orgdir=`pwd`

    tput clear

    case $2 in
        ("")
            DEB=
        ;;
        (debug)
            DEB=--debug
        ;;
        (*)
            return 0
        ;;
    esac

    cd $1
    cwd=`pwd`

    echo --------------------------------
    echo
    cat doc
    echo
    echo --------------------------------
    
    cd parser
    $BISONCPP --construction $DEB grammar
    [ -e /usr/bin/bison ] && bison -v bgram
    
    if [ -s ../demo.cc ] 
    then
        cd ../scanner
        flex -I lexer
        cd ..
        g++ -Wall -o demo *.cc */*.cc
        echo "Entering a shell: \`demo' runs the program, \`exit' returns"
        echo "The grammar analysis is in the \`parser' subdirectory:"
    else        
        echo "Entering a shell: Inspect the results, use \`exit' to continue"
    fi

    echo "bison's output is in \`bgram.output', bisonc++'s output in \`parse.output'"
    echo
    $COMMAND

    cd $cwd

        # the doc-test is a safequard agains accidentally removing files
    [ -s doc ] && find ./ -type f -not -regex '.*/\.svn/.*' \
                -not -regex '.*/_.*' \
                -not -name doc -not -name demo.cc \
                -not -name bgram \
                -not -name grammar -not -name parser.h -not -name parser.ih \
                -not -name lexer -not -name scanner.h -not -name scanner.ih \
                -exec rm '{}' ';'

    cd $orgdir
}

tput clear

echo "
    This script feeds several grammars to bisonc++. Some grammars allow you to
execute a little demo-program. Some examples do not have demo programs. All
grammars are also fed to bison \(if existing\), producing their output on a file
\`bgram.output' Bisonc++'s output is provided in the file \`parse.output'

    From the various test/parser directories, bisonc++ should be accessible as

$BISONCPP

    If that's not true for you, consider changing the BISONCPP variable in
this script.

    With each example, hitting a plain Enter creates the parser and optionally
builds the demo-program

    Note that bison always defines one additional state compared with
bisonc++. Bison accepts its input in a separate state, whereas bisonc++
accepts when <EOF> is seen in combination with the reduction of the
the augmented grammar rule G* -> G . Bisonc++ will not execute an action here,
but that should be ok, since the grammar specification does not make G* -> G
visible, so no action can be associated with its reduction anyway.

"

EXAMPLE=1
PRE="To run: [debug] + Enter, enter other input to skip an example"

echo $EXAMPLE: AHO Example 4.42, p. 231
echo $PRE
read RUN
example aho4.42 $RUN

echo $EXAMPLE: two R/R conflicts
echo $PRE
read RUN
example rr2 $RUN

echo $EXAMPLE: the dangling-else conflict
echo $PRE
read RUN
example danglingelse $RUN

echo $EXAMPLE: S/R and R/R conflicts
echo $PRE
read RUN
example conflicts $RUN

echo $EXAMPLE: not derivable sentence
echo $PRE
read RUN
example nosentence $RUN

echo $EXAMPLE: using an error-production
echo $PRE
read RUN
example error $RUN

echo $EXAMPLE: adding two integral values
echo $PRE
read RUN
example simplecalc $RUN

echo $EXAMPLE: using the location stack
echo $PRE
read RUN
example location $RUN

echo $EXAMPLE: the man-page calculator
echo $PRE
read RUN
example calculator $RUN

echo $EXAMPLE: a calculator from the C++ Annotations
echo $PRE
read RUN
example annotations $RUN

echo $EXAMPLE: a reduced icmake V 7.00 grammar
echo $PRE
read RUN
example icmake1 $RUN

echo $EXAMPLE: the full icmake V 7.00 grammar
echo $PRE
read RUN
example icmake2 $RUN

tput clear

echo "
    END OF SCRIPT
"
