got rid of error message cruft, improved importing
authorAaron Becker <abecker3@illinois.edu>
Tue, 16 Jun 2009 01:59:03 +0000 (01:59 +0000)
committerAaron Becker <abecker3@illinois.edu>
Tue, 16 Jun 2009 01:59:03 +0000 (01:59 +0000)
src/langs/charj/src/charj/translator/Charj.g
src/langs/charj/src/charj/translator/Charj.stg
src/langs/charj/src/charj/translator/CharjEmitter.g
src/langs/charj/src/charj/translator/CharjSemantics.g
src/langs/charj/tests/fib.cj

index e3299013b2521ab7c9d7ea8263b88c4dcad61e70..9fcdfc4c35945cf7976286604ba2ae5c6bbf2b39 100644 (file)
@@ -216,7 +216,7 @@ tokens {
     TYPE;
     UNARY_MINUS;
     UNARY_PLUS;
-    PRIMITIVE_VAR_DECLARATION;
+    PRIMITIVE_VAR_DECLARATIO$ScopeStack::current = ps;N;
     OBJECT_VAR_DECLARATION;
     VAR_DECLARATOR;
     VAR_DECLARATOR_LIST;
@@ -228,68 +228,6 @@ package charj.translator;
 }
 
 @members {
-    
-    private boolean mMessageCollectionEnabled = false;
-    private boolean mHasErrors = false;
-    private List<String> mMessages;
-
-    /**
-     *  Switches error message collection on or of.
-     *
-     *  The standard destination for parser error messages is <code>System.err</code>.
-     *  However, if <code>true</code> gets passed to this method this default
-     *  behaviour will be switched off and all error messages will be collected
-     *  instead of written to anywhere.
-     *
-     *  The default value is <code>false</code>.
-     *
-     *  @param pNewState  <code>true</code> if error messages should be collected.
-     */
-    public void enableErrorMessageCollection(boolean pNewState) {
-        mMessageCollectionEnabled = pNewState;
-        if (mMessages == null && mMessageCollectionEnabled) {
-            mMessages = new ArrayList<String>();
-        }
-    }
-    
-    /**
-     *  Collects an error message or passes the error message to <code>
-     *  super.emitErrorMessage(...)</code>.
-     *
-     *  The actual behaviour depends on whether collecting error messages
-     *  has been enabled or not.
-     *
-     *  @param pMessage  The error message.
-     */
-     @Override
-    public void emitErrorMessage(String pMessage) {
-        if (mMessageCollectionEnabled) {
-            mMessages.add(pMessage);
-        } else {
-            super.emitErrorMessage(pMessage);
-        }
-    }
-    
-    /**
-     *  Returns collected error messages.
-     *
-     *  @return  A list holding collected error messages or <code>null</code> if
-     *           collecting error messages hasn't been enabled. Of course, this
-     *           list may be empty if no error message has been emited.
-     */
-    public List<String> getMessages() {
-        return mMessages;
-    }
-    
-    /**
-     *  Tells if parsing a Charj source has caused any error messages.
-     *
-     *  @return  <code>true</code> if parsing a Charj source has caused at least
-     *           one error message.
-     */
-    public boolean hasErrors() {
-        return mHasErrors;
-    }
 }
 
 @lexer::header {
@@ -297,14 +235,6 @@ package charj.translator;
 }
 
 @lexer::members {
-/** 
- *  Determines if whitespaces and comments should be preserved or thrown away.
- *
- *  If <code>true</code> whitespaces and comments will be preserved within the
- *  hidden channel, otherwise the appropriate tokens will be skiped. This is
- *  a 'little bit' expensive.
- */
-public boolean preserveWhitespacesAndComments = true;
 }
 
 // Starting point for parsing a Charj file.
@@ -1157,11 +1087,7 @@ CHARJ_ID_PART
 
 WS  :  (' '|'\r'|'\t'|'\u000C'|'\n') 
     {   
-        if (!preserveWhitespacesAndComments) {
-            skip();
-        } else {
-            $channel = HIDDEN;
-        }
+        $channel = HIDDEN;
     }
     ;
 
@@ -1174,21 +1100,13 @@ EMBED_BLOCK
 COMMENT
     :   '/*' ( options {greedy=false;} : . )* '*/'
     {   
-        if (!preserveWhitespacesAndComments) {
-            skip();
-        } else {
-            $channel = HIDDEN;
-        }
+        $channel = HIDDEN;
     }
     ;
 
 LINE_COMMENT
     : '//' ~('\n'|'\r')* '\r'? '\n'
     {   
-        if (!preserveWhitespacesAndComments) {
-            skip();
-        } else {
-            $channel = HIDDEN;
-        }
+        $channel = HIDDEN;
     }
     ;
index b64cc7a71fe55e7394a5e14d8b94bbb305ca29a8..4a5597d1d0ebbdf844222339b6263fdf81f93764 100644 (file)
@@ -27,8 +27,8 @@ charjSource_h(pd, ids, tds, cb) ::=
 
 charjSource_cc(pd, ids, tds, cb) ::= 
 <<
-<pd>
 <ids>
+<pd>
 <tds>
 <cb>
 
@@ -42,7 +42,7 @@ namespace <ids; separator=" { namespace "> {
 importDeclaration_cc_h(inc_id, use_id) ::= 
 <<
 #include \<<inc_id>\>
-//using <use_id>;
+using <use_id>;
 >>
 
 classExtends_ci(type) ::= "<type>"
index ae3dfae78347af2387e321812232cc7582b930e3..f1a0c64b3475f16e041ae9fd2080440ee0e4a57b 100644 (file)
@@ -17,6 +17,7 @@ options {
 package charj.translator;
 }
 
+
 @members {
     SymbolTable symtab_ = null;
 
@@ -26,78 +27,37 @@ package charj.translator;
     LocalScope currentLocalScope_ = null;
 
     Translator translator_;
-
     OutputMode mode_;
-    boolean messageCollectionEnabled_ = false;
-    private boolean hasErrors_ = false;
-    List<String> messages_;
 
     private boolean emitCC() { return mode_ == OutputMode.cc; }
     private boolean emitCI() { return mode_ == OutputMode.ci; }
     private boolean emitH() { return mode_ == OutputMode.h; }
 
     /**
-     *  Switches error message collection on or off.
-     *
-     *  The standard destination for parser error messages is 
-     *  <code>System.err</code>.
-     *  However, if <code>true</code> gets passed to this method this default
-     *  behaviour will be switched off and all error messages will be collected
-     *  instead of written to anywhere.
-     *
-     *  The default value is <code>false</code>.
-     *
-     *  @param newState  <code>true</code> if error messages should be collected.
-     */
-    public void enableErrorMessageCollection(boolean newState) {
-        messageCollectionEnabled_ = newState;
-        if (messages_ == null && messageCollectionEnabled_) {
-            messages_ = new ArrayList<String>();
-        }
-    }
-    
-    /**
-     *  Collects an error message or passes the error message to <code>
-     *  super.emitErrorMessage(...)</code>.
-     *
-     *  The actual behaviour depends on whether collecting error messages
-     *  has been enabled or not.
-     *
-     *  @param message  The error message.
-     */
-     @Override
-    public void emitErrorMessage(String message) {
-        if (messageCollectionEnabled_) {
-            messages_.add(message);
-        } else {
-            super.emitErrorMessage(message);
-        }
-    }
-    
-    /**
-     *  Returns collected error messages.
-     *
-     *  @return  A list holding collected error messages or <code>null</code> if
-     *           collecting error messages hasn't been enabled. Of course, this
-     *           list may be empty if no error message has been emited.
+     *  Override ANTLR's token mismatch behavior so we throw exceptions early.
      */
-    public List<String> getMessages() {
-        return messages_;
+    protected void mismatch(IntStream input, int ttype, BitSet follow)
+        throws RecognitionException {
+        throw new MismatchedTokenException(ttype, input);
     }
-    
+
     /**
-     *  Tells if parsing a Charj source has caused any error messages.
-     *
-     *  @return  <code>true</code> if parsing a Charj source has caused at 
-     *           least one error message.
+     *  Override ANTLR's set mismatch behavior so we throw exceptions early.
      */
-    public boolean hasErrors() {
-        return hasErrors_;
+    public Object recoverFromMismatchedSet(IntStream input, RecognitionException e, BitSet follow)
+        throws RecognitionException {
+        throw e;
     }
 
     /**
      *  Test a list of CharjAST nodes to see if any of them has the given token
-     *  type.
+     *  t// Replace default ANTLR generated catch clauses with this action, allowing early failure.
+@rulecatch {
+    catch (RecognitionException re) {
+        reportError(re);
+        throw re;
+    }
+}ype.
      */
     public boolean listContainsToken(List<CharjAST> list, int tokenType) {
         for (CharjAST node : list) {
@@ -107,9 +67,18 @@ package charj.translator;
         }
         return false;
     }
+}
+
 
+// Replace default ANTLR generated catch clauses with this action, allowing early failure.
+@rulecatch {
+    catch (RecognitionException re) {
+        reportError(re);
+        throw re;
+    }
 }
 
+
 // Starting point for parsing a Charj file.
 charjSource[SymbolTable symtab, OutputMode m]
 @init {
@@ -154,10 +123,19 @@ packageDeclaration
     ;
     
 importDeclaration
+@init {
+    String importID = null;
+}
     :   ^(IMPORT STATIC? qualifiedIdentifier DOTSTAR?)
+        {
+            importID = $qualifiedIdentifier.text;
+            if ($DOTSTAR != null) {
+            }
+        }
+        {$DOTSTAR == null}? // TODO: add support for importing x.*
         -> {(emitCC() || emitH())}? importDeclaration_cc_h(
-            inc_id={$qualifiedIdentifier.text.replace(".","/")},
-            use_id={$qualifiedIdentifier.text.replace(".","::")})
+            inc_id={importID.replace(".","/")},
+            use_id={importID.replace(".","::")})
         ->
     ;
     
index 6096d1e6ec5f58f355a5775dc84bf486e36e544c..eb6ca0690f1ad5e7178fc5a44170945c1d78e5e0 100644 (file)
@@ -23,77 +23,12 @@ package charj.translator;
 
 @members {
     SymbolTable symtab = null;
-
     PackageScope currentPackage = null;
     ClassSymbol currentClass = null;
     MethodSymbol currentMethod = null;
     LocalScope currentLocalScope = null;
-
     Translator translator;
 
-    boolean m_messageCollectionEnabled = false;
-    private boolean m_hasErrors = false;
-    List<String> m_messages;
-
-    /**
-     *  Switches error message collection on or off.
-     *
-     *  The standard destination for parser error messages is 
-     *  <code>System.err</code>.
-     *  However, if <code>true</code> gets passed to this method this default
-     *  behaviour will be switched off and all error messages will be collected
-     *  instead of written to anywhere.
-     *
-     *  The default value is <code>false</code>.
-     *
-     *  @param newState  <code>true</code> if error messages should be collected.
-     */
-    public void enableErrorMessageCollection(boolean newState) {
-        m_messageCollectionEnabled = newState;
-        if (m_messages == null && m_messageCollectionEnabled) {
-            m_messages = new ArrayList<String>();
-        }
-    }
-    
-    /**
-     *  Collects an error message or passes the error message to <code>
-     *  super.emitErrorMessage(...)</code>.
-     *
-     *  The actual behaviour depends on whether collecting error messages
-     *  has been enabled or not.
-     *
-     *  @param message  The error message.
-     */
-     @Override
-    public void emitErrorMessage(String message) {
-        if (m_messageCollectionEnabled) {
-            m_messages.add(message);
-        } else {
-            super.emitErrorMessage(message);
-        }
-    }
-    
-    /**
-     *  Returns collected error messages.
-     *
-     *  @return  A list holding collected error messages or <code>null</code> if
-     *           collecting error messages hasn't been enabled. Of course, this
-     *           list may be empty if no error message has been emited.
-     */
-    public List<String> getMessages() {
-        return m_messages;
-    }
-    
-    /**
-     *  Tells if parsing a Charj source has caused any error messages.
-     *
-     *  @return  <code>true</code> if parsing a Charj source has caused at 
-     *           least one error message.
-     */
-    public boolean hasErrors() {
-        return m_hasErrors;
-    }
-
     /**
      *  Test a list of CharjAST nodes to see if any of them has the given token
      *  type.
@@ -126,9 +61,18 @@ package charj.translator;
             }
         }
     }
+}
+
 
+// Replace default ANTLR generated catch clauses with this action, allowing early failure.
+@rulecatch {
+    catch (RecognitionException re) {
+        reportError(re);
+        throw re;
+    }
 }
 
+
 // Starting point for parsing a Charj file.
 charjSource[SymbolTable _symtab] returns [ClassSymbol cs]
 scope ScopeStack; // default scope
@@ -186,7 +130,7 @@ scope ScopeStack; // top-level type scope
             $sym.definitionTokenStream = input.getTokenStream();
             $IDENT.symbol = $sym;
             $ScopeStack::current = $sym;
-                       importPackages($sym, $imports);
+            importPackages($sym, $imports);
         }
     |   ^(INTERFACE modifierList IDENT genericTypeParameterList? 
                 interfaceExtendsClause? interfaceTopLevelScope)
@@ -576,3 +520,4 @@ literal
     |   FALSE
     |   NULL
     ;
+
index eb083bef757f0b6031a88292cc9a303e2cf8d1f3..bcd3adf304bf209e794c81b2aa3924d2ac7c703d 100644 (file)
@@ -1,5 +1,5 @@
 package tests;
-import charj.lang.*;
+import charj.lang.Chare;
 
 public class Fib extends Chare {
     Fib parent_;