This commit is contained in:
Rochas
2025-04-30 15:23:46 +02:00
parent 43eccbd4c9
commit ed78ab828d
48 changed files with 200 additions and 25 deletions

4
NULL Normal file
View File

@@ -0,0 +1,4 @@
tests\testsAdvanced\portee3.ll:20:4: error: multiple definition of local value named 'null'
20 | %null = alloca i32
| ^
1 error generated.

169
runAllTests2.py Normal file
View File

@@ -0,0 +1,169 @@
#!/usr/bin/env python3
import os
import subprocess
from colorama import init as colorama_init
from colorama import Fore
from colorama import Style
stats = {}
# Détermine quel est l'exécutable clang utilisable.
# Note : à l'istic c'est clang-19
def clangName():
for name in ["clang-" + str(v) for v in range(20,16,-1)]:
p = subprocess.run(f"command -v {name} 2>&1 >/dev/null", shell=True)
if p.returncode == 0 :
return name
return "clang"
clang = clangName()
def runNormalTestSuit(testSuit):
print(f"Running test suit : {testSuit}")
stats[testSuit] = (0,0,0,0)
for dirname, dirnames, filenames in os.walk(testSuit):
for filename in filenames:
runNormalTest(testSuit, dirname, filename)
def runNormalTest(testSuit, dirname,filename):
vslToLLVM = False
llvmToBin = False
executionCorrect = False
path = os.path.join(dirname, filename)
basename, ext = os.path.splitext(path)
# Ignore not .vsl files
if ext != ".vsl":
return
print(f'\tRunning test {filename}')
# VSL -> LLVM
p = subprocess.run(f"java -jar build/libs/TP2.jar {path}", shell=True)
print(f"java -jar build/libs/TP2.jar {path}")
if p.returncode == 0 :
vslToLLVM = True
# LLVM -> Bin
if vslToLLVM :
p = subprocess.run(f"{clang} {basename}.ll -o {basename} 2>NULL", shell=True)
print(f"{clang} {basename}.ll -o {basename} 2>NULL")
if p.returncode == 0:
llvmToBin = True
executionCorrect = True
# Exe
if llvmToBin :
executionCorrect = True
try:
input = ""
if os.path.isfile(f"{basename}.test_in"):
input = f"< {basename}.test_in"
p = subprocess.run(f".\{basename} " + input, shell=True, stdout=subprocess.PIPE, timeout=5)
print(f".\{basename} ")
except subprocess.TimeoutExpired:
executionCorrect = "diverge" in basename
# Check return code
if os.path.isfile(f"{basename}.test_ret"):
with open(f"{basename}.test_ret", "r") as expected:
executionCorrect = executionCorrect and int(expected.read()) == p.returncode
# Check stdout
if os.path.isfile(f"{basename}.test_out"):
with open(f"{basename}.test_out", "rb") as expected:
executionCorrect = executionCorrect and expected.read() == p.stdout
print(f"{colorFromBool(vslToLLVM)}\t\tVSL to LLVM : {'OK' if vslToLLVM else 'Fail'}{Style.RESET_ALL}")
print(f"{colorFromBool(llvmToBin)}\t\tLLVM to Bin : {'OK' if llvmToBin else 'Fail'}{Style.RESET_ALL}")
print(f"{colorFromBool(executionCorrect)}\t\tCorrect Execution : {'OK' if executionCorrect else 'Fail'}{Style.RESET_ALL}")
x,y,z,t = stats[testSuit]
if vslToLLVM :
x += 1
if llvmToBin :
y += 1
if executionCorrect :
z += 1
t += 1
stats[testSuit] = (x,y,z,t)
def colorFromBool(b):
if b:
return Fore.GREEN
else:
return Fore.RED
def afficheStats(stat):
x,y,z,t = stat
print(f'\t Nombre de tests : {t}')
print(f'{colorFromBool(x==t)}\t vsl to llvm : {x} / {t}{Style.RESET_ALL}')
print(f'{colorFromBool(y==t)}\t llvm to bin : {y} / {t}{Style.RESET_ALL}')
print(f'{colorFromBool(z==t)}\t resultat correct: {z} / {t}{Style.RESET_ALL}')
nbError = 0
nbErrorTests = 0
def runErrorTest(testSuit, dirname,filename):
path = os.path.join(dirname, filename)
basename, ext = os.path.splitext(path)
if ext != ".vsl":
return
print(f'\tRunning test {filename}')
hasError = False
p = subprocess.run(f"java -jar build/libs/TP2.jar < {path} 1>{basename}.ll", shell=True, stderr=subprocess.PIPE)
if p.returncode != 0 and p.stderr != b'':
print(f"\t\t{Fore.GREEN}Error : Yes{Style.RESET_ALL}")
hasError = True
else:
print(f"\t\t{Fore.RED}Error : No{Style.RESET_ALL}")
hasError = False
x,t = stats[testSuit]
if hasError :
x += 1
t += 1
stats[testSuit] = (x,t)
def runErrorLevelTests(testSuit):
print(f"Running test suit : {testSuit}")
stats[testSuit] = (0,0)
for dirname, dirnames, filenames in os.walk(testSuit):
for filename in filenames:
runErrorTest(testSuit, dirname, filename)
def runTests(testDirName):
folderContent = [os.path.join(testDirName, d) for d in os.listdir(testDirName)]
testSuits = [d for d in folderContent if os.path.isdir(d)]
testSuits.sort()
for suit in testSuits:
if "error" in suit or "Error" in suit:
runErrorLevelTests(suit)
else:
runNormalTestSuit(suit)
for suit in testSuits:
print(f'Résumé du test {suit}')
if "error" in suit or "Error" in suit:
nbError, nbErrorTests = stats[suit]
print(f'{colorFromBool(nbError==nbErrorTests)}\t Nombre d\'erreurs : {nbError} / {nbErrorTests}{Style.RESET_ALL}')
else:
afficheStats(stats[suit])
if __name__ == "__main__" :
colorama_init()
runTests("tests")

View File

@@ -23,21 +23,21 @@ import java.util.*;
/*
./gradlew build
java -jar build/libs/TP2.jar tests/fragment0/priority2.vsl
java -jar build/libs/TP2.jar tests/aLaMain.vsl
(/!\ pas besoin, le main le fait tout seul /!\) java -jar build/libs/TP2.jar tests/fragment1/while2.vsl > tests/fragment1/while2.ll
clang tests/aLaMain.ll -o tests/aLaMain
*/
/* TODO : problème de "-" : un NUMVER seul avec un "-" devant doit être reconnu comme un NUMBER négatif
frament 1 :
java -jar build/libs/TP2.jar tests/fragment1/print4.vsl
java -jar build/libs/TP2.jar tests/fragment1/while2.vsl > tests/fragment1/while2.ll
clang tests/fragment1/while2.ll -o tests/fragment1/while2
*/
public class Main {
static Boolean TESTAUTOMOD = false;
public static void main(String[] args) {
try {
// Set input
@@ -62,18 +62,17 @@ public class Main {
// Pretty-print the program (to debug parsing)
System.out.println(ast.prettyprinter());
if(!TESTAUTOMOD) System.out.println(ast.prettyprinter());
// Verify the program semantic
// Generate the intermediate representation
System.out.println("\n\n");
PrintWriter out2 = new PrintWriter(new OutputStreamWriter(System.out, StandardCharsets.UTF_8), true);
if(!TESTAUTOMOD) System.out.println("\n\n");
ProgramLLVMImp astLLVM = ast.toLLVM();
String llvmStr = astLLVM.prettyprinter();
out2.println(llvmStr);
System.out.println(llvmStr);
/*
utiliser la commande :
@@ -81,14 +80,17 @@ public class Main {
provoque peut provoquer de mauvais encodage (UTF16(LE) au lieu d'UTF8)
et empêche l'utilisation de print pour autre chose
*/
String sortieLLVM = args[0].replace(".vsl", ".ll");
Files.write(
Paths.get(sortieLLVM),
llvmStr.getBytes(StandardCharsets.UTF_8)
);
System.out.println("\n[VSL compile Succes] : " + args[0] + " -> " + sortieLLVM +"\n");
if(!TESTAUTOMOD){
String sortieLLVM = args[0].replace(".vsl", ".ll");
Files.write(
Paths.get(sortieLLVM),
llvmStr.getBytes(StandardCharsets.UTF_8)
);
System.out.println("\n[VSL compile succes] : " + args[0] + " -> " + sortieLLVM);
System.out.println("Pour compiler en bin utilisez :");
System.out.println("clang " + sortieLLVM + " -o " + sortieLLVM.replace(".ll", "") + "\n");
}
} catch (IOException | RecognitionException e) {
e.printStackTrace();

View File

@@ -78,7 +78,7 @@ public class toLLVM_Visitor implements ProgramVisitor<SymTable,ProgramLLVMImp>,
paramsLLVM.add(var);
VarLLVMImp newVar =new VarLLVMImp(type, nameVar,false);
setParam.add(new AssignLLVMImp(newVar,new allocaLLVMImp(type)));
setParam.add(new StoreLLVMImp(type,var,type,newVar));
setParam.add(new StoreLLVMImp(type,var,newVar));
}
instrLLVM.addAll(setParam);
instrLLVM.addAll(fun.instruction().accept(this, h));
@@ -184,7 +184,7 @@ public class toLLVM_Visitor implements ProgramVisitor<SymTable,ProgramLLVMImp>,
ArrayList<InstructionLLVM> result = new ArrayList<>();
result.addAll(res.instrs);
//InstructionLLVM r = new AssignLLVMImp(new VarLLVMImpl(var.getType(),instr.t()),var);
InstructionLLVM r = new StoreLLVMImp(var.getType(),var,var.getType(),new VarLLVMImp(var.getType(),h.getVar(instr.t()),false));
InstructionLLVM r = new StoreLLVMImp(var.getType(),var,new VarLLVMImp(var.getType(),h.getVar(instr.t()),false));
result.add(r);
return result;
}

View File

@@ -132,7 +132,7 @@ TypeLLVMVisitor<String,String>
@Override
public String visitStoreLLVM(StoreLLVMImp instr, String h) {
return INDENT+"store " + instr.valType().accept(this, "") + " " + instr.e().accept(this, "") + ", " + new PointerLLVMImp(instr.varType()).accept(this, "") + " " + instr.var().accept(this,"");
return INDENT+"store " + instr.type().accept(this, "") + " " + instr.e().accept(this, "") + ", " + new PointerLLVMImp(instr.type()).accept(this, "") + " " + instr.var().accept(this,"");
}

View File

@@ -67,7 +67,7 @@ public class ProgramLLVM {
}
}
public static record StoreLLVMImp(TypeLLVM valType, ExpressionLLVM e,TypeLLVM varType, ValLLVM var) implements InstructionLLVM{
public static record StoreLLVMImp(TypeLLVM type, ExpressionLLVM e, ValLLVM var) implements InstructionLLVM{
@Override
public <H, S> S accept(InstructionLLVMVisitor<H, S> v, H h) {
return v.visitStoreLLVM(this, h);

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.