From ab340febdc7a5418da945f9b79624d36e66e26db Mon Sep 17 00:00:00 2001 From: Kamyar Mohajerani Date: Thu, 21 Jul 2016 23:40:34 +0430 Subject: Indentation support for the ANTLR parser (as discussed in #192) (#194) Indentation support for the ANTLR parser - some clean-up of the parser code (TODO: file input could be improved, more clean-up) - get rid of Translator and specify all syntactic rules in antlr4 grammer - support for else-when shorthand in the grammar - rename Begin to Block which makes more sense--- src/main/scala/firrtl/Translator.scala | 171 --------------------------------- 1 file changed, 171 deletions(-) delete mode 100644 src/main/scala/firrtl/Translator.scala (limited to 'src/main/scala/firrtl/Translator.scala') diff --git a/src/main/scala/firrtl/Translator.scala b/src/main/scala/firrtl/Translator.scala deleted file mode 100644 index 4b0bd1e7..00000000 --- a/src/main/scala/firrtl/Translator.scala +++ /dev/null @@ -1,171 +0,0 @@ -/* -Copyright (c) 2014 - 2016 The Regents of the University of -California (Regents). All Rights Reserved. Redistribution and use in -source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - * Redistributions of source code must retain the above - copyright notice, this list of conditions and the following - two paragraphs of disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - two paragraphs of disclaimer in the documentation and/or other materials - provided with the distribution. - * Neither the name of the Regents nor the names of its contributors - may be used to endorse or promote products derived from this - software without specific prior written permission. -IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, -SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, -ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF -REGENTS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF -ANY, PROVIDED HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION -TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR -MODIFICATIONS. -*/ - -/* TODO - * - Add better error messages for illformed FIRRTL - * - Add support for files that do not have a circuit (like a module by itself in a file) - * - Improve performance? Replace regex? - * - Wrap in Reader subclass. This would have less memory footprint than creating a large string - */ - -package firrtl - -import scala.io.Source -import scala.collection.mutable.Stack -import scala.collection.mutable.StringBuilder -import java.io._ - - -object Translator -{ - - def addBrackets(inputIt: Iterator[String]): StringBuilder = { - def countSpaces(s: String): Int = s.prefixLength(_ == ' ') - def stripComments(s: String): String = { - // Delete anything after first semicolon that's not in a comment - var done = false - var inComment = false - var escape = false - var i = 0 - while (!done && i < s.length) { - val c = s(i) - if (c == ';') { - if (!inComment) { - done = true - i = i - 1 // remove semicolon as well as what follows - } - } else { - if (c == '"' && !escape) inComment = !inComment - escape = if (c == '\\' && !escape) true else false - } - i += 1 - } - s.take(i) - } - def extractFileInfo(str: String): (String, String) = str span (_ != '@') - - val scopers = """(circuit|module|when|else|mem|with)""" - val MultiLineScope = ("""(.*""" + scopers + """)(.*:\s*)""").r - val OneLineScope = ("""(.*(with)\s*:\s*)\((.*)\)\s*""").r - - // Function start - val it = inputIt.zipWithIndex - var ret = new StringBuilder() - - if( !it.hasNext ) throw new Exception("Empty file!") - - // Find circuit before starting scope checks - var line = it.next - while ( it.hasNext && !stripComments(line._1).contains("circuit") ) { - ret ++= line._1 + "\n" - line = it.next - } - ret ++= line._1 + " { \n" - if( !it.hasNext ) throw new Exception("No circuit in file!") - - - val scope = Stack[Int]() - val lowestScope = countSpaces(line._1) - scope.push(lowestScope) - var newScope = true // indicates if increasing scope spacing is legal on next line - - while( it.hasNext ) { - it.next match { case (lineText, lineNum) => - val text = stripComments(lineText) - val (code, fileInfo) = extractFileInfo(text) - val spaces = countSpaces(text) - - val l = if (text.length > spaces ) { // Check that line has text in it - if (newScope) { - if( spaces <= scope.top ) scope.push(spaces+2) // Hack for one-line scopes - else scope.push(spaces) - } - - // Check if change in current scope - if( spaces < scope.top ) { - while( spaces < scope.top ) { - // Close scopes (adding brackets as we go) - scope.pop() - ret.deleteCharAt(ret.lastIndexOf("\n")) // Put on previous line - ret ++= " }\n" - } - if( spaces != scope.top ) - throw new Exception("Spacing does not match scope on line : " + lineNum + " : " + scope.top) - } - else if( spaces > scope.top ) - throw new Exception("Invalid increase in scope on line " + lineNum) - - // Now match on legal scope increasers - code match { - case OneLineScope(head, keyword, body) => { - newScope = false - head + "{" + body + "} " + fileInfo - } - case MultiLineScope(head, keyword, tail) => { - newScope = true - text + " { " - } - case _ => { - newScope = false - text - } - } - } // if( text.length > spaces ) - else { - text // empty lines - } - - ret ++= l + "\n" - } // it.next match - } // while( it.hasNext ) - - // Print any closing braces - while( scope.top > lowestScope ) { - scope.pop() - ret.deleteCharAt(ret.lastIndexOf("\n")) // Put on previous line - ret ++= " }\n" - } - - ret - } - - def main(args: Array[String]) { - - try { - val translation = addBrackets(Source.fromFile(args(0)).getLines) - - val writer = new PrintWriter(new File(args(1))) - writer.write(translation.result) - writer.close() - } catch { - case e: Exception => { - throw new Exception("USAGE: Translator \n" + e) - } - } - } - -} -- cgit v1.2.3