summaryrefslogtreecommitdiff
path: root/Homework/cs5300/p4-formatter/main/Main.java
blob: 7eb7d725c2e95497737c3f21db74151b443ae5f2 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package main;

import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.CommonTokenStream;
import parser.CminusLexer;
import parser.CminusParser;
import submit.ASTVisitor;
import org.antlr.v4.runtime.Parser;
import submit.ast.Node;

import java.io.IOException;
import java.util.Properties;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Main {
    private static Logger LOGGER;

    /**
     * @param args the command line arguments
     * @throws java.io.IOException
     */
    public static void main(String[] args) throws IOException {
        // Logging setup
        Level level = Level.INFO;

        // TODO Enable trace-level code as needed. When true, LOGGER.fine() statements
        // will be visible.
        final boolean trace = true;
        if (trace) {
            level = Level.ALL;
        }

        Properties props = System.getProperties();
        props.setProperty("java.util.logging.SimpleFormatter.format", "%5$s%6$s%n");
        Logger.getLogger("").setLevel(level);
        for (Handler handler : Logger.getLogger("").getHandlers()) {
            handler.setLevel(level);
        }
        LOGGER = Logger.getLogger(Parser.class.getName());

        // TODO Update the filename as needed
        final String filename = "data/test1.c";

        LOGGER.info("");
        LOGGER.info("Parsing " + filename + "\n");
        LOGGER.info("");
        final CharStream charStream = CharStreams.fromFileName(filename);
        CminusLexer lexer = new CminusLexer(charStream);
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        CminusParser parser = new CminusParser(tokens);
        parser.setBuildParseTree(true);
        CminusParser.ProgramContext programCtx = parser.program();

        // TODO Implement building of the parse tree
        LOGGER.info("");
        LOGGER.info("Building abstract syntax tree");
        LOGGER.info("");
        ASTVisitor v = new ASTVisitor(LOGGER);
        Node ast = v.visitProgram(programCtx);

        // TODO Output formatted code
        LOGGER.info("");
        LOGGER.info("Formatted code:");
        LOGGER.info("");
        StringBuilder builder = new StringBuilder();
        try {
            ast.toCminus(builder, "");
        } finally {
            LOGGER.info(builder.toString());
        }
    }

}