summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgeno <gabriele.genovese2@studio.unibo.it>2024-06-27 13:08:54 +0200
committergeno <gabriele.genovese2@studio.unibo.it>2024-06-27 13:08:54 +0200
commit673117132daa9c4fdd103189b5cd9a32a3731f5a (patch)
tree5ff72841ca65e07a2c8ee70525bb8dabbc93c7d6
parent8101f3f591f025c808084093d3f84b0eca0e67e5 (diff)
remove duplicates
-rw-r--r--src/Main.java5
-rw-r--r--src/ParseAll.java6
-rw-r--r--src/ast/nodes/AtomNode.java2
-rw-r--r--src/semanticanalysis/Share.java37
4 files changed, 47 insertions, 3 deletions
diff --git a/src/Main.java b/src/Main.java
index 24f4c4e..04f7183 100644
--- a/src/Main.java
+++ b/src/Main.java
@@ -1,3 +1,4 @@
+
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
@@ -11,6 +12,7 @@ import ast.*;
import ast.nodes.*;
import parser.*;
import semanticanalysis.*;
+import semanticanalysis.Share;
public class Main {
@@ -53,7 +55,8 @@ public class Main {
Python3VisitorImpl visitor = new Python3VisitorImpl();
SymbolTable ST = new SymbolTable();
Node ast = visitor.visit(tree);
- ArrayList<SemanticError> errors = ast.checkSemantics(ST, 0);
+ ArrayList<SemanticError> errorsWithDup = ast.checkSemantics(ST, 0);
+ ArrayList<SemanticError> errors = Share.removeDuplicates(errorsWithDup);
if (errors.size() > 0) {
System.out.println("You had " + errors.size() + " errors:");
for (SemanticError e : errors) {
diff --git a/src/ParseAll.java b/src/ParseAll.java
index 87b4ca3..2662a85 100644
--- a/src/ParseAll.java
+++ b/src/ParseAll.java
@@ -1,3 +1,4 @@
+
import java.io.File;
import java.util.ArrayList;
import java.util.Objects;
@@ -9,8 +10,10 @@ import parser.Python3Lexer;
import parser.Python3Parser;
import semanticanalysis.SemanticError;
import semanticanalysis.SymbolTable;
+import semanticanalysis.Share;
public class ParseAll {
+
@SuppressWarnings("unused")
public static void main(String[] args) {
new File("./trees/").mkdirs();
@@ -36,7 +39,8 @@ public class ParseAll {
Python3VisitorImpl visitor = new Python3VisitorImpl();
SymbolTable ST = new SymbolTable();
Node ast = visitor.visit(tree);
- ArrayList<SemanticError> errors = ast.checkSemantics(ST, 0);
+ ArrayList<SemanticError> errorsWithDup = ast.checkSemantics(ST, 0);
+ ArrayList<SemanticError> errors = Share.removeDuplicates(errorsWithDup);
if (errors.size() > 0) {
System.out.println();
System.out.println(fileStr);
diff --git a/src/ast/nodes/AtomNode.java b/src/ast/nodes/AtomNode.java
index ceafc07..58cd7f9 100644
--- a/src/ast/nodes/AtomNode.java
+++ b/src/ast/nodes/AtomNode.java
@@ -27,7 +27,7 @@ public class AtomNode implements Node {
var errors = new ArrayList<SemanticError>();
if ((this.typeCheck() instanceof AtomType) && ST.nslookup(this.getId()) < 0) {
- errors.add(new SemanticError("'" + this.getId() + "' is not defined."));
+ errors.add(new SemanticError("name '" + this.getId() + "' is not defined."));
}
return errors;
diff --git a/src/semanticanalysis/Share.java b/src/semanticanalysis/Share.java
new file mode 100644
index 0000000..c1f03c2
--- /dev/null
+++ b/src/semanticanalysis/Share.java
@@ -0,0 +1,37 @@
+package semanticanalysis;
+
+import java.util.ArrayList;
+
+public class Share {
+
+ public static <T> ArrayList<T> removeDuplicates(ArrayList<T> list) {
+ ArrayList<T> newList = new ArrayList<T>();
+
+ for (T element : list) {
+ if (!customContains(newList, element)) {
+ newList.add(element);
+ }
+ }
+ return newList;
+ }
+
+ public static <T> boolean customContains(ArrayList<T> list, T e) {
+ String e1 = e.toString();
+ for (T element : list) {
+ String e2 = element.toString();
+ if (e2.equals(e1)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public static String getExtension(String fileName) {
+ int extensionIndex = fileName.lastIndexOf('.');
+ if (extensionIndex == -1) {
+ return fileName;
+ } else {
+ return fileName.substring(extensionIndex + 1);
+ }
+ }
+}