Tests, Structure, More #10

Merged
i22005 merged 15 commits from Tests into main 2024-06-21 16:16:54 +00:00
11 changed files with 117 additions and 61 deletions
Showing only changes of commit 8d6190b130 - Show all commits

View File

@ -9,8 +9,8 @@
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<maven.compiler.source>22</maven.compiler.source>
<maven.compiler.target>22</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

View File

@ -1,18 +1,14 @@
import ast.ASTNode;
import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.Token;
import ast.ProgramNode;
import bytecode.ByteCodeGenerator;
import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.tree.ParseTree;
import org.antlr.v4.runtime.CommonTokenStream;
import parser.ASTBuilder;
import parser.generated.SimpleJavaLexer;
import parser.generated.SimpleJavaParser;
import semantic.SemanticAnalyzer;
import bytecode.ByteCodeGenerator;
import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.ParseTree;
import java.io.IOException;
import java.nio.file.Paths;
import java.util.List;
@ -20,7 +16,7 @@ import java.util.List;
public class Main {
i22005 marked this conversation as resolved Outdated

Warum muss der compiler mit einem Makefile gestartet werden? Es reicht doch wenn wir die jar mit
Java compiler fileIn fileOut ausführt.

Warum muss der compiler mit einem Makefile gestartet werden? Es reicht doch wenn wir die jar mit Java compiler fileIn fileOut ausführt.
public static void main(String[] args) throws Exception {
if (args.length > 0) {
System.out.println("Main file has args: " + args[0]);
} else {
try {
CharStream codeCharStream = CharStreams.fromPath(Paths.get("src/main/resources/CompilerInput.java"));

View File

@ -52,7 +52,7 @@ public class ClassCodeGen implements ClassVisitor {
}
private void printIntoClassFile(byte[] byteCode, String name) {
String directoryPath = "src/main/java/classFileOutput";
String directoryPath = "src/main/resources/classFileOutput";
File directory = new File(directoryPath);
if (!directory.exists()) {
directory.mkdirs();

View File

@ -1,18 +1,16 @@
public class Example {
public class CompilerInput {
public int a;
public static int testMethod(char x){
return 0;
}
public class Test {
public static int testMethod(char x, int a){
return 0;
}
}
}
public class Test {
public static int testMethod(char x, int a){
}
}

24
src/test/Makefile Normal file
View File

@ -0,0 +1,24 @@
# Makefile
### IntelliJs play buttons do not work. Run in "src/test" folder with "make" command to run all
### Or run only parts with "make compile-javac", "make delete" etc.
all: delete compile-javac compile-raupenpiler
compile-javac:
javac -d .\resources\output\javac .\resources\CompilerInput.java
compile-raupenpiler:
## funktioniert bisher nicht, das will die Klasse nicht laden, der traditionelle Weg findet externe Libraries (antlr) nicht, maven hat andere Probleme
## Unseren Compiler also erstmal händisch starten: main.java/Main.java
#javac -d ./resources/output/raupenpiler -cp ../main/java;../../.lib/antlr-4.12.0-complete.jar ../main/java/Main.java
#java -cp ./resources/output/raupenpiler Main
#mvn -f ../../ compile
#mvn -f ../../ exec:java -Dexec.mainClass="Main"
delete:
rm -f ./resources/output/javac/*.class
rm -f ./resources/output/raupenpiler/*.class
rm -f ./java/*.class
rm -f ../main/resources/classFileOutput/*.class

View File

@ -1,5 +1,7 @@
# Scanner
## Scanner Input
### Beispiel 1: Empty Class
String empty class = "public class Name {}";
@ -15,11 +17,12 @@
"}"
## Scanner Output
### Beispiel 1: Empty Class
Token Type; Token Text
Type gibts nur bei Terminalen, Text bei allen
[null "public", null "class", IDENTIFIER "Name", null "{", null "}", EOF "<EOF>"]
Bsp von Ihm mal:
@ -35,52 +38,62 @@ Type gibts nur bei Terminalen, Text bei allen
[TokRightBrace]
# Parser
## Parser Input
## Parser Input
(Scanner Output)
## Parser Output (AST)
### Beispiel 1: Empty Class
### Beispiel 1: Empty Class
### Beispiel 2: Filled Class
# Semantische Analyse / Typcheck
## Typcheck Input
## Typcheck Input
(Parser Output = AST)
## Typcheck Output
### Beispiel 1: Empty Class
### Beispiel 2: Filled Class
# Bytecodegenerierung
## Bytecodegenerierung Input
## Bytecodegenerierung Input
(Typcheck Output = vom Typcheck eventuell manipulierter AST)
## Bytecodegenerierung Output
### Beispiel 1: Empty Class
Compiled Classfile
public class javaFileInput.Example {
}
### Beispiel 2: Filled Class
## E2E Tests:
für E2E Tests:
Testdatei mit Main ausführen/kompilieren
Testdatei mit "javac CompilerInput.java" kompilieren
- Testdatei mit Main ausführen/kompilieren
- Testdatei mit "javac -d output .\CompilerInput.java" kompilieren
- -> Dateien mit javap vergleichen
wenn beides erfolgreich
Ergebnis vom eigenen Compiler mit "java myOutput" ausführen
Ergebnis von javac mit "java CompilerInput" ausführen
wenn beides erfolgreich
- Ergebnis vom eigenen Compiler mithilfe von TestCompilerOutput ausführen
- (Ergebnis von javac mithilfe von TestCompilerOutput ausführen)
### Andis Tipps:
- cp mitgeben
- makefile
- java -jar pfadtocompiler.jar EmptyClass.java
- mvn package
- javac tester // tester compilen
- java tester // tester ausführen
- -> tester ist in unserem Fall TestCompilerOutput.java

View File

@ -0,0 +1,41 @@
/**
* This class is used to test the output of the compiler.
* <p>
* Im gleichen Ordner wie die diese Datei (TestCompilerOutput.java) muss die selbstkompilierte CompilerInput.java Datei sein.
* --->>>> Diese muss man also vom Ordner classFileOutput in diesen ordner hier (test/java) rein kopieren. (bis es eine bessere Lösung gibt) <<<<---
* Die selbstkompilierte .class Datei wird dann hier drin geladen und eine Instanz von ihr erstellt, es können auch Methoden aufgerufen werden.
* Diese TestCompilerOutput.java Datei wird dann mit "javac .\TestCompilerOutput.java" kompiliert und mit "java TestCompilerOutput" ausgeführt.
* Wenn unser Compiler funktioniert, sollten keine Errors kommen (sondern nur die Ausgaben, die wir in der CompilerInput.java Datei gemacht haben,
* oder Methoden, die wir hier aufrufen).
* PROBLEM: hier kommen errors, was eigentlich heißt, dass der Compiler nicht funktioniert, der der Test sollt eigentlich passen
*/
public class TestCompilerOutput {
public static void main(String[] args) {
try {
// Try to load the class named "CompilerInput"
Class<?> cls = Class.forName("CompilerInput");
// Print a success message if the class is loaded successfully
System.out.println("Class loaded successfully: " + cls.getName());
// Try to create an instance of the loaded class
Object instance = cls.getDeclaredConstructor().newInstance();
// Print a success message if the instance is created successfully
System.out.println("Instance created: " + instance);
// If the class has a main method, you can invoke it
// cls.getMethod("main", String[].class).invoke(null, (Object) new String[]{});
// If the class has other methods, you can invoke them as well
// Example: cls.getMethod("someMethod").invoke(instance);
} catch (ClassNotFoundException e) {
// Print an error message if the class is not found
System.err.println("Class not found: " + e.getMessage());
} catch (Exception e) {
// Print an error message if any other exception occurs during class loading or instance creation
System.err.println("Error during class loading or execution: " + e.getMessage());
}
}
}

View File

@ -1,12 +0,0 @@
public class Tester {
public static void main(String[] args) {
}
}
// cp mitgeben
// java -jar pfadtocompiler.jar EmptyClass.java
// mit bash scipt ode rmakefile test automatisieren
// mvn package
// javac tester // tester compilen
// java tester // tester ausführen

View File

View File

@ -1,13 +1,9 @@
public class Example {
public int testVar;
public static int testMethod(char b){
int a;
int a;
public class CompilerInput {
public int a;
public static int testMethod(char x){
return 0;
}
}
}