Files
compilateur-l/eval-partiel/runEval.sh
2016-02-23 18:02:37 +01:00

158 lines
5.1 KiB
Bash
Executable File

#!/bin/bash
################################################################################
# Script d'évaluation automatique des compilateurs du projet.
# Compile le programme source et compare avec la référence.
# Comprend analyse lexicale, syntaxique, arbre abstrait, table des symboles et
# code MIPS.
################################################################################
# MODIFIEZ LES VARIABLES CI-DESSOUS AVEC LE CHEMIN/OPTIONS DE VOTRE COMPILATEUR
MYCOMPILO="../compilateur-l"
MYCOMPILOLEX="${MYCOMPILO} -l"
MYCOMPILOSYNT="${MYCOMPILO} -s"
#MYCOMPILOASYNT="${MYCOMPILO} -a"
#MYCOMPILOTAB="${MYCOMPILO} -t"
#MYCOMPILOMIPS="${MYCOMPILO} -m"
################################################################################
XMLDIFF="./compare_arbres_xml"
REGDIFF="diff -q -w"
EXITONFAIL=1
declare -A testname
testname["lex"]="Analyse lexicale"
testname["synt"]="Analyse syntaxique"
#testname["asynt"]="Arbre abstrait"
#testname["tab"]="Table des symboles"
#testname["mips"]="Code machine MIPS"
################################################################################
function diff_prog() {
diffprog=$1
input=$2
suffix=$3
echo -e "\033[35m > ${testname[${suffix}]} (.${suffix})\033[0m"
if [ -f ref-${suffix}/$input.${suffix} ]; then
${diffprog} output/${input}.${suffix} ref-${suffix}/${input}.${suffix} 2> /dev/null
if [ $? != 0 ]; then
echo -e "\033[31mTEST ${testname[${suffix}]} ÉCHOUÉ\033[0m"
echo -e "Pour connaître les différences, exécutez :"
echo -e " diff output/${input}.${suffix} ref-${suffix}/${input}.${suffix}"
if [ $EXITONFAIL = 1 ]; then exit 1; fi
else
echo -e "\033[32mTEST ${testname[${suffix}]} OK\033[0m"
fi
else
echo -e "\033[34mRéférence ref-${suffix}/${input}.${suffix} absente\033[0m"
fi
}
################################################################################
function test_fichier_ok() {
input=$1
echo -e "\n\033[4m ---- Test input/$input.l ----\033[0m"
if [ -f input/$input.l ]; then
echo -e "\033[35m > Reconnaissance (accepte l'entrée)\033[0m"
${MYCOMPILOSYNT} input/$input.l > output/$input.synt
if [ $? != 0 ]; then
echo -e "\033[31mTEST Reconnaissance ÉCHOUÉ\033[0m"
echo -e "Le programme $input.l n'a pas été compilé correctement"
if [ $EXITONFAIL = 1 ]; then exit 1; fi
else
echo -e "\033[32mTEST Reconnaissance OK\033[0m"
fi
${MYCOMPILOLEX} input/$input.l > output/$input.lex
diff_prog "${REGDIFF}" $input lex
diff_prog ${XMLDIFF} $input synt
#${MYCOMPILOASYNT} input/$input.l > output/$input.asynt
#diff_prog ${XMLDIFF} $input asynt
#${MYCOMPILOTAB} input/$input.l > output/$input.tab
#diff_prog "${REGDIFF}" $input tab
#${MYCOMPILOMIPS} input/$input.l > output/$input.mips
#diff_prog "${REGDIFF}" $input mips
else
echo -e "\033[31minput/$input.l non trouvé\033[0m"
echo -e "\033[31mTest impossible\033[0m"
fi
}
################################################################################
function test_fichier_fail() {
input=$1
echo -e "\n\033[4m ---- Test input/$input.l ----\033[0m"
${MYCOMPILOSYNT} input/$input.l > output/$input.synt.xml
if [ $? = 0 ]; then
echo -e "\033[31mTEST REJET ÉCHOUÉ\033[0m"
echo -e "Le programme $input.l a été accepté alors qu'il aurait dû être rejeté"
if [ $EXITONFAIL = 1 ]; then exit 1; fi
else
echo -e "\033[32mTEST REJET OK\033[0m"
fi
}
################################################################################
mkdir -p output
make
echo -e "Votre compilateur : ${MYCOMPILO}"
if [ ! -f ${MYCOMPILO} ]; then
echo -e "\033[31mCompilateur introuvable"
echo -e "Modifiez la variable MYCOMPILO avant de lancer l'éval\033[0m"
exit 1
fi
################################################################################
echo -e "\033[1m\n>> 1) Tests connus OK\033[0m"
test_fichier_ok affect
test_fichier_ok boucle
test_fichier_ok expression
test_fichier_ok max
test_fichier_ok tri
################################################################################
echo -e "\033[1m\n>> 1) Tests connus FAIL\033[0m"
test_fichier_fail affect-err
################################################################################
echo -e "\033[1m\n>> 1) Tests nouveaux OK\033[0m"
test_fichier_ok eval1
test_fichier_ok eval2
test_fichier_ok eval3
test_fichier_ok eval4
test_fichier_ok eval5
test_fichier_ok eval6
test_fichier_ok eval7
test_fichier_ok eval8
# Decommenter
# test_fichier_ok test1
# test_fichier_ok test2
# test_fichier_ok test3
################################################################################
echo -e "\033[1m\n>> 1) Tests nouveaux FAIL\033[0m"
test_fichier_fail eval1err
test_fichier_fail eval2err
test_fichier_fail eval3err
test_fichier_fail eval4err
test_fichier_fail eval5err
# Decommenter
# test_fichier_fail test1err
################################################################################