circuitus20250731.sh

# jetzt habe ich es so geloest, da ist wieder ein neuer fehler drin

#!/bin/bash

# (C) David Vajda
# 2025-07-30
# Circuit Excersize, US ...

# bakus naur - normalform - grammar rules (easiest level, linksrekursiv)
# expr ::= expr + term | term
# term ::= term * fact | fact
# fact ::= const | (expr)

# expr ::= term expr2
# expr2 ::= + term expr2
# term ::= fact term2
# term2 ::= * fact term2
# fact ::= const | id | (expr)

# also:

# expr ::= term expr2
# expr2 ::= OR term expr2
# term ::= fact term2
# term2 ::= AND fact term2
# fact ::= id | NOT id | (expr)

date=$(date)
yes=1
no=0
op1="AND"
op2="OR"
op3="NOT"
MAXVAR=4

if [ -z "$1" ]
then
    /bin/bash "$0" "expr" 1
elif [ "$1" == "expr" ]
then
    /bin/bash "$0" "term" $2
    /bin/bash "$0" "expr2" $2
elif [[ "$1" == "expr2" || -z "$1" ]]
then
    decision=$(($RANDOM%2))
    if [ "$decision" == "$yes" ]
    then
        echo -n " $op2 "
        /bin/bash "$0" "term" $2
        /bin/bash "$0" "expr2" $2
    fi
elif [[ "$1" == "term" || -z "$1" ]]
then
    /bin/bash "$0" "fact" $2
    /bin/bash "$0" "term2" $2
elif [[ "$1" == "term2" || -z "$1" ]]
then
    decision=$(($RANDOM%2))
    if [ "$decision" == "$yes" ]
    then
        echo -n " $op1 "
        /bin/bash "$0" "fact" $2
        /bin/bash "$0" "term2" $2
    fi
elif [ "$1" == "fact" ]
then
    decision=$(($RANDOM%2))
    l=$(($2))
    l=$(($l-1))
    if [[ $decision -eq "$yes" || $l -lt 0 ]]
    then
        decision=$(($RANDOM%2))
        if [ $decision -eq "$yes" ]
        then
            echo -n " $op3 "
        fi
        echo -n "x$(($RANDOM%$MAXVAR))"
    else
        decision=$(($RANDOM%2))
        echo -n "("
        /bin/bash "$0" "expr" "$l"
        echo -n ")"
    fi
fi

if [ -z "$1" ]
then
    echo ""
fi