#!/bin/bash
# (C) David Vajda
# 2025-07-29
# Circuit Excersize, US ...
# bakus naur - normalform - grammar rules (easiest level, linksrekursiv)
# expr ::= expr + term | term
# term ::= term * fact | fact
# fact ::= const | (expr)
# beseitgte Linksrekursion
# expr ::= term + expr2
# expr2 ::= expr + term | term
# term ::= fact * term2
# fact2 ::= term * fact | fact
# ...
# alternative beseitgte Linksrekursion
# expr ::= term + expr2
# expr2 ::= expr | term
# term ::= fact * term2
# fact2 ::= term * fact | fact
# ...
# alternative beseitgte Linksrekursion
# expr ::= term + expr2
# expr2 ::= term + expr2 | term
# term ::= fact * term2
# term2 ::= fact * term2 | fact
# fact ::= term * fact | fact
# ...
# rechtzeitiges abbruchkriterium erzeugen sonst wird ausdruck etwas zu lange
date=$(date)
yes=1
no=0
op1="AND"
op2="OR"
op3="Inverter"
MAXVAR=4
if [[ "$1" == "expr" || -z "$1" ]]
then
decision=$(($RANDOM%2))
if [ "$decision" == "$yes" ]
then
/bin/bash "$0" "expr"
echo -n " $op2 "
/bin/bash "$0" "term"
else
/bin/bash "$0" "term"
fi
elif [ "$1" == "term" ]
then
decision=$(($RANDOM%2))
if [ "$decision" == "$yes" ]
then
/bin/bash "$0" "term"
echo -n " $op3 "
/bin/bash "$0" "fact"
else
/bin/bash "$0" "fact"
fi
elif [ "$1" == "fact" ]
then
decision=$(($RANDOM%2))
if [ $decision -eq "$yes" ]
then
if [ $decision -eq "$yes" ]
then
echo -n " $op3 "
fi
echo -n "x$(($RANDOM%$MAXVAR))"
else
echo -n "("
/bin/bash "$0" "expr"
echo -n ")"
fi
fi