package org.softlang.company.features.recognizer; import static org.softlang.company.features.recognizer.Token.*; import java.io.FileNotFoundException; public class Parser { private Lexer lexer; private Token lookahead; // Parse a file public void parse(String s) throws FileNotFoundException { lexer = new Lexer(s); company(); match(EOF); } // // Match expected with actual tokem. // Consume the token if successful. // Throw exception if not successful. // private String match(Token token) { if (test(token)) { lookahead = null; return lexer.getLexeme(); } else throw new RecognitionException("Expected: " + token + "; Found: " + lookahead); } // Test actual token private boolean test(Token token) { if (lookahead==null) lookahead = lexer.next(); return (lookahead==token); } // Parse companies private final void company() { match(COMPANY); String name = match(STRING); match(OPEN); openCompany(name); while (test(DEPARTMENT)) department(); match(CLOSE); closeCompany(name); } // Parse departments private final void department() { match(DEPARTMENT); String name = match(STRING); match(OPEN); openDept(name); match(MANAGER); employee(true); while (test(EMPLOYEE)) { match(EMPLOYEE); employee(false); } while (test(DEPARTMENT)) department(); match(CLOSE); closeDept(name); } // Parse employees private final void employee(boolean isManager) { String name = match(STRING); match(OPEN); match(ADDRESS); String address = match(STRING); match(SALARY); Double salary = Double.parseDouble(match(FLOAT)); match(CLOSE); handleEmployee(isManager,name,address,salary); } // Handlers protected void openCompany(String name) { } protected void closeCompany(String name) { } protected void openDept(String name) { } protected void closeDept(String name) { } protected void handleEmployee(boolean isManager, String name, String address, Double salary) {} }