158 lines
5.1 KiB
Bash
Executable File
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
|
|
|
|
################################################################################
|