diff --git a/test/evaluateWindows.py b/test/evaluateWindows.py new file mode 100644 index 0000000000000000000000000000000000000000..533e005d2612394bcee86c5af39425fb14cdd39c --- /dev/null +++ b/test/evaluateWindows.py @@ -0,0 +1,470 @@ +import sys +import os +import subprocess +import inspect +import argparse + +NOERROR_CODE = 0 +ERR_TYPE_CODE = 3 +ERR_SYMBOL_TABLE_CODE = 4 +ERR_SYNTAX_CODE = 5 +ERR_LEX_CODE = 6 + +SC_COEFF = 4 +SA_DIFF_COEFF = 0 +TS_DIFF_COEFF = 0 +SA_COEFF = 3 +C3A_DIFF_COEFF = 0 +C3A_COEFF = 3 +PRE_NASM_DIFF = 0 +PRE_NASM_COEFF = 3 +NASM_DIFF_COEFF = 0 +NASM_COEFF = 3 +EXE_COEFF = 0 +ERR_TS_COEFF = 2 +ERR_TYPE_COEFF = 2 + +inputPath = ".\\input\\" +errInputPathTs = ".\\input_err_ts\\" +errInputPathType = ".\\input_err_type\\" +refPath = ".\\" +srcPath = "..\\src\\" +classpath = "" +outErr = sys.stderr +outScore = sys.stdout +outVerbose = open(os.devnull,"w") +outputFilename = "result.txt" + +def compileCompiler(): + global classpath + for file in ["Compiler.java", "SaVM.java", "C3aVM.java", "NasmVM.java"]: + if not os.path.isfile(os.path.join(srcPath, file)): + print("Skipping compilation of %s" % file, file=outVerbose) + continue + package = file.lower().split('.')[0].replace('vm', '') + if package in ["c3a", "nasm"] and not os.path.isdir(os.path.join(srcPath, package)): + print("Skipping compilation of %s" % file, file=outVerbose) + continue + print("Compiling %s..." % file, end="", file=outVerbose) + proc = subprocess.Popen("cd %s && javac %s %s %s" % (srcPath, "-cp " if len(classpath) > 0 else "", classpath, file), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + errMess = proc.stderr.read().decode('utf8') + returnCode = proc.wait() + if returnCode == 0: + print("Done", file=outVerbose) + else: + print("", file=outVerbose) + print("ERROR !", file=outErr) + print(errMess, file=outErr) + exit(1) + print("", file=outVerbose) + classpath = "..\\xerces-2_12_1\\*;%s" % srcPath + classpath = "" + +def deleteClasses(): + for root, subdirs, files in os.walk("%s.." % srcPath): + if ".git" in root: + continue + for filename in files: + if os.path.splitext(filename)[1] == ".class": + os.remove(os.path.join(root, filename)) + return classpath + +def findClasspath(): + global classpath + if len(classpath) > 0: + return classpath + for root, subdirs, files in os.walk("%s.." % srcPath): + if ".git" in root: + continue + for filename in files: + if os.path.splitext(filename)[1] in [".class", ".jar"]: + classpath += ("" if len(classpath) == 0 else ";") + root + break + classpath += ("" if len(classpath) == 0 else ";") + "..\\xerces-2_12_1\\*" + return classpath + +def compiler(verbose="-v 2"): + return 'java -classpath "%s" Compiler %s' % (findClasspath(), verbose) + +################################################################################ +def green(string) : + return "\033[92m%s\033[0m"%string +################################################################################ + +################################################################################ +def purple(string) : + return "\033[95m%s\033[0m"%string +################################################################################ + +################################################################################ +def red(string) : + return "\033[91m%s\033[0m"%string +################################################################################ + +################################################################################ +def changeExtension(filename, newExtension) : + return os.path.splitext(filename)[0] + newExtension +################################################################################ + +################################################################################ +def findInputFiles(path) : + inputFiles = [] + for filename in os.listdir(path) : + if os.path.splitext(filename)[1] == ".l" : + inputFiles.append(filename) + inputFiles.sort() + return inputFiles +################################################################################ + +################################################################################ +def deleteCompilationOutputs() : + outputExtensions = [".exe", ".exeout", ".o", ".out", ".sa", ".saout", ".sc", ".ts", ".nasm", ".nasmout", ".pre-nasm", ".pre-nasmout", ".c3a", ".c3aout", ".fg", ".fgs", ".ig"] + for filename in os.listdir(inputPath) : + if os.path.splitext(filename)[1] in outputExtensions : + os.remove(inputPath+filename) +################################################################################ + +################################################################################ +def compileInputFiles(inputFiles): + evaluation = getNewEvaluationResult(ERR_SYNTAX_CODE) + for inputFile in inputFiles: + lightFilename = os.path.basename(inputFile) + print("Compiling %s..." % inputFile, file=outVerbose, flush=True, end='') + command = '{} "{}{}"'.format(compiler(), inputPath, inputFile) + returnCode = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).wait() + if returnCode == NOERROR_CODE: + evaluation[1]["correct"].append(lightFilename) + print("Done", file=outVerbose) + else: + evaluation[1]["incorrect"].append(lightFilename) + print("ERROR !", file=outErr) + + print("", file=outVerbose) + return evaluation + +################################################################################ + +################################################################################ +def getNewEvaluationResult(name) : + return [name, {"correct" : [], "incorrect" : [], "notfound" : []}] +################################################################################ + +################################################################################ +def evaluateCompilationErrors(inputFiles, expectedCode, name) : + evaluation = getNewEvaluationResult(name) + + print(file=outVerbose) + + for inputFile in inputFiles : + if not os.path.isfile(inputFile) : + print("ERROR : could not find '%s'"%inputFile, file=outErr) + exit(1) + lightFilename = inputFile.split("/")[-1] + print("Compiling %s..."%lightFilename, end="", file=outVerbose) + returnCode = subprocess.Popen("{} {}".format(compiler(verbose=""), inputFile), shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE).wait() + print("Done (%d)"%returnCode, file=outVerbose) + if returnCode == expectedCode : + evaluation[1]["correct"].append(lightFilename) + else : + evaluation[1]["incorrect"].append(lightFilename) + print("", file=outVerbose) + + return evaluation +################################################################################ + +################################################################################ +def evaluateDiff(inputFiles, extension, extensionRef, path, name) : + evaluation = getNewEvaluationResult(name) + + for filename in inputFiles : + producedFile = changeExtension(filename, extension) + if not os.path.isfile(inputPath+producedFile) : + evaluation[1]["notfound"].append(producedFile) + continue + + ref = refPath+path+changeExtension(producedFile, extensionRef) + if not os.path.isfile(ref) : + print("ATTENTION : Fichier non trouvé : %s"%ref, file=sys.stderr) + continue + + refContent = [] + for line in open(ref, "r") : + line = line.strip() + if len(line) > 0 : + refContent.append(line) + producedContent = [] + for line in open(inputPath+producedFile, "r") : + line = line.strip() + if len(line) > 0 : + producedContent.append(line) + + if producedContent == refContent : + evaluation[1]["correct"].append(producedFile) + else : + evaluation[1]["incorrect"].append(producedFile) + + return evaluation +################################################################################ + +################################################################################ +def evaluateSa(inputFiles) : + errs = [] + for filename in inputFiles : + saFilename = inputPath+changeExtension(filename, ".sa") + outFilename = inputPath+changeExtension(filename, ".saout") + if not os.path.isfile(saFilename) : + continue + + command = ["java", "-classpath", findClasspath(), "SaVM", "-sa", saFilename] + with open(outFilename, 'w') as outfile: + process = subprocess.Popen(command, stdout=outfile, stderr=subprocess.PIPE) + out, err = process.communicate() + err = err.decode() + if len(err) != 0 : + errs.append("ERROR %s for input %s : '%s'"%(inspect.stack()[0][3], filename, err)) + + return evaluateDiff(inputFiles, ".saout", ".out", "out-ref/", "Execution de sa"), errs + +################################################################################ + +################################################################################ +def evaluateC3a(inputFiles) : + errs = [] + for filename in inputFiles : + c3aFilename = inputPath+changeExtension(filename, ".c3a") + tsFilename = inputPath+changeExtension(filename, ".ts") + outFilename = inputPath+changeExtension(filename, ".c3aout") + if not os.path.isfile(c3aFilename) or not os.path.isfile(tsFilename) : + continue + + command = ["java", "-classpath", findClasspath(), "C3aVM", "-c3a", c3aFilename, "-ts", tsFilename] + with open(outFilename, 'w') as outfile: + process = subprocess.Popen(command, stdout=outfile, stderr=subprocess.PIPE) + out, err = process.communicate() + err = err.decode() + if len(err) != 0 : + errs.append("ERROR %s for input %s : '%s'"%(inspect.stack()[0][3], filename, err)) + + return evaluateDiff(inputFiles, ".c3aout", ".out", "out-ref/", "Execution du c3a"), errs + +################################################################################ + +################################################################################ +def evaluatePreNasm(inputFiles) : + errs = [] + for filename in inputFiles : + nasmFilename = inputPath+changeExtension(filename, ".pre-nasm") + outFilename = inputPath+changeExtension(filename, ".pre-nasmout") + if not os.path.isfile(nasmFilename) : + continue + + command = ["java", "-classpath", findClasspath(), "NasmVM", "-nasm", nasmFilename] + with open(outFilename, 'w') as outfile: + process = subprocess.Popen(command, stdout=outfile, stderr=subprocess.PIPE) + out, err = process.communicate() + err = err.decode() + if len(err) != 0 : + errs.append("ERROR %s for input %s : '%s'"%(inspect.stack()[0][3], filename, err)) + + return evaluateDiff(inputFiles, ".pre-nasmout", ".out", "out-ref/", "Execution du pre-nasm"), errs + +################################################################################ + +################################################################################ +def evaluateNasm(inputFiles) : + errs = [] + for filename in inputFiles : + nasmFilename = inputPath+changeExtension(filename, ".nasm") + outFilename = inputPath+changeExtension(filename, ".nasmout") + if not os.path.isfile(nasmFilename) : + continue + + command = ["java", "-classpath", findClasspath(), "NasmVM", "-nasm", nasmFilename] + with open(outFilename, 'w') as outfile: + process = subprocess.Popen(command, stdout=outfile, stderr=subprocess.PIPE) + out, err = process.communicate() + err = err.decode() + if len(err) != 0 : + errs.append("ERROR %s for input %s : '%s'"%(inspect.stack()[0][3], filename, err)) + + return evaluateDiff(inputFiles, ".nasmout", ".out", "out-ref/", "Execution du nasm"), errs + +################################################################################ + +################################################################################ +def evaluateExecutable(inputFiles) : + errs = [] + for filename in inputFiles : + nasmFilename = changeExtension(filename, ".nasm") + objectFilename = changeExtension(filename, ".o") + execFilename = changeExtension(filename, ".exe") + outFilename = changeExtension(filename, ".exeout") + if not os.path.isfile(inputPath+nasmFilename) : + continue + + out = subprocess.Popen("cd {} && nasm -f elf -dwarf -g {}".format(inputPath+"..","input/"+nasmFilename), shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE).stderr.read() + if not os.path.isfile(inputPath+objectFilename) : + errs.append("ERROR %s for input %s : '%s'"%(inspect.stack()[0][3], filename, out)) + continue + out = subprocess.Popen("ld -m elf_i386 -o {}{} {}{}".format(inputPath,execFilename,inputPath,objectFilename), shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE).stderr.read() + if not os.path.isfile(inputPath+execFilename) : + errs.append("ERROR %s for input %s : '%s'"%(inspect.stack()[0][3], filename, out)) + continue + out = subprocess.Popen("{}{} > {}{}".format(inputPath,execFilename,inputPath,outFilename), shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE).stderr.read() + if not os.path.isfile(inputPath+outFilename) : + errs.append("ERROR %s for input %s : '%s'"%(inspect.stack()[0][3], filename, out)) + continue + + return evaluateDiff(inputFiles, ".exeout", ".out", "out-ref/", "Execution du binaire"), errs +################################################################################ + +################################################################################ +def printListElements(destination, elements, colorFunction, useColor, resultStr) : + if len(elements) == 0 : + return + maxColumnSize = len(max(elements, key=len)) + for filename in elements : + if useColor : + print("\t{}".format(colorFunction(filename)), file=destination) + else : + print("\t{:{}} {}".format(filename, maxColumnSize+2, resultStr), file=destination) +################################################################################ + +################################################################################ +def printEvaluationResult(destination, evaluationResult, useColor) : + name = evaluationResult[0] + correct = evaluationResult[1]["correct"] + incorrect = evaluationResult[1]["incorrect"] + notfound = evaluationResult[1]["notfound"] + + nbCorrect = len(correct) + nbTotal = len(correct) + len(incorrect) + len(notfound) + + score = 0.0 + if nbTotal > 0 : + score = 100.0*nbCorrect/nbTotal + for dest, color in [(destination, useColor), (open(outputFilename, "a"), False)] : + print("Évaluation de %s :"%name, file=dest) + print("{}/{} correct ({:6.2f}%)".format(nbCorrect, nbTotal, score), file=dest) + if nbCorrect+len(incorrect) > 0 : + printListElements(dest, correct, green, color, "CORRECT") + printListElements(dest, incorrect, purple, color, "INCORRECT") + printListElements(dest, notfound, red, color, "NON-EXISTANT") + return score +################################################################################ + +################################################################################ +if __name__ == "__main__" : + parser = argparse.ArgumentParser() + parser.add_argument("--verbose", "-v", default=False, action="store_true", + help="Verbose output (obsolete, verbose is default).") + parser.add_argument("--silent", "-s", default=False, action="store_true", + help="Less verbose output.") + parser.add_argument("--noColors", default=False, action="store_true", + help="Disable colors in output.") + parser.add_argument("--clean", "-c", default=False, action="store_true", + help="Clean input dir then exit.") + parser.add_argument("--number", "-n", default=None, type=int, + help="Restrict tests to n inputs.") + parser.add_argument("--files", "-f", default=[], nargs="*", + help="Specify input files.") + args = parser.parse_args() + + args.verbose = not args.silent + + if args.verbose : + outVerbose = outScore + if args.clean : + deleteCompilationOutputs() + exit(0) + + with open(outputFilename, "w") as _ : + pass + + inputFiles = args.files[:args.number] + if len(inputFiles) == 0 : + inputFiles = findInputFiles(inputPath)[:args.number] + + errInputFilesTs = [errInputPathTs+"/"+f for f in findInputFiles(errInputPathTs)[:args.number]] + errInputFilesType = [errInputPathType+"/"+f for f in findInputFiles(errInputPathType)[:args.number]] + + deleteCompilationOutputs() + + compileCompiler() + + + scores = [] + names = [] + errors = [] + names.append("SC ") + res = compileInputFiles(inputFiles) + scores.append(printEvaluationResult(outVerbose, res, not args.noColors)) + msg = "Diff de %s" + dfSa = lambda files : (evaluateDiff(inputFiles, ".sa", ".sa", "sa-ref/", msg%"sa"), []) + dfTs = lambda files : (evaluateDiff(inputFiles, ".ts", ".ts", "ts-ref/", msg%"ts"), []) + dfC3a = lambda files : (evaluateDiff(inputFiles, ".c3a", ".c3a", "c3a-ref/", msg%"c3a"), []) + dfPreNasm = lambda files : (evaluateDiff(inputFiles, ".pre-nasm", ".pre-nasm", "pre-nasm-ref/", msg%"pre-nasm"), []) + dfNasm = lambda files : (evaluateDiff(inputFiles, ".nasm", ".nasm", "nasm-ref/", msg%"nasm"), []) + + # Evaluation of normal (working) examples + for evalTarget in [ + ("SA-DIFF ", dfSa), + ("TS-DIFF ", dfTs), + ("SA ", evaluateSa), + ("C3A-DIFF ", dfC3a), + ("C3A ", evaluateC3a), + ("PRE-NASM-DIFF", dfPreNasm), + ("PRE-NASM ", evaluatePreNasm), + ("NASM-DIFF ", dfNasm), + ("NASM ", evaluateNasm), + ("EXE ", evaluateExecutable), + ] : + names.append(evalTarget[0]) + res, err = evalTarget[1](inputFiles) + scores.append(printEvaluationResult(outVerbose, res, not args.noColors)) + errors += err + + # Evaluation of ill formed examples, that should trigger a compilation error + for evalTarget in [ + ("ERR_TS ", evaluateCompilationErrors, errInputFilesTs, ERR_SYMBOL_TABLE_CODE), + ("ERR_TYPE ", evaluateCompilationErrors, errInputFilesType, ERR_TYPE_CODE), + ] : + names.append(evalTarget[0]) + res = evalTarget[1](evalTarget[2], evalTarget[3], evalTarget[0]) + scores.append(printEvaluationResult(outVerbose, res, not args.noColors)) + + deleteClasses() + + # The rest of the script will now print the results + + if not args.noColors : + print("Légende : {} {} {}".format(green("CORRECT"), purple("INCORRECT"), red("NON-EXISTANT")), file=outVerbose) + + errorsStr = "" + + if len(errors) > 0 : + errorsStr = "%s\n%s"%((30*"-")+("EVALUATION ERRORS")+(30*"-"), "\n\n".join(errors)) + + print(errorsStr) + print(errorsStr, file=open(outputFilename, "a")) + + for i in range(len(scores)): + print(names[i], "\t", scores[i]) + + print("Copy-pastable scores :", file=outScore) + print("\t".join(names), file=outScore) + print("\t".join(["%6.2f"%scores[i] for i in range(len(scores))]), file=outScore) + + print("\nSauvegardé dans le fichier %s"%outputFilename) + + # les coefficients associés à chaque partie pour le calcul de la note finale + coeffs = [SC_COEFF, SA_DIFF_COEFF, TS_DIFF_COEFF, SA_COEFF, C3A_DIFF_COEFF, C3A_COEFF, PRE_NASM_DIFF, PRE_NASM_COEFF, NASM_DIFF_COEFF, NASM_COEFF, EXE_COEFF, ERR_TS_COEFF, ERR_TYPE_COEFF] + + # calcul de la note finale + + note = 0 + for i in range(len(scores)): + note += scores[i] / 100 * coeffs[i] + print ("note = ", note) + +################################################################################ diff --git a/test/result.txt b/test/result.txt index 8ab799be07f0cf7d6471068de45e24918f058742..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 --- a/test/result.txt +++ b/test/result.txt @@ -1,410 +0,0 @@ -Évaluation de 5 : -80/80 correct (100.00%) - add1.l CORRECT - add2.l CORRECT - affect1.l CORRECT - affect2.l CORRECT - affect3.l CORRECT - and1.l CORRECT - and2.l CORRECT - and3.l CORRECT - and4.l CORRECT - and5.l CORRECT - appel-param1.l CORRECT - appel-param2.l CORRECT - appel-param3.l CORRECT - appel-retour1.l CORRECT - appel1.l CORRECT - appel2.l CORRECT - appel3.l CORRECT - div1.l CORRECT - div2.l CORRECT - div3.l CORRECT - div4.l CORRECT - ecrire1.l CORRECT - ecrire2.l CORRECT - egal1.l CORRECT - egal2.l CORRECT - egal3.l CORRECT - fibo.l CORRECT - inf1.l CORRECT - inf2.l CORRECT - inf3.l CORRECT - mult1.l CORRECT - mult2.l CORRECT - mult3.l CORRECT - not1.l CORRECT - not2.l CORRECT - not3.l CORRECT - or1.l CORRECT - or2.l CORRECT - or3.l CORRECT - or4.l CORRECT - or5.l CORRECT - parenth1.l CORRECT - parenth2.l CORRECT - prio34-1.l CORRECT - prio34-2.l CORRECT - prio34-3.l CORRECT - prio34-4.l CORRECT - prio45-1.l CORRECT - prio45-2.l CORRECT - prio45-3.l CORRECT - prio45-4.l CORRECT - prio56-1.l CORRECT - prio56-2.l CORRECT - prio67-1.l CORRECT - prio67-2.l CORRECT - rec1.l CORRECT - si1.l CORRECT - si2.l CORRECT - si3.l CORRECT - si4.l CORRECT - si5.l CORRECT - sub1.l CORRECT - sub2.l CORRECT - sub3.l CORRECT - tab1.l CORRECT - tab2.l CORRECT - tab3.l CORRECT - tab4.l CORRECT - tantque1.l CORRECT - tantque2.l CORRECT - tri.l CORRECT - varglob1.l CORRECT - varglob2.l CORRECT - varglob3.l CORRECT - varglob4.l CORRECT - varloc1.l CORRECT - varloc2.l CORRECT - varloc3.l CORRECT - varloc4.l CORRECT - varloc5.l CORRECT -Évaluation de Diff de sa : -80/80 correct (100.00%) - add1.sa CORRECT - add2.sa CORRECT - affect1.sa CORRECT - affect2.sa CORRECT - affect3.sa CORRECT - and1.sa CORRECT - and2.sa CORRECT - and3.sa CORRECT - and4.sa CORRECT - and5.sa CORRECT - appel-param1.sa CORRECT - appel-param2.sa CORRECT - appel-param3.sa CORRECT - appel-retour1.sa CORRECT - appel1.sa CORRECT - appel2.sa CORRECT - appel3.sa CORRECT - div1.sa CORRECT - div2.sa CORRECT - div3.sa CORRECT - div4.sa CORRECT - ecrire1.sa CORRECT - ecrire2.sa CORRECT - egal1.sa CORRECT - egal2.sa CORRECT - egal3.sa CORRECT - fibo.sa CORRECT - inf1.sa CORRECT - inf2.sa CORRECT - inf3.sa CORRECT - mult1.sa CORRECT - mult2.sa CORRECT - mult3.sa CORRECT - not1.sa CORRECT - not2.sa CORRECT - not3.sa CORRECT - or1.sa CORRECT - or2.sa CORRECT - or3.sa CORRECT - or4.sa CORRECT - or5.sa CORRECT - parenth1.sa CORRECT - parenth2.sa CORRECT - prio34-1.sa CORRECT - prio34-2.sa CORRECT - prio34-3.sa CORRECT - prio34-4.sa CORRECT - prio45-1.sa CORRECT - prio45-2.sa CORRECT - prio45-3.sa CORRECT - prio45-4.sa CORRECT - prio56-1.sa CORRECT - prio56-2.sa CORRECT - prio67-1.sa CORRECT - prio67-2.sa CORRECT - rec1.sa CORRECT - si1.sa CORRECT - si2.sa CORRECT - si3.sa CORRECT - si4.sa CORRECT - si5.sa CORRECT - sub1.sa CORRECT - sub2.sa CORRECT - sub3.sa CORRECT - tab1.sa CORRECT - tab2.sa CORRECT - tab3.sa CORRECT - tab4.sa CORRECT - tantque1.sa CORRECT - tantque2.sa CORRECT - tri.sa CORRECT - varglob1.sa CORRECT - varglob2.sa CORRECT - varglob3.sa CORRECT - varglob4.sa CORRECT - varloc1.sa CORRECT - varloc2.sa CORRECT - varloc3.sa CORRECT - varloc4.sa CORRECT - varloc5.sa CORRECT -Évaluation de Diff de ts : -80/80 correct (100.00%) - add1.ts CORRECT - add2.ts CORRECT - affect1.ts CORRECT - affect2.ts CORRECT - affect3.ts CORRECT - and1.ts CORRECT - and2.ts CORRECT - and3.ts CORRECT - and4.ts CORRECT - and5.ts CORRECT - appel-param1.ts CORRECT - appel-param2.ts CORRECT - appel-param3.ts CORRECT - appel-retour1.ts CORRECT - appel1.ts CORRECT - appel2.ts CORRECT - appel3.ts CORRECT - div1.ts CORRECT - div2.ts CORRECT - div3.ts CORRECT - div4.ts CORRECT - ecrire1.ts CORRECT - ecrire2.ts CORRECT - egal1.ts CORRECT - egal2.ts CORRECT - egal3.ts CORRECT - fibo.ts CORRECT - inf1.ts CORRECT - inf2.ts CORRECT - inf3.ts CORRECT - mult1.ts CORRECT - mult2.ts CORRECT - mult3.ts CORRECT - not1.ts CORRECT - not2.ts CORRECT - not3.ts CORRECT - or1.ts CORRECT - or2.ts CORRECT - or3.ts CORRECT - or4.ts CORRECT - or5.ts CORRECT - parenth1.ts CORRECT - parenth2.ts CORRECT - prio34-1.ts CORRECT - prio34-2.ts CORRECT - prio34-3.ts CORRECT - prio34-4.ts CORRECT - prio45-1.ts CORRECT - prio45-2.ts CORRECT - prio45-3.ts CORRECT - prio45-4.ts CORRECT - prio56-1.ts CORRECT - prio56-2.ts CORRECT - prio67-1.ts CORRECT - prio67-2.ts CORRECT - rec1.ts CORRECT - si1.ts CORRECT - si2.ts CORRECT - si3.ts CORRECT - si4.ts CORRECT - si5.ts CORRECT - sub1.ts CORRECT - sub2.ts CORRECT - sub3.ts CORRECT - tab1.ts CORRECT - tab2.ts CORRECT - tab3.ts CORRECT - tab4.ts CORRECT - tantque1.ts CORRECT - tantque2.ts CORRECT - tri.ts CORRECT - varglob1.ts CORRECT - varglob2.ts CORRECT - varglob3.ts CORRECT - varglob4.ts CORRECT - varloc1.ts CORRECT - varloc2.ts CORRECT - varloc3.ts CORRECT - varloc4.ts CORRECT - varloc5.ts CORRECT -Évaluation de Execution de sa : -79/80 correct ( 98.75%) - add1.saout CORRECT - add2.saout CORRECT - affect1.saout CORRECT - affect2.saout CORRECT - affect3.saout CORRECT - and1.saout CORRECT - and2.saout CORRECT - and3.saout CORRECT - and4.saout CORRECT - and5.saout CORRECT - appel-param1.saout CORRECT - appel-param2.saout CORRECT - appel-param3.saout CORRECT - appel-retour1.saout CORRECT - appel1.saout CORRECT - appel2.saout CORRECT - appel3.saout CORRECT - div1.saout CORRECT - div2.saout CORRECT - div3.saout CORRECT - div4.saout CORRECT - ecrire1.saout CORRECT - ecrire2.saout CORRECT - egal1.saout CORRECT - egal2.saout CORRECT - egal3.saout CORRECT - fibo.saout CORRECT - inf1.saout CORRECT - inf2.saout CORRECT - inf3.saout CORRECT - mult1.saout CORRECT - mult2.saout CORRECT - mult3.saout CORRECT - not1.saout CORRECT - not2.saout CORRECT - not3.saout CORRECT - or1.saout CORRECT - or2.saout CORRECT - or3.saout CORRECT - or4.saout CORRECT - or5.saout CORRECT - parenth1.saout CORRECT - parenth2.saout CORRECT - prio34-1.saout CORRECT - prio34-2.saout CORRECT - prio34-3.saout CORRECT - prio34-4.saout CORRECT - prio45-1.saout CORRECT - prio45-2.saout CORRECT - prio45-3.saout CORRECT - prio45-4.saout CORRECT - prio56-1.saout CORRECT - prio56-2.saout CORRECT - prio67-1.saout CORRECT - prio67-2.saout CORRECT - rec1.saout CORRECT - si1.saout CORRECT - si2.saout CORRECT - si3.saout CORRECT - si4.saout CORRECT - si5.saout CORRECT - sub1.saout CORRECT - sub2.saout CORRECT - sub3.saout CORRECT - tab1.saout CORRECT - tab2.saout CORRECT - tab3.saout CORRECT - tab4.saout CORRECT - tantque1.saout CORRECT - tantque2.saout CORRECT - tri.saout CORRECT - varglob1.saout CORRECT - varglob2.saout CORRECT - varglob3.saout CORRECT - varglob4.saout CORRECT - varloc1.saout CORRECT - varloc2.saout CORRECT - varloc3.saout CORRECT - varloc4.saout CORRECT - varloc5.saout INCORRECT -Évaluation de Diff de c3a : -0/80 correct ( 0.00%) - add1.c3a INCORRECT - add2.c3a INCORRECT - affect1.c3a INCORRECT - affect2.c3a INCORRECT - affect3.c3a INCORRECT - and1.c3a INCORRECT - and2.c3a INCORRECT - and3.c3a INCORRECT - and4.c3a INCORRECT - and5.c3a INCORRECT - appel-param1.c3a INCORRECT - appel-param2.c3a INCORRECT - appel-param3.c3a INCORRECT - appel-retour1.c3a INCORRECT - appel1.c3a INCORRECT - appel2.c3a INCORRECT - appel3.c3a INCORRECT - div1.c3a INCORRECT - div2.c3a INCORRECT - div3.c3a INCORRECT - div4.c3a INCORRECT - ecrire1.c3a INCORRECT - ecrire2.c3a INCORRECT - egal1.c3a INCORRECT - egal2.c3a INCORRECT - egal3.c3a INCORRECT - fibo.c3a INCORRECT - inf1.c3a INCORRECT - inf2.c3a INCORRECT - inf3.c3a INCORRECT - mult1.c3a INCORRECT - mult2.c3a INCORRECT - mult3.c3a INCORRECT - not1.c3a INCORRECT - not2.c3a INCORRECT - not3.c3a INCORRECT - or1.c3a INCORRECT - or2.c3a INCORRECT - or3.c3a INCORRECT - or4.c3a INCORRECT - or5.c3a INCORRECT - parenth1.c3a INCORRECT - parenth2.c3a INCORRECT - prio34-1.c3a INCORRECT - prio34-2.c3a INCORRECT - prio34-3.c3a INCORRECT - prio34-4.c3a INCORRECT - prio45-1.c3a INCORRECT - prio45-2.c3a INCORRECT - prio45-3.c3a INCORRECT - prio45-4.c3a INCORRECT - prio56-1.c3a INCORRECT - prio56-2.c3a INCORRECT - prio67-1.c3a INCORRECT - prio67-2.c3a INCORRECT - rec1.c3a INCORRECT - si1.c3a INCORRECT - si2.c3a INCORRECT - si3.c3a INCORRECT - si4.c3a INCORRECT - si5.c3a INCORRECT - sub1.c3a INCORRECT - sub2.c3a INCORRECT - sub3.c3a INCORRECT - tab1.c3a INCORRECT - tab2.c3a INCORRECT - tab3.c3a INCORRECT - tab4.c3a INCORRECT - tantque1.c3a INCORRECT - tantque2.c3a INCORRECT - tri.c3a INCORRECT - varglob1.c3a INCORRECT - varglob2.c3a INCORRECT - varglob3.c3a INCORRECT - varglob4.c3a INCORRECT - varloc1.c3a INCORRECT - varloc2.c3a INCORRECT - varloc3.c3a INCORRECT - varloc4.c3a INCORRECT - varloc5.c3a INCORRECT