Repository: rigetticomputing/pyquil
Pull request #297 (2018-02-05 21:16:21)

Fix for issue #292: Cannot parse quil with upper case E in scientific…
Fix for issue #292: Cannot parse quil with upper case E in scientific notation


Patch:
diff --git a/.gitignore b/.gitignore
index 11c8c1d..f7afda8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -170,4 +170,8 @@ fabric.properties
 # *.iml
 # modules.xml
 # .idea/misc.xml
-# *.ipr
\ No newline at end of file
+# *.ipr
+
+### Antlr ###
+# Antlr generated files that we don't need
+*.interp
\ No newline at end of file
diff --git a/pyquil/_parser/Quil.g4 b/pyquil/_parser/Quil.g4
index 118f189..7310773 100644
--- a/pyquil/_parser/Quil.g4
+++ b/pyquil/_parser/Quil.g4
@@ -174,7 +174,7 @@ IDENTIFIER          : [A-Za-z_] [A-Za-z0-9\-_]* ;
 // Numbers
 
 INT                 : [0-9]+ ;
-FLOAT               : [0-9]+ ('.' [0-9]+)? ('e' ('+' | '-')? [0-9]+)? ;
+FLOAT               : [0-9]+ ('.' [0-9]+)? (('e'|'E') ('+' | '-')? [0-9]+)? ;
 
 // String
 
diff --git a/pyquil/_parser/gen2/QuilLexer.py b/pyquil/_parser/gen2/QuilLexer.py
index 7131fae..4590e6e 100644
--- a/pyquil/_parser/gen2/QuilLexer.py
+++ b/pyquil/_parser/gen2/QuilLexer.py
@@ -1,4 +1,4 @@
-# Generated from Quil.g4 by ANTLR 4.7
+# Generated from Quil.g4 by ANTLR 4.7.1
 # encoding: utf-8
 from __future__ import print_function
 from antlr4 import *
@@ -45,39 +45,39 @@ def serializedATN():
         buf.write(u"\25\f\27\r\31\16\33\17\35\20\37\21!\22#\23%\24\'\25)")
         buf.write(u"\26+\27-\30/\31\61\32\63\33\65\34\67\359\36;\37= ?!A")
         buf.write(u"\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65")
-        buf.write(u"i\66\3\2\7\5\2C\\aac|\7\2//\62;C\\aac|\3\2\62;\4\2--")
-        buf.write(u"//\4\2\f\f\17\17\2\u017e\2\3\3\2\2\2\2\5\3\2\2\2\2\7")
-        buf.write(u"\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3")
-        buf.write(u"\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3")
-        buf.write(u"\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3")
-        buf.write(u"\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2")
-        buf.write(u")\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2")
-        buf.write(u"\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2")
-        buf.write(u"\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2")
-        buf.write(u"\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2")
-        buf.write(u"\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3")
-        buf.write(u"\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2")
-        buf.write(u"a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2")
-        buf.write(u"\3k\3\2\2\2\5s\3\2\2\2\7~\3\2\2\2\t\u0086\3\2\2\2\13")
-        buf.write(u"\u008c\3\2\2\2\r\u0091\3\2\2\2\17\u0096\3\2\2\2\21\u00a0")
-        buf.write(u"\3\2\2\2\23\u00ac\3\2\2\2\25\u00b2\3\2\2\2\27\u00b7\3")
-        buf.write(u"\2\2\2\31\u00bb\3\2\2\2\33\u00c3\3\2\2\2\35\u00ca\3\2")
-        buf.write(u"\2\2\37\u00d0\3\2\2\2!\u00d5\3\2\2\2#\u00d9\3\2\2\2%")
-        buf.write(u"\u00dd\3\2\2\2\'\u00e0\3\2\2\2)\u00e5\3\2\2\2+\u00ee")
-        buf.write(u"\3\2\2\2-\u00f1\3\2\2\2/\u00f3\3\2\2\2\61\u00f7\3\2\2")
-        buf.write(u"\2\63\u00fb\3\2\2\2\65\u0100\3\2\2\2\67\u0104\3\2\2\2")
-        buf.write(u"9\u0108\3\2\2\2;\u010a\3\2\2\2=\u010c\3\2\2\2?\u010e")
-        buf.write(u"\3\2\2\2A\u0110\3\2\2\2C\u0112\3\2\2\2E\u011a\3\2\2\2")
-        buf.write(u"G\u011f\3\2\2\2I\u0136\3\2\2\2K\u013f\3\2\2\2M\u0141")
-        buf.write(u"\3\2\2\2O\u0143\3\2\2\2Q\u0145\3\2\2\2S\u0147\3\2\2\2")
-        buf.write(u"U\u0149\3\2\2\2W\u014b\3\2\2\2Y\u014d\3\2\2\2[\u014f")
-        buf.write(u"\3\2\2\2]\u0151\3\2\2\2_\u0153\3\2\2\2a\u0155\3\2\2\2")
-        buf.write(u"c\u015f\3\2\2\2e\u0163\3\2\2\2g\u016c\3\2\2\2i\u0170")
-        buf.write(u"\3\2\2\2kl\7F\2\2lm\7G\2\2mn\7H\2\2no\7I\2\2op\7C\2\2")
-        buf.write(u"pq\7V\2\2qr\7G\2\2r\4\3\2\2\2st\7F\2\2tu\7G\2\2uv\7H")
-        buf.write(u"\2\2vw\7E\2\2wx\7K\2\2xy\7T\2\2yz\7E\2\2z{\7W\2\2{|\7")
-        buf.write(u"K\2\2|}\7V\2\2}\6\3\2\2\2~\177\7O\2\2\177\u0080\7G\2")
-        buf.write(u"\2\u0080\u0081\7C\2\2\u0081\u0082\7U\2\2\u0082\u0083")
+        buf.write(u"i\66\3\2\b\5\2C\\aac|\7\2//\62;C\\aac|\3\2\62;\4\2GG")
+        buf.write(u"gg\4\2--//\4\2\f\f\17\17\2\u017e\2\3\3\2\2\2\2\5\3\2")
+        buf.write(u"\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2")
+        buf.write(u"\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2")
+        buf.write(u"\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2")
+        buf.write(u"\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3")
+        buf.write(u"\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2")
+        buf.write(u"\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\2")
+        buf.write(u"9\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2")
+        buf.write(u"\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2")
+        buf.write(u"\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2")
+        buf.write(u"\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3")
+        buf.write(u"\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2")
+        buf.write(u"i\3\2\2\2\3k\3\2\2\2\5s\3\2\2\2\7~\3\2\2\2\t\u0086\3")
+        buf.write(u"\2\2\2\13\u008c\3\2\2\2\r\u0091\3\2\2\2\17\u0096\3\2")
+        buf.write(u"\2\2\21\u00a0\3\2\2\2\23\u00ac\3\2\2\2\25\u00b2\3\2\2")
+        buf.write(u"\2\27\u00b7\3\2\2\2\31\u00bb\3\2\2\2\33\u00c3\3\2\2\2")
+        buf.write(u"\35\u00ca\3\2\2\2\37\u00d0\3\2\2\2!\u00d5\3\2\2\2#\u00d9")
+        buf.write(u"\3\2\2\2%\u00dd\3\2\2\2\'\u00e0\3\2\2\2)\u00e5\3\2\2")
+        buf.write(u"\2+\u00ee\3\2\2\2-\u00f1\3\2\2\2/\u00f3\3\2\2\2\61\u00f7")
+        buf.write(u"\3\2\2\2\63\u00fb\3\2\2\2\65\u0100\3\2\2\2\67\u0104\3")
+        buf.write(u"\2\2\29\u0108\3\2\2\2;\u010a\3\2\2\2=\u010c\3\2\2\2?")
+        buf.write(u"\u010e\3\2\2\2A\u0110\3\2\2\2C\u0112\3\2\2\2E\u011a\3")
+        buf.write(u"\2\2\2G\u011f\3\2\2\2I\u0136\3\2\2\2K\u013f\3\2\2\2M")
+        buf.write(u"\u0141\3\2\2\2O\u0143\3\2\2\2Q\u0145\3\2\2\2S\u0147\3")
+        buf.write(u"\2\2\2U\u0149\3\2\2\2W\u014b\3\2\2\2Y\u014d\3\2\2\2[")
+        buf.write(u"\u014f\3\2\2\2]\u0151\3\2\2\2_\u0153\3\2\2\2a\u0155\3")
+        buf.write(u"\2\2\2c\u015f\3\2\2\2e\u0163\3\2\2\2g\u016c\3\2\2\2i")
+        buf.write(u"\u0170\3\2\2\2kl\7F\2\2lm\7G\2\2mn\7H\2\2no\7I\2\2op")
+        buf.write(u"\7C\2\2pq\7V\2\2qr\7G\2\2r\4\3\2\2\2st\7F\2\2tu\7G\2")
+        buf.write(u"\2uv\7H\2\2vw\7E\2\2wx\7K\2\2xy\7T\2\2yz\7E\2\2z{\7W")
+        buf.write(u"\2\2{|\7K\2\2|}\7V\2\2}\6\3\2\2\2~\177\7O\2\2\177\u0080")
+        buf.write(u"\7G\2\2\u0080\u0081\7C\2\2\u0081\u0082\7U\2\2\u0082\u0083")
         buf.write(u"\7W\2\2\u0083\u0084\7T\2\2\u0084\u0085\7G\2\2\u0085\b")
         buf.write(u"\3\2\2\2\u0086\u0087\7N\2\2\u0087\u0088\7C\2\2\u0088")
         buf.write(u"\u0089\7D\2\2\u0089\u008a\7G\2\2\u008a\u008b\7N\2\2\u008b")
@@ -137,12 +137,12 @@ def serializedATN():
         buf.write(u"\3\2\2\2\u0126\u0127\3\2\2\2\u0127\u0125\3\2\2\2\u0127")
         buf.write(u"\u0128\3\2\2\2\u0128\u012a\3\2\2\2\u0129\u0123\3\2\2")
         buf.write(u"\2\u0129\u012a\3\2\2\2\u012a\u0134\3\2\2\2\u012b\u012d")
-        buf.write(u"\7g\2\2\u012c\u012e\t\5\2\2\u012d\u012c\3\2\2\2\u012d")
+        buf.write(u"\t\5\2\2\u012c\u012e\t\6\2\2\u012d\u012c\3\2\2\2\u012d")
         buf.write(u"\u012e\3\2\2\2\u012e\u0130\3\2\2\2\u012f\u0131\t\4\2")
         buf.write(u"\2\u0130\u012f\3\2\2\2\u0131\u0132\3\2\2\2\u0132\u0130")
         buf.write(u"\3\2\2\2\u0132\u0133\3\2\2\2\u0133\u0135\3\2\2\2\u0134")
         buf.write(u"\u012b\3\2\2\2\u0134\u0135\3\2\2\2\u0135H\3\2\2\2\u0136")
-        buf.write(u"\u013a\7$\2\2\u0137\u0139\n\6\2\2\u0138\u0137\3\2\2\2")
+        buf.write(u"\u013a\7$\2\2\u0137\u0139\n\7\2\2\u0138\u0137\3\2\2\2")
         buf.write(u"\u0139\u013c\3\2\2\2\u013a\u0138\3\2\2\2\u013a\u013b")
         buf.write(u"\3\2\2\2\u013b\u013d\3\2\2\2\u013c\u013a\3\2\2\2\u013d")
         buf.write(u"\u013e\7$\2\2\u013eJ\3\2\2\2\u013f\u0140\7\60\2\2\u0140")
@@ -159,7 +159,7 @@ def serializedATN():
         buf.write(u"\u0160\7\f\2\2\u015e\u0160\7\17\2\2\u015f\u015b\3\2\2")
         buf.write(u"\2\u015f\u015e\3\2\2\2\u0160\u0161\3\2\2\2\u0161\u015f")
         buf.write(u"\3\2\2\2\u0161\u0162\3\2\2\2\u0162d\3\2\2\2\u0163\u0167")
-        buf.write(u"\7%\2\2\u0164\u0166\n\6\2\2\u0165\u0164\3\2\2\2\u0166")
+        buf.write(u"\7%\2\2\u0164\u0166\n\7\2\2\u0165\u0164\3\2\2\2\u0166")
         buf.write(u"\u0169\3\2\2\2\u0167\u0165\3\2\2\2\u0167\u0168\3\2\2")
         buf.write(u"\2\u0168\u016a\3\2\2\2\u0169\u0167\3\2\2\2\u016a\u016b")
         buf.write(u"\b\63\2\2\u016bf\3\2\2\2\u016c\u016d\7\"\2\2\u016d\u016e")
@@ -269,7 +269,7 @@ class QuilLexer(Lexer):
 
     def __init__(self, input=None, output=sys.stdout):
         super(QuilLexer, self).__init__(input, output=output)
-        self.checkVersion("4.7")
+        self.checkVersion("4.7.1")
         self._interp = LexerATNSimulator(self, self.atn, self.decisionsToDFA, PredictionContextCache())
         self._actions = None
         self._predicates = None
diff --git a/pyquil/_parser/gen2/QuilListener.py b/pyquil/_parser/gen2/QuilListener.py
index e02a7c6..35e44cf 100644
--- a/pyquil/_parser/gen2/QuilListener.py
+++ b/pyquil/_parser/gen2/QuilListener.py
@@ -1,4 +1,4 @@
-# Generated from Quil.g4 by ANTLR 4.7
+# Generated from Quil.g4 by ANTLR 4.7.1
 from antlr4 import *
 
 # This class defines a complete listener for a parse tree produced by QuilParser.
diff --git a/pyquil/_parser/gen2/QuilParser.py b/pyquil/_parser/gen2/QuilParser.py
index 4d80195..6c39269 100644
--- a/pyquil/_parser/gen2/QuilParser.py
+++ b/pyquil/_parser/gen2/QuilParser.py
@@ -1,4 +1,4 @@
-# Generated from Quil.g4 by ANTLR 4.7
+# Generated from Quil.g4 by ANTLR 4.7.1
 # encoding: utf-8
 from __future__ import print_function
 from antlr4 import *
@@ -318,7 +318,7 @@ class QuilParser ( Parser ):
 
     def __init__(self, input, output=sys.stdout):
         super(QuilParser, self).__init__(input, output=output)
-        self.checkVersion("4.7")
+        self.checkVersion("4.7.1")
         self._interp = ParserATNSimulator(self, self.atn, self.decisionsToDFA, self.sharedContextCache)
         self._predicates = None
 
diff --git a/pyquil/_parser/gen3/QuilLexer.py b/pyquil/_parser/gen3/QuilLexer.py
index 28481db..586d0be 100644
--- a/pyquil/_parser/gen3/QuilLexer.py
+++ b/pyquil/_parser/gen3/QuilLexer.py
@@ -1,4 +1,4 @@
-# Generated from Quil.g4 by ANTLR 4.7
+# Generated from Quil.g4 by ANTLR 4.7.1
 from antlr4 import *
 from io import StringIO
 from typing.io import TextIO
@@ -42,38 +42,38 @@ def serializedATN():
         buf.write("\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31")
         buf.write("\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30/\31")
         buf.write("\61\32\63\33\65\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M(O")
-        buf.write(")Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66\3\2\7\5\2C\\")
-        buf.write("aac|\7\2//\62;C\\aac|\3\2\62;\4\2--//\4\2\f\f\17\17\2")
-        buf.write("\u017e\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2")
-        buf.write("\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2")
-        buf.write("\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33")
-        buf.write("\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2")
-        buf.write("\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2")
-        buf.write("\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2")
-        buf.write("\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2")
-        buf.write("\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3")
-        buf.write("\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S")
-        buf.write("\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2")
-        buf.write("]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2")
-        buf.write("\2g\3\2\2\2\2i\3\2\2\2\3k\3\2\2\2\5s\3\2\2\2\7~\3\2\2")
-        buf.write("\2\t\u0086\3\2\2\2\13\u008c\3\2\2\2\r\u0091\3\2\2\2\17")
-        buf.write("\u0096\3\2\2\2\21\u00a0\3\2\2\2\23\u00ac\3\2\2\2\25\u00b2")
-        buf.write("\3\2\2\2\27\u00b7\3\2\2\2\31\u00bb\3\2\2\2\33\u00c3\3")
-        buf.write("\2\2\2\35\u00ca\3\2\2\2\37\u00d0\3\2\2\2!\u00d5\3\2\2")
-        buf.write("\2#\u00d9\3\2\2\2%\u00dd\3\2\2\2\'\u00e0\3\2\2\2)\u00e5")
-        buf.write("\3\2\2\2+\u00ee\3\2\2\2-\u00f1\3\2\2\2/\u00f3\3\2\2\2")
-        buf.write("\61\u00f7\3\2\2\2\63\u00fb\3\2\2\2\65\u0100\3\2\2\2\67")
-        buf.write("\u0104\3\2\2\29\u0108\3\2\2\2;\u010a\3\2\2\2=\u010c\3")
-        buf.write("\2\2\2?\u010e\3\2\2\2A\u0110\3\2\2\2C\u0112\3\2\2\2E\u011a")
-        buf.write("\3\2\2\2G\u011f\3\2\2\2I\u0136\3\2\2\2K\u013f\3\2\2\2")
-        buf.write("M\u0141\3\2\2\2O\u0143\3\2\2\2Q\u0145\3\2\2\2S\u0147\3")
-        buf.write("\2\2\2U\u0149\3\2\2\2W\u014b\3\2\2\2Y\u014d\3\2\2\2[\u014f")
-        buf.write("\3\2\2\2]\u0151\3\2\2\2_\u0153\3\2\2\2a\u0155\3\2\2\2")
-        buf.write("c\u015f\3\2\2\2e\u0163\3\2\2\2g\u016c\3\2\2\2i\u0170\3")
-        buf.write("\2\2\2kl\7F\2\2lm\7G\2\2mn\7H\2\2no\7I\2\2op\7C\2\2pq")
-        buf.write("\7V\2\2qr\7G\2\2r\4\3\2\2\2st\7F\2\2tu\7G\2\2uv\7H\2\2")
-        buf.write("vw\7E\2\2wx\7K\2\2xy\7T\2\2yz\7E\2\2z{\7W\2\2{|\7K\2\2")
-        buf.write("|}\7V\2\2}\6\3\2\2\2~\177\7O\2\2\177\u0080\7G\2\2\u0080")
+        buf.write(")Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66\3\2\b\5\2C\\")
+        buf.write("aac|\7\2//\62;C\\aac|\3\2\62;\4\2GGgg\4\2--//\4\2\f\f")
+        buf.write("\17\17\2\u017e\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t")
+        buf.write("\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3")
+        buf.write("\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2")
+        buf.write("\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2")
+        buf.write("\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2")
+        buf.write("\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65")
+        buf.write("\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2")
+        buf.write("\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2")
+        buf.write("\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2")
+        buf.write("\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3")
+        buf.write("\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e")
+        buf.write("\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\3k\3\2\2\2\5s\3\2\2\2\7")
+        buf.write("~\3\2\2\2\t\u0086\3\2\2\2\13\u008c\3\2\2\2\r\u0091\3\2")
+        buf.write("\2\2\17\u0096\3\2\2\2\21\u00a0\3\2\2\2\23\u00ac\3\2\2")
+        buf.write("\2\25\u00b2\3\2\2\2\27\u00b7\3\2\2\2\31\u00bb\3\2\2\2")
+        buf.write("\33\u00c3\3\2\2\2\35\u00ca\3\2\2\2\37\u00d0\3\2\2\2!\u00d5")
+        buf.write("\3\2\2\2#\u00d9\3\2\2\2%\u00dd\3\2\2\2\'\u00e0\3\2\2\2")
+        buf.write(")\u00e5\3\2\2\2+\u00ee\3\2\2\2-\u00f1\3\2\2\2/\u00f3\3")
+        buf.write("\2\2\2\61\u00f7\3\2\2\2\63\u00fb\3\2\2\2\65\u0100\3\2")
+        buf.write("\2\2\67\u0104\3\2\2\29\u0108\3\2\2\2;\u010a\3\2\2\2=\u010c")
+        buf.write("\3\2\2\2?\u010e\3\2\2\2A\u0110\3\2\2\2C\u0112\3\2\2\2")
+        buf.write("E\u011a\3\2\2\2G\u011f\3\2\2\2I\u0136\3\2\2\2K\u013f\3")
+        buf.write("\2\2\2M\u0141\3\2\2\2O\u0143\3\2\2\2Q\u0145\3\2\2\2S\u0147")
+        buf.write("\3\2\2\2U\u0149\3\2\2\2W\u014b\3\2\2\2Y\u014d\3\2\2\2")
+        buf.write("[\u014f\3\2\2\2]\u0151\3\2\2\2_\u0153\3\2\2\2a\u0155\3")
+        buf.write("\2\2\2c\u015f\3\2\2\2e\u0163\3\2\2\2g\u016c\3\2\2\2i\u0170")
+        buf.write("\3\2\2\2kl\7F\2\2lm\7G\2\2mn\7H\2\2no\7I\2\2op\7C\2\2")
+        buf.write("pq\7V\2\2qr\7G\2\2r\4\3\2\2\2st\7F\2\2tu\7G\2\2uv\7H\2")
+        buf.write("\2vw\7E\2\2wx\7K\2\2xy\7T\2\2yz\7E\2\2z{\7W\2\2{|\7K\2")
+        buf.write("\2|}\7V\2\2}\6\3\2\2\2~\177\7O\2\2\177\u0080\7G\2\2\u0080")
         buf.write("\u0081\7C\2\2\u0081\u0082\7U\2\2\u0082\u0083\7W\2\2\u0083")
         buf.write("\u0084\7T\2\2\u0084\u0085\7G\2\2\u0085\b\3\2\2\2\u0086")
         buf.write("\u0087\7N\2\2\u0087\u0088\7C\2\2\u0088\u0089\7D\2\2\u0089")
@@ -133,12 +133,12 @@ def serializedATN():
         buf.write("\u0126\t\4\2\2\u0125\u0124\3\2\2\2\u0126\u0127\3\2\2\2")
         buf.write("\u0127\u0125\3\2\2\2\u0127\u0128\3\2\2\2\u0128\u012a\3")
         buf.write("\2\2\2\u0129\u0123\3\2\2\2\u0129\u012a\3\2\2\2\u012a\u0134")
-        buf.write("\3\2\2\2\u012b\u012d\7g\2\2\u012c\u012e\t\5\2\2\u012d")
+        buf.write("\3\2\2\2\u012b\u012d\t\5\2\2\u012c\u012e\t\6\2\2\u012d")
         buf.write("\u012c\3\2\2\2\u012d\u012e\3\2\2\2\u012e\u0130\3\2\2\2")
         buf.write("\u012f\u0131\t\4\2\2\u0130\u012f\3\2\2\2\u0131\u0132\3")
         buf.write("\2\2\2\u0132\u0130\3\2\2\2\u0132\u0133\3\2\2\2\u0133\u0135")
         buf.write("\3\2\2\2\u0134\u012b\3\2\2\2\u0134\u0135\3\2\2\2\u0135")
-        buf.write("H\3\2\2\2\u0136\u013a\7$\2\2\u0137\u0139\n\6\2\2\u0138")
+        buf.write("H\3\2\2\2\u0136\u013a\7$\2\2\u0137\u0139\n\7\2\2\u0138")
         buf.write("\u0137\3\2\2\2\u0139\u013c\3\2\2\2\u013a\u0138\3\2\2\2")
         buf.write("\u013a\u013b\3\2\2\2\u013b\u013d\3\2\2\2\u013c\u013a\3")
         buf.write("\2\2\2\u013d\u013e\7$\2\2\u013eJ\3\2\2\2\u013f\u0140\7")
@@ -155,7 +155,7 @@ def serializedATN():
         buf.write("\u0160\7\f\2\2\u015e\u0160\7\17\2\2\u015f\u015b\3\2\2")
         buf.write("\2\u015f\u015e\3\2\2\2\u0160\u0161\3\2\2\2\u0161\u015f")
         buf.write("\3\2\2\2\u0161\u0162\3\2\2\2\u0162d\3\2\2\2\u0163\u0167")
-        buf.write("\7%\2\2\u0164\u0166\n\6\2\2\u0165\u0164\3\2\2\2\u0166")
+        buf.write("\7%\2\2\u0164\u0166\n\7\2\2\u0165\u0164\3\2\2\2\u0166")
         buf.write("\u0169\3\2\2\2\u0167\u0165\3\2\2\2\u0167\u0168\3\2\2\2")
         buf.write("\u0168\u016a\3\2\2\2\u0169\u0167\3\2\2\2\u016a\u016b\b")
         buf.write("\63\2\2\u016bf\3\2\2\2\u016c\u016d\7\"\2\2\u016d\u016e")
@@ -262,7 +262,7 @@ class QuilLexer(Lexer):
 
     def __init__(self, input=None, output:TextIO = sys.stdout):
         super().__init__(input, output)
-        self.checkVersion("4.7")
+        self.checkVersion("4.7.1")
         self._interp = LexerATNSimulator(self, self.atn, self.decisionsToDFA, PredictionContextCache())
         self._actions = None
         self._predicates = None
diff --git a/pyquil/_parser/gen3/QuilListener.py b/pyquil/_parser/gen3/QuilListener.py
index 88c81da..42ea74d 100644
--- a/pyquil/_parser/gen3/QuilListener.py
+++ b/pyquil/_parser/gen3/QuilListener.py
@@ -1,4 +1,4 @@
-# Generated from Quil.g4 by ANTLR 4.7
+# Generated from Quil.g4 by ANTLR 4.7.1
 from antlr4 import *
 if __name__ is not None and "." in __name__:
     from .QuilParser import QuilParser
diff --git a/pyquil/_parser/gen3/QuilParser.py b/pyquil/_parser/gen3/QuilParser.py
index a509213..9a086e3 100644
--- a/pyquil/_parser/gen3/QuilParser.py
+++ b/pyquil/_parser/gen3/QuilParser.py
@@ -1,4 +1,4 @@
-# Generated from Quil.g4 by ANTLR 4.7
+# Generated from Quil.g4 by ANTLR 4.7.1
 # encoding: utf-8
 from antlr4 import *
 from io import StringIO
@@ -314,7 +314,7 @@ class QuilParser ( Parser ):
 
     def __init__(self, input:TokenStream, output:TextIO = sys.stdout):
         super().__init__(input, output)
-        self.checkVersion("4.7")
+        self.checkVersion("4.7.1")
         self._interp = ParserATNSimulator(self, self.atn, self.decisionsToDFA, self.sharedContextCache)
         self._predicates = None
 


Test patch:
diff --git a/pyquil/tests/test_parser.py b/pyquil/tests/test_parser.py
index 5129eca..3e77140 100644
--- a/pyquil/tests/test_parser.py
+++ b/pyquil/tests/test_parser.py
@@ -89,6 +89,7 @@ def test_expressions():
     _expr("1e3", 1000.0)
     _expr("1.5e2", 150.0)
     _expr("3.5919865395417361e-05", 3.5919865395417361e-05)
+    _expr("3.5919865395417361E-05", 3.5919865395417361e-05)
 
     # Complex
     _expr("123.456i", complex(0, 123.456))