// // ClassLister.java: list names of classes in AST // import lexer.*; import node.*; import parser.*; import analysis.*; import java.io.*; import java.util.ArrayList; public class ClassLister extends DepthFirstAdapter { protected ArrayList classes = new ArrayList<>(); public ArrayList classNames() { return classes; } @Override public void caseAMainClass(AMainClass node) { classes.add(node.getId().getText()); } @Override public void caseABaseclassClassDecl(ABaseclassClassDecl node) { classes.add(node.getId().getText()); } @Override public void caseAExtclassClassDecl(AExtclassClassDecl node) { classes.add(node.getClassid().getText()); } public static void main(String[] args) { try { Reader reader; if ( args.length >= 1 ) reader = new FileReader(args[0]); else reader = new InputStreamReader(System.in); // create lexer, parser, and abstract syntax tree Lexer lexer = new Lexer(new PushbackReader(new BufferedReader(reader), 1024)); Parser parser = new Parser(lexer); Start ast = parser.parse(); reader.close(); // visit parse tree ClassLister visitor = new ClassLister(); ast.apply(visitor); for(String c: visitor.classNames()) System.out.println(c); } catch (Exception e) { System.out.println(e); // in a production system, would call something like System.exit(1); } } }