diff --git a/examples2/grammar/anormalization.test.1.xml b/examples2/grammar/anormalization.test.1.xml new file mode 100644 index 0000000000000000000000000000000000000000..9b53cf09c2f659a20741f7dc82521529b3888470 --- /dev/null +++ b/examples2/grammar/anormalization.test.1.xml @@ -0,0 +1,32 @@ +<EpsilonFreeCFG> + <nonterminalAlphabet> + <LabeledSymbol><PrimitiveLabel><Character>S</Character></PrimitiveLabel></LabeledSymbol> + </nonterminalAlphabet> + <terminalAlphabet> + <LabeledSymbol><PrimitiveLabel><Character>[</Character></PrimitiveLabel></LabeledSymbol> + <LabeledSymbol><PrimitiveLabel><String>text</String></PrimitiveLabel></LabeledSymbol> + <LabeledSymbol><PrimitiveLabel><Character>]</Character></PrimitiveLabel></LabeledSymbol> + </terminalAlphabet> + <initialSymbol><LabeledSymbol><PrimitiveLabel><Character>S</Character></PrimitiveLabel></LabeledSymbol></initialSymbol> + <rules> + <rule> + <lhs> + <LabeledSymbol><PrimitiveLabel><Character>S</Character></PrimitiveLabel></LabeledSymbol> + </lhs> + <rhs> + <LabeledSymbol><PrimitiveLabel><String>text</String></PrimitiveLabel></LabeledSymbol> + </rhs> + </rule> + <rule> + <lhs> + <LabeledSymbol><PrimitiveLabel><Character>S</Character></PrimitiveLabel></LabeledSymbol> + </lhs> + <rhs> + <LabeledSymbol><PrimitiveLabel><Character>[</Character></PrimitiveLabel></LabeledSymbol> + <LabeledSymbol><PrimitiveLabel><Character>S</Character></PrimitiveLabel></LabeledSymbol> + <LabeledSymbol><PrimitiveLabel><Character>]</Character></PrimitiveLabel></LabeledSymbol> + </rhs> + </rule> + </rules> + <generatesEpsilon><false /></generatesEpsilon> +</EpsilonFreeCFG> diff --git a/examples2/grammar/anormalization.test.2.xml b/examples2/grammar/anormalization.test.2.xml new file mode 100644 index 0000000000000000000000000000000000000000..e0a7d6a1d81b4fa2bf85714d6603848699c66f08 --- /dev/null +++ b/examples2/grammar/anormalization.test.2.xml @@ -0,0 +1,65 @@ +<?xml version="1.0"?> +<EpsilonFreeCFG> + <nonterminalAlphabet> + <LabeledSymbol> + <PrimitiveLabel> + <String>M</String> + </PrimitiveLabel> + </LabeledSymbol> + <LabeledSymbol> + <PrimitiveLabel> + <String>V</String> + </PrimitiveLabel> + </LabeledSymbol> + </nonterminalAlphabet> + <terminalAlphabet> + <LabeledSymbol> + <PrimitiveLabel> + <String>i</String> + </PrimitiveLabel> + </LabeledSymbol> + </terminalAlphabet> + <initialSymbol> + <LabeledSymbol> + <PrimitiveLabel> + <String>V</String> + </PrimitiveLabel> + </LabeledSymbol> + </initialSymbol> + <rules> + <rule> + <lhs> + <LabeledSymbol> + <PrimitiveLabel> + <String>M</String> + </PrimitiveLabel> + </LabeledSymbol> + </lhs> + <rhs> + <LabeledSymbol> + <PrimitiveLabel> + <String>V</String> + </PrimitiveLabel> + </LabeledSymbol> + <LabeledSymbol> + <PrimitiveLabel> + <String>M</String> + </PrimitiveLabel> + </LabeledSymbol> + <LabeledSymbol> + <PrimitiveLabel> + <String>V</String> + </PrimitiveLabel> + </LabeledSymbol> + <LabeledSymbol> + <PrimitiveLabel> + <String>V</String> + </PrimitiveLabel> + </LabeledSymbol> + </rhs> + </rule> + </rules> + <generatesEpsilon> + <false/> + </generatesEpsilon> +</EpsilonFreeCFG> diff --git a/examples2/grammar/anormalization.test.3.xml b/examples2/grammar/anormalization.test.3.xml new file mode 100644 index 0000000000000000000000000000000000000000..390d5d48c7f3e8827b5585cb2300bce25dc76973 --- /dev/null +++ b/examples2/grammar/anormalization.test.3.xml @@ -0,0 +1,164 @@ +<?xml version="1.0"?> +<EpsilonFreeCFG> + <nonterminalAlphabet> + <LabeledSymbol> + <PrimitiveLabel> + <String>C</String> + </PrimitiveLabel> + </LabeledSymbol> + <LabeledSymbol> + <PrimitiveLabel> + <String>X</String> + </PrimitiveLabel> + </LabeledSymbol> + </nonterminalAlphabet> + <terminalAlphabet> + <LabeledSymbol> + <PrimitiveLabel> + <String>d</String> + </PrimitiveLabel> + </LabeledSymbol> + <LabeledSymbol> + <PrimitiveLabel> + <String>l</String> + </PrimitiveLabel> + </LabeledSymbol> + </terminalAlphabet> + <initialSymbol> + <LabeledSymbol> + <PrimitiveLabel> + <String>C</String> + </PrimitiveLabel> + </LabeledSymbol> + </initialSymbol> + <rules> + <rule> + <lhs> + <LabeledSymbol> + <PrimitiveLabel> + <String>C</String> + </PrimitiveLabel> + </LabeledSymbol> + </lhs> + <rhs> + <LabeledSymbol> + <PrimitiveLabel> + <String>l</String> + </PrimitiveLabel> + </LabeledSymbol> + <LabeledSymbol> + <PrimitiveLabel> + <String>l</String> + </PrimitiveLabel> + </LabeledSymbol> + </rhs> + </rule> + <rule> + <lhs> + <LabeledSymbol> + <PrimitiveLabel> + <String>X</String> + </PrimitiveLabel> + </LabeledSymbol> + </lhs> + <rhs> + <LabeledSymbol> + <PrimitiveLabel> + <String>X</String> + </PrimitiveLabel> + </LabeledSymbol> + </rhs> + </rule> + <rule> + <lhs> + <LabeledSymbol> + <PrimitiveLabel> + <String>X</String> + </PrimitiveLabel> + </LabeledSymbol> + </lhs> + <rhs> + <LabeledSymbol> + <PrimitiveLabel> + <String>d</String> + </PrimitiveLabel> + </LabeledSymbol> + <LabeledSymbol> + <PrimitiveLabel> + <String>d</String> + </PrimitiveLabel> + </LabeledSymbol> + <LabeledSymbol> + <PrimitiveLabel> + <String>d</String> + </PrimitiveLabel> + </LabeledSymbol> + <LabeledSymbol> + <PrimitiveLabel> + <String>l</String> + </PrimitiveLabel> + </LabeledSymbol> + </rhs> + </rule> + <rule> + <lhs> + <LabeledSymbol> + <PrimitiveLabel> + <String>X</String> + </PrimitiveLabel> + </LabeledSymbol> + </lhs> + <rhs> + <LabeledSymbol> + <PrimitiveLabel> + <String>l</String> + </PrimitiveLabel> + </LabeledSymbol> + <LabeledSymbol> + <PrimitiveLabel> + <String>X</String> + </PrimitiveLabel> + </LabeledSymbol> + <LabeledSymbol> + <PrimitiveLabel> + <String>d</String> + </PrimitiveLabel> + </LabeledSymbol> + </rhs> + </rule> + <rule> + <lhs> + <LabeledSymbol> + <PrimitiveLabel> + <String>X</String> + </PrimitiveLabel> + </LabeledSymbol> + </lhs> + <rhs> + <LabeledSymbol> + <PrimitiveLabel> + <String>l</String> + </PrimitiveLabel> + </LabeledSymbol> + <LabeledSymbol> + <PrimitiveLabel> + <String>X</String> + </PrimitiveLabel> + </LabeledSymbol> + <LabeledSymbol> + <PrimitiveLabel> + <String>d</String> + </PrimitiveLabel> + </LabeledSymbol> + <LabeledSymbol> + <PrimitiveLabel> + <String>C</String> + </PrimitiveLabel> + </LabeledSymbol> + </rhs> + </rule> + </rules> + <generatesEpsilon> + <true/> + </generatesEpsilon> +</EpsilonFreeCFG> diff --git a/makefile b/makefile index a214f3afbf26abb55cc37da70e549908c0ff9b37..86715e7e1fec6039c82f25c0d481dbe614c32199 100644 --- a/makefile +++ b/makefile @@ -63,7 +63,7 @@ all: -debug : all-debug +debug: all-debug mkdir -p $(addsuffix -debug, $(BINFOLDER)) rm -rf $(addsuffix -debug, $(BINFOLDER))/* for dir in $(CORE_LIB) $(SUBDIRS_LIBS); do \ diff --git a/tests.anormalize.sh b/tests.anormalize.sh new file mode 100755 index 0000000000000000000000000000000000000000..d69423a3fdd3b5acd0279aa0ef3ff58cd335b5d2 --- /dev/null +++ b/tests.anormalize.sh @@ -0,0 +1,152 @@ +#!/usr/bin/env bash + +# $1 test dir suffix (debug / release) + +# SETTINGS +TESTCASE_ITERATIONS=100 +TESTCASE_TIMEOUT=10 +LOGFILE="log_tests.txt" + +RAND_NONTERMINALS=2 +RAND_DENSITY="50" +RAND_TERMINALS=4 +STRING_LENGHTS=6 + +EXECUTABLES="arand2 atrim2 anormalize2 agenerate2 aepsilon2" +TESTS_DIR="../examples2/grammar" + +RES_GOOD=0 +RES_FAIL=0 +RES_TIME=0 +RES_SEGV=0 +RES_UNKN=0 + + +# ---------------------------- + +for FILE in $EXECUTABLES; do + if [ ! -f bin-$1/$FILE ]; then + echo "Executable $FILE is required for testing. Make sure it is in bin-$1 folder." + exit 1 + fi +done + +cd bin-$1/ +rm -f $LOGFILE + +# ---------------------------- + +# $1 = conv command +# $2 = return code +# $3 = input automaton +# $4 = output of conversion +function log { + echo "----------------------------------------------------------" >> $LOGFILE + echo "conv: " $1 >> $LOGFILE + echo "ret: " $2 >> $LOGFILE + echo "input automaton:" >> $LOGFILE + cat "$3" >> $LOGFILE + echo "command out:" >> $LOGFILE + echo "$4" >> $LOGFILE +} + +function generateCFG { + ./arand2 -t CFG --density $RAND_DENSITY --nonterminals $(( $RANDOM % $RAND_NONTERMINALS + 1 )) --terminals $(( $RANDOM % $RAND_TERMINALS + 1 )) 2>/dev/null | ./aepsilon2 +} + +# $1 = command for conversion. Output of such command must be a grammar !! +# $2 = original grammar +function runTest2 { + GENERATED_STRINGS="./agenerate2 --upto $STRING_LENGHTS" + + OUT=`timeout $TESTCASE_TIMEOUT bash -c "diff <(cat $2 | $1 | $GENERATED_STRINGS ) <(cat $2 | $GENERATED_STRINGS)"` + RET=$? + + if [ $RET == 0 ]; then # ok + return 0 + fi + + log "$1" $RET "$2" "$OUT" + + if [ $RET == 124 ]; then # timeout + return 2 + elif [ $RET -ge 124 ]; then #segv + return 3 + else + return 1 + fi +} + +function registerResult { + case $1 in + 0) + echo -n "." + ((RES_GOOD++)) + ;; + 1) + echo -n "x" + ((RES_FAIL++)) + ;; + 2) + echo -n "T" + ((RES_TIME++)) + ;; + 3) + echo -n "E" + ((RES_SEGV++)) + ;; + *) + echo -n "?" + ((RES_UNKN++)) + ;; + esac +} + +function clearResults { + RES_GOOD=0 + RES_FAIL=0 + RES_TIME=0 + RES_SEGV=0 + RES_UNKN=0 +} + +function outputResults { + # summary + echo -ne "\n\t" + echo "RES: GOOD:" $RES_GOOD ", FAIL:" $RES_FAIL ", TIME:" $RES_TIME ", SEGV:" $RES_SEGV, "UNKN:" $RES_UNKN + echo "" +} + +# $1 - aconversions2 sequence +function runTest { + echo $1 + echo -ne "\t" + + clearResults + + # predefined tests first + for FILE in `ls $TESTS_DIR/anormalization.test*`; do + runTest2 "$1" "$FILE" + registerResult $? + done + + echo -n " | " + + # random tests + CFG_FILE=cfg.xml + for i in $(seq 1 $TESTCASE_ITERATIONS ); + do + cat <(generateCFG) > $CFG_FILE + + runTest2 "$1" "$CFG_FILE" + registerResult $? + done + + rm $CFG_FILE + + outputResults +} + +# Chomsky normal form and Greibach normal form +runTest "./anormalize2 -f GNF" +runTest "./anormalize2 -f CNF"