Uses ANTLR to parse a MiniJava source file into an AST. ANTLR outputs a data structure which is not ideal, and so it is passed to mini-java.ast/ast, which transforms it into a more idealized AST.

(ns mini-java.parser
  (:require [mini-java.ast  :as ast]
            [clojure.pprint :refer [pprint]])
  (:import [mini-java
            ErrorHandler ErrorListener]
           [mini_java.antlr
            MiniJavaLexer MiniJavaParser]
           [org.antlr.v4.runtime
            ANTLRFileStream CommonTokenStream]))

Parse the given source file using ANTLR, and output a minimal hash-map representation of an AST.

(defn mini-java
  [source-file]
  (let [input  (new ANTLRFileStream   source-file)
        lexer  (new MiniJavaLexer     input)
        tokens (new CommonTokenStream lexer)
        ;; create parser with custom error listener and error handler
        parser (doto (new MiniJavaParser tokens)
                 (.removeErrorListeners)
                 (.addErrorListener (new ErrorListener))
                 (.setErrorHandler  (new ErrorHandler)))
        ;; parse file
        tree   (.goal parser)
        errors (.getNumberOfSyntaxErrors parser)]
    [(ast/ast tree) parser errors]))