# 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