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])) |