diff options
| author | Jack | 2015-10-02 14:57:46 -0700 |
|---|---|---|
| committer | Jack | 2015-10-02 14:57:46 -0700 |
| commit | 0b5250463506d86b490ea76d6547c5786d7e5f58 (patch) | |
| tree | 4d73a9178b14723788a39882d013ccdcfbe4c2df /src/main/scala/firrtl/Parser.scala | |
| parent | 0a9cc3d72fa2c6f19385efa8350f232e2e9faf10 (diff) | |
Merged in Scala implementation of FIRRTL IR, parser, and serialization (ie. AST -> String). Uses ANTLRv4 to generate concrete syntax parser
Diffstat (limited to 'src/main/scala/firrtl/Parser.scala')
| -rw-r--r-- | src/main/scala/firrtl/Parser.scala | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/src/main/scala/firrtl/Parser.scala b/src/main/scala/firrtl/Parser.scala new file mode 100644 index 00000000..35e41222 --- /dev/null +++ b/src/main/scala/firrtl/Parser.scala @@ -0,0 +1,44 @@ +package firrtl + +import org.antlr.v4.runtime._; +import org.antlr.v4.runtime.atn._; +import org.antlr.v4.runtime.tree._; +import java.io.FileInputStream +import scala.collection.JavaConverters._ +import scala.io.Source +import Utils._ +import antlr._ + +object Parser +{ + + /** Takes a firrtl filename, returns AST (root node is Circuit) + * + * Currently must be standard FIRRTL file + * Parser performs conversion to machine firrtl + */ + def parse(filename: String): Circuit = { + //val antlrStream = new ANTLRInputStream(input.reader) + val fixedInput = Translator.addBrackets(Source.fromFile(filename).getLines) + val antlrStream = new ANTLRInputStream(fixedInput.result) + val lexer = new FIRRTLLexer(antlrStream) + val tokens = new CommonTokenStream(lexer) + val parser = new FIRRTLParser(tokens) + + // FIXME Dangerous + parser.getInterpreter.setPredictionMode(PredictionMode.SLL) + + // Concrete Syntax Tree + val cst = parser.circuit + + val visitor = new Visitor(filename) + //val ast = visitor.visitCircuit(cst) match { + val ast = visitor.visit(cst) match { + case c: Circuit => c + case x => throw new ClassCastException("Error! AST not rooted with Circuit node!") + } + + ast + } + +} |
