package typeChecker; import java.util.LinkedList; import java.util.List; import nodeAST.ASTNode; import nodeAST.Expression; import nodeAST.Ident; import nodeAST.syntactic.Form; import nodeAST.syntactic.Question; import nodeAST.syntactic.QuestionBody; import nodeAST.syntactic.Statement; import types.Type; import visitor.ASTVisitor; public class UndefinedIdentifier extends ASTVisitor { protected List<Ident> definedIdentifiers; protected List<Ident> expressionIdentifiers; public UndefinedIdentifier() { this.definedIdentifiers=new LinkedList<>(); this.expressionIdentifiers=new LinkedList<>(); } public void check(ASTNode root) throws Exception { List<Ident> list = createListWithUndefinedIdentifiers(root); if(list.size()!=0) { String message= "ERROR: The following references are not defined: "; for(Ident i: list) message+=i.toString()+", "; throw new Exception(message); } } private List<Ident> createListWithUndefinedIdentifiers(ASTNode root) { root.accept(this); List<Ident> undefined = new LinkedList<>(); for(Ident i : this.expressionIdentifiers) if(! this.definedIdentifiers.contains(i)) undefined.add(i); return undefined; } @Override public void visit(Ident ident) { expressionIdentifiers.add(ident); } @Override public void visit(Question question, Ident ident, QuestionBody questionBody, Type type, Expression expr) { definedIdentifiers.add(question.getIdent()); questionBody.accept(this); if(expr!=null) expr.accept(this); } @Override public void visit(Form form, List<Statement> list) { definedIdentifiers.add(form.getIdent()); for(Statement s : list) s.accept(this); } }