First pass of pep8'ing the code
diff --git a/demo.py b/demo.py
index 8670650..b709611 100644
--- a/demo.py
+++ b/demo.py
@@ -54,6 +54,5 @@
 
 for t in tests:
     if t.startswith('test'):
-        print 'parsin %s'%t
+        print 'parsin %s' % t
         parser.parse_string(globals()[t])
-
diff --git a/foldemo.py b/foldemo.py
index 8035f85..eb350d7 100644
--- a/foldemo.py
+++ b/foldemo.py
@@ -1,7 +1,6 @@
 from plyxproto.logicparser import *
 import ply.lex as lex
 import ply.yacc as yacc
-import pdb
 
 test_1 = "<true>"
 test_2 = "<a | b>"
@@ -15,6 +14,6 @@
 lexer = lex.lex(module=FOLLexer(), debug=DEBUG)
 parser = yacc.yacc(module=FOLParser(), start='goal', debug=DEBUG)
 
-for x,v in globals().items():
+for x, v in globals().items():
     if x.startswith('test_'):
-        print parser.parse(v, lexer = lexer, debug=DEBUG)
+        print parser.parse(v, lexer=lexer, debug=DEBUG)
diff --git a/plyxproto/helpers.py b/plyxproto/helpers.py
index b059c17..2cfc4c3 100644
--- a/plyxproto/helpers.py
+++ b/plyxproto/helpers.py
@@ -1,8 +1,9 @@
 class LexHelper:
     offset = 0
+
     def get_max_linespan(self, p):
-        defSpan=[1e60, -1]
-        mSpan=[1e60, -1]
+        defSpan = [1e60, -1]
+        mSpan = [1e60, -1]
         for sp in range(0, len(p)):
             csp = p.linespan(sp)
             if csp[0] == 0 and csp[1] == 0:
@@ -10,16 +11,21 @@
                     csp = p[sp].linespan
                 else:
                     continue
-            if csp == None or len(csp) != 2: continue
-            if csp[0] == 0 and csp[1] == 0: continue
-            if csp[0] < mSpan[0]: mSpan[0] = csp[0]
-            if csp[1] > mSpan[1]: mSpan[1] = csp[1]
-        if defSpan == mSpan: return (0,0)
-        return tuple([mSpan[0]-self.offset, mSpan[1]-self.offset])
+            if csp is None or len(csp) != 2:
+                continue
+            if csp[0] == 0 and csp[1] == 0:
+                continue
+            if csp[0] < mSpan[0]:
+                mSpan[0] = csp[0]
+            if csp[1] > mSpan[1]:
+                mSpan[1] = csp[1]
+        if defSpan == mSpan:
+            return (0, 0)
+        return tuple([mSpan[0] - self.offset, mSpan[1] - self.offset])
 
     def get_max_lexspan(self, p):
-        defSpan=[1e60, -1]
-        mSpan=[1e60, -1]
+        defSpan = [1e60, -1]
+        mSpan = [1e60, -1]
         for sp in range(0, len(p)):
             csp = p.lexspan(sp)
             if csp[0] == 0 and csp[1] == 0:
@@ -27,24 +33,32 @@
                     csp = p[sp].lexspan
                 else:
                     continue
-            if csp == None or len(csp) != 2: continue
-            if csp[0] == 0 and csp[1] == 0: continue
-            if csp[0] < mSpan[0]: mSpan[0] = csp[0]
-            if csp[1] > mSpan[1]: mSpan[1] = csp[1]
-        if defSpan == mSpan: return (0,0)
-        return tuple([mSpan[0]-self.offset, mSpan[1]-self.offset])
+            if csp is None or len(csp) != 2:
+                continue
+            if csp[0] == 0 and csp[1] == 0:
+                continue
+            if csp[0] < mSpan[0]:
+                mSpan[0] = csp[0]
+            if csp[1] > mSpan[1]:
+                mSpan[1] = csp[1]
+        if defSpan == mSpan:
+            return (0, 0)
+        return tuple([mSpan[0] - self.offset, mSpan[1] - self.offset])
 
     def set_parse_object(self, dst, p):
-        dst.setLexData(linespan=self.get_max_linespan(p), lexspan=self.get_max_lexspan(p))
+        dst.setLexData(
+            linespan=self.get_max_linespan(p),
+            lexspan=self.get_max_lexspan(p))
         dst.setLexObj(p)
 
+
 class Base(object):
     parent = None
     lexspan = None
     linespan = None
 
     def v(self, obj, visitor):
-        if obj == None:
+        if obj is None:
             return
         elif hasattr(obj, "accept"):
             obj.accept(visitor)
@@ -64,7 +78,10 @@
             obj.parent = parent
 
 # Lexical unit - contains lexspan and linespan for later analysis.
+
+
 class LU(Base):
+
     def __init__(self, p, idx):
         self.p = p
         self.idx = idx
@@ -75,20 +92,23 @@
         # If string is in the value (raw value) and start and stop lexspan is the same, add real span
         # obtained by string length.
         if isinstance(self.pval, str) \
-                and self.lexspan != None \
+                and self.lexspan is not None \
                 and self.lexspan[0] == self.lexspan[1] \
                 and self.lexspan[0] != 0:
-            self.lexspan = tuple([self.lexspan[0], self.lexspan[0] + len(self.pval)])
+            self.lexspan = tuple(
+                [self.lexspan[0], self.lexspan[0] + len(self.pval)])
         super(LU, self).__init__()
 
     @staticmethod
     def i(p, idx):
-        if isinstance(p[idx], LU): return p[idx]
-        if isinstance(p[idx], str): return LU(p, idx)
+        if isinstance(p[idx], LU):
+            return p[idx]
+        if isinstance(p[idx], str):
+            return LU(p, idx)
         return p[idx]
 
     def describe(self):
-        return "LU(%s,%s)" % (self.pval,  self.lexspan)
+        return "LU(%s,%s)" % (self.pval, self.lexspan)
 
     def __str__(self):
         return self.pval
@@ -104,14 +124,17 @@
             yield x
 
 # Base node
+
+
 class SourceElement(Base):
     '''
     A SourceElement is the base class for all elements that occur in a Protocol Buffers
     file parsed by plyproto.
     '''
+
     def __init__(self, linespan=[], lexspan=[], p=None):
         super(SourceElement, self).__init__()
-        self._fields = [] # ['linespan', 'lexspan']
+        self._fields = []  # ['linespan', 'lexspan']
         self.linespan = linespan
         self.lexspan = lexspan
         self.p = p
@@ -141,6 +164,7 @@
     def accept(self, visitor):
         pass
 
+
 class Visitor(object):
 
     def __init__(self, verbose=False):
@@ -148,7 +172,8 @@
 
     def __getattr__(self, name):
         if not name.startswith('visit_'):
-            raise AttributeError('name must start with visit_ but was {}'.format(name))
+            raise AttributeError(
+                'name must start with visit_ but was {}'.format(name))
 
         def f(element):
             if self.verbose:
@@ -174,5 +199,3 @@
     # visitor.visit_Name(self)
     # visitor.visit_Proto(self)
     # visitor.visit_LU(self)
-
-
diff --git a/plyxproto/logicparser.py b/plyxproto/logicparser.py
index c246baf..ae8444e 100644
--- a/plyxproto/logicparser.py
+++ b/plyxproto/logicparser.py
@@ -3,20 +3,33 @@
 __copyright__ = "Copyright (C) 2017 Open Networking Lab"
 __version__ = "1.0"
 
-import ply.lex as lex
-import ply.yacc as yacc
+from helpers import LexHelper
 
-from helpers import LexHelper, LU
 
 class FOLParsingError(Exception):
+
     def __init__(self, message, error_range):
         super(FOLParsingError, self).__init__(message)
         self.error_range = error_range
 
+
 class FOLLexer(object):
     keywords = ('forall', 'exists', 'True', 'False', 'not', 'in')
 
-    tokens = ['STRING_LITERAL', 'NUM', 'ESCAPE', 'COLON', 'IMPLIES', 'OR', 'AND', 'LPAREN', 'RPAREN', 'EQUALS', 'SYMBOL', 'LT', 'RT', 'STAR'] + [k.upper() for k in keywords]
+    tokens = ['STRING_LITERAL',
+              'NUM',
+              'ESCAPE',
+              'COLON',
+              'IMPLIES',
+              'OR',
+              'AND',
+              'LPAREN',
+              'RPAREN',
+              'EQUALS',
+              'SYMBOL',
+              'LT',
+              'RT',
+              'STAR'] + [k.upper() for k in keywords]
     # literals = '()+-*/=?:,.^|&~!=[]{};<>@%'
 
     t_ignore_LINE_COMMENT = '//.*'
@@ -62,11 +75,11 @@
         return t
 
     def t_error(self, t):
-        print("Illegal character '{}' ({}) in line {}".format(t.value[0], hex(ord(t.value[0])), t.lexer.lineno))
+        print("Illegal character '{}' ({}) in line {}".format(
+            t.value[0], hex(ord(t.value[0])), t.lexer.lineno))
         t.lexer.skip(1)
- 
-    
-    
+
+
 class FOLParser(object):
     tokens = FOLLexer.tokens
     offset = 0
@@ -138,14 +151,14 @@
 
     def p_error(self, p):
         error = 'error: {}'.format(p)
-        raise FOLParsingError(error, (p.lineno,p.lexpos,len(p.value)))
+        raise FOLParsingError(error, (p.lineno, p.lexpos, len(p.value)))
 
     precedence = (
-                  ("right", "IMPLIES"),
-                  ("left", "OR"),
-                  ("left", "AND"),
-                  ("right", "COLON"),
-                  ("right", "NOT"),
-                  ("right", "STAR"),
-                  ("right", "ESCAPE"),
-                  ("nonassoc", "EQUALS", "IN"))
+        ("right", "IMPLIES"),
+        ("left", "OR"),
+        ("left", "AND"),
+        ("right", "COLON"),
+        ("right", "NOT"),
+        ("right", "STAR"),
+        ("right", "ESCAPE"),
+        ("nonassoc", "EQUALS", "IN"))
diff --git a/plyxproto/model.py b/plyxproto/model.py
index d19eeff..39618a3 100644
--- a/plyxproto/model.py
+++ b/plyxproto/model.py
@@ -1,8 +1,15 @@
 from helpers import Base, SourceElement
 
+
 class PackageStatement(SourceElement):
+
     def __init__(self, name, linespan=None, lexspan=None, p=None):
-        super(PackageStatement, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
+        super(
+            PackageStatement,
+            self).__init__(
+            linespan=linespan,
+            lexspan=lexspan,
+            p=p)
         self._fields += ['name']
         self.name = name
         Base.p(self.name, self)
@@ -10,9 +17,16 @@
     def accept(self, visitor):
         visitor.visit_PackageStatement(self)
 
+
 class ImportStatement(SourceElement):
+
     def __init__(self, name, linespan=None, lexspan=None, p=None):
-        super(ImportStatement, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
+        super(
+            ImportStatement,
+            self).__init__(
+            linespan=linespan,
+            lexspan=lexspan,
+            p=p)
         self._fields += ['name']
         self.name = name
         Base.p(self.name, self)
@@ -20,9 +34,16 @@
     def accept(self, visitor):
         visitor.visit_ImportStatement(self)
 
+
 class OptionStatement(SourceElement):
+
     def __init__(self, name, value, linespan=None, lexspan=None, p=None):
-        super(OptionStatement, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
+        super(
+            OptionStatement,
+            self).__init__(
+            linespan=linespan,
+            lexspan=lexspan,
+            p=p)
         self._fields += ['name', 'value']
         self.name = name
         Base.p(self.name, self)
@@ -32,9 +53,16 @@
     def accept(self, visitor):
         visitor.visit_OptionStatement(self)
 
+
 class FieldDirective(SourceElement):
+
     def __init__(self, name, value, linespan=None, lexspan=None, p=None):
-        super(FieldDirective, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
+        super(
+            FieldDirective,
+            self).__init__(
+            linespan=linespan,
+            lexspan=lexspan,
+            p=p)
         self._fields += ['name', 'value']
         self.name = name
         Base.p(self.name, self)
@@ -47,9 +75,16 @@
             self.v(self.value, visitor)
             visitor.visit_FieldDirective_post(self)
 
+
 class FieldType(SourceElement):
+
     def __init__(self, name, linespan=None, lexspan=None, p=None):
-        super(FieldType, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
+        super(
+            FieldType,
+            self).__init__(
+            linespan=linespan,
+            lexspan=lexspan,
+            p=p)
         self._fields += ['name']
         self.name = name
         Base.p(self.name, self)
@@ -58,10 +93,27 @@
         if visitor.visit_FieldType(self):
             self.v(self.name, visitor)
 
+
 class LinkDefinition(SourceElement):
-    def __init__(self, link_type, src_port, name, through, dst_port, linespan=None, lexspan=None, p=None):
-        super(LinkDefinition, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
-        self._fields += ['link_type', 'src_port', 'name', 'dst_port', 'through']
+
+    def __init__(
+            self,
+            link_type,
+            src_port,
+            name,
+            through,
+            dst_port,
+            linespan=None,
+            lexspan=None,
+            p=None):
+        super(
+            LinkDefinition,
+            self).__init__(
+            linespan=linespan,
+            lexspan=lexspan,
+            p=p)
+        self._fields += ['link_type', 'src_port',
+                         'name', 'dst_port', 'through']
         self.link_type = link_type
         Base.p(self.link_type, self)
 
@@ -78,12 +130,30 @@
         Base.p(self.dst_port, self)
 
     def accept(self, visitor):
-         visitor.visit_LinkDefinition(self)
+        visitor.visit_LinkDefinition(self)
+
 
 class FieldDefinition(SourceElement):
-    def __init__(self, field_modifier, ftype, name, policy, fieldId, fieldDirective, linespan=None, lexspan=None, p=None):
-        super(FieldDefinition, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
-        self._fields += ['field_modifier', 'ftype', 'name', 'fieldId', 'policy', 'fieldDirective']
+
+    def __init__(
+            self,
+            field_modifier,
+            ftype,
+            name,
+            policy,
+            fieldId,
+            fieldDirective,
+            linespan=None,
+            lexspan=None,
+            p=None):
+        super(
+            FieldDefinition,
+            self).__init__(
+            linespan=linespan,
+            lexspan=lexspan,
+            p=p)
+        self._fields += ['field_modifier', 'ftype',
+                         'name', 'fieldId', 'policy', 'fieldDirective']
         self.name = name
         Base.p(self.name, self)
         self.field_modifier = field_modifier
@@ -107,9 +177,16 @@
             self.v(self.fieldDirective, visitor)
             visitor.visit_FieldDefinition_post(self)
 
+
 class EnumFieldDefinition(SourceElement):
+
     def __init__(self, name, fieldId, linespan=None, lexspan=None, p=None):
-        super(EnumFieldDefinition, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
+        super(
+            EnumFieldDefinition,
+            self).__init__(
+            linespan=linespan,
+            lexspan=lexspan,
+            p=p)
         self._fields += ['name', 'fieldId']
         self.name = name
         Base.p(self.name, self)
@@ -121,9 +198,16 @@
             self.v(self.name, visitor)
             self.v(self.fieldId, visitor)
 
+
 class ReduceDefinition(SourceElement):
+
     def __init__(self, name, body, linespan=None, lexspan=None, p=None):
-        super(ReduceDefinition, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
+        super(
+            ReduceDefinition,
+            self).__init__(
+            linespan=linespan,
+            lexspan=lexspan,
+            p=p)
         self._fields += ['name', 'body']
         self.name = name
         Base.p(self.name, self)
@@ -137,8 +221,14 @@
 
 
 class MapDefinition(SourceElement):
+
     def __init__(self, name, body, linespan=None, lexspan=None, p=None):
-        super(MapDefinition, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
+        super(
+            MapDefinition,
+            self).__init__(
+            linespan=linespan,
+            lexspan=lexspan,
+            p=p)
         self._fields += ['name', 'body']
         self.name = name
         Base.p(self.name, self)
@@ -152,8 +242,14 @@
 
 
 class PolicyDefinition(SourceElement):
+
     def __init__(self, name, body, linespan=None, lexspan=None, p=None):
-        super(PolicyDefinition, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
+        super(
+            PolicyDefinition,
+            self).__init__(
+            linespan=linespan,
+            lexspan=lexspan,
+            p=p)
         self._fields += ['name', 'body']
         self.name = name
         Base.p(self.name, self)
@@ -165,9 +261,16 @@
             self.v(self.name, visitor)
             self.v(self.body, visitor)
 
+
 class EnumDefinition(SourceElement):
+
     def __init__(self, name, body, linespan=None, lexspan=None, p=None):
-        super(EnumDefinition, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
+        super(
+            EnumDefinition,
+            self).__init__(
+            linespan=linespan,
+            lexspan=lexspan,
+            p=p)
         self._fields += ['name', 'body']
         self.name = name
         Base.p(self.name, self)
@@ -179,8 +282,16 @@
             self.v(self.name, visitor)
             self.v(self.body, visitor)
 
+
 class LinkSpec(SourceElement):
-    def __init__(self, field_spec, link_spec, linespan=None, lexspan=None, p=None):
+
+    def __init__(
+            self,
+            field_spec,
+            link_spec,
+            linespan=None,
+            lexspan=None,
+            p=None):
         super(LinkSpec, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
         self._fields += ['link_def', 'field_def']
         self.link_def = link_spec
@@ -194,9 +305,24 @@
             self.v(self.field_def, visitor)
             visitor.visit_LinkSpec_post(self)
 
+
 class MessageDefinition(SourceElement):
-    def __init__(self, name, policy, bases, body, linespan=None, lexspan=None, p=None):
-        super(MessageDefinition, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
+
+    def __init__(
+            self,
+            name,
+            policy,
+            bases,
+            body,
+            linespan=None,
+            lexspan=None,
+            p=None):
+        super(
+            MessageDefinition,
+            self).__init__(
+            linespan=linespan,
+            lexspan=lexspan,
+            p=p)
         self._fields += ['name', 'policy', 'bases', 'body']
 
         self.name = name
@@ -236,9 +362,16 @@
             visitor.visit_MessageDefinition_post(self)
 """
 
+
 class MessageExtension(SourceElement):
+
     def __init__(self, name, body, linespan=None, lexspan=None, p=None):
-        super(MessageExtension, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
+        super(
+            MessageExtension,
+            self).__init__(
+            linespan=linespan,
+            lexspan=lexspan,
+            p=p)
         self._fields += ['name', 'body']
         self.name = name
         Base.p(self.name, self)
@@ -251,9 +384,23 @@
             self.v(self.body, visitor)
             visitor.visit_MessageExtension_post(self)
 
+
 class MethodDefinition(SourceElement):
-    def __init__(self, name, name2, name3, linespan=None, lexspan=None, p=None):
-        super(MethodDefinition, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
+
+    def __init__(
+            self,
+            name,
+            name2,
+            name3,
+            linespan=None,
+            lexspan=None,
+            p=None):
+        super(
+            MethodDefinition,
+            self).__init__(
+            linespan=linespan,
+            lexspan=lexspan,
+            p=p)
         self._fields += ['name', 'name2', 'name3']
         self.name = name
         Base.p(self.name, self)
@@ -269,9 +416,16 @@
             self.v(self.name3, visitor)
             visitor.visit_MethodDefinition_post(self)
 
+
 class ServiceDefinition(SourceElement):
+
     def __init__(self, name, body, linespan=None, lexspan=None, p=None):
-        super(ServiceDefinition, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
+        super(
+            ServiceDefinition,
+            self).__init__(
+            linespan=linespan,
+            lexspan=lexspan,
+            p=p)
         self._fields += ['name', 'body']
         self.name = name
         Base.p(self.name, self)
@@ -284,12 +438,20 @@
             self.v(self.body, visitor)
             visitor.visit_ServiceDefinition_post(self)
 
+
 class ExtensionsMax(SourceElement):
     pass
 
+
 class ExtensionsDirective(SourceElement):
+
     def __init__(self, fromVal, toVal, linespan=None, lexspan=None, p=None):
-        super(ExtensionsDirective, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
+        super(
+            ExtensionsDirective,
+            self).__init__(
+            linespan=linespan,
+            lexspan=lexspan,
+            p=p)
         self._fields += ['fromVal', 'toVal']
         self.fromVal = fromVal
         Base.p(self.fromVal, self)
@@ -302,6 +464,7 @@
             self.v(self.toVal, visitor)
             visitor.visit_ExtensionsDirective_post(self)
 
+
 class Literal(SourceElement):
 
     def __init__(self, value, linespan=None, lexspan=None, p=None):
@@ -312,6 +475,7 @@
     def accept(self, visitor):
         visitor.visit_Literal(self)
 
+
 class Name(SourceElement):
 
     def __init__(self, value, linespan=None, lexspan=None, p=None):
@@ -336,18 +500,23 @@
     def accept(self, visitor):
         visitor.visit_Name(self)
 
+
 class DotName(Name):
     elements = []
+
     def __init__(self, elements, linespan=None, lexspan=None, p=None):
-        super(DotName, self).__init__('.'.join([str(x) for x in elements]), linespan=linespan, lexspan=lexspan, p=p)
+        super(DotName, self).__init__(
+            '.'.join([str(x) for x in elements]), linespan=linespan, lexspan=lexspan, p=p)
         self._fields += ['elements']
         self.elements = elements
         self.deriveLex()
 
     def deriveLex(self):
-        if isinstance(self.elements, list) and len(self.elements)>0:
-            self.lexspan = (min([x.lexspan[0] for x in self.elements if x.lexspan[0] != 0]), max([x.lexspan[1] for x in self.elements if x.lexspan[1] != 0]))
-            self.linespan = (min([x.linespan[0] for x in self.elements if x.linespan[0] != 0]), max([x.linespan[1] for x in self.elements if x.linespan[1] != 0]))
+        if isinstance(self.elements, list) and len(self.elements) > 0:
+            self.lexspan = (min([x.lexspan[0] for x in self.elements if x.lexspan[0] != 0]), max(
+                [x.lexspan[1] for x in self.elements if x.lexspan[1] != 0]))
+            self.linespan = (min([x.linespan[0] for x in self.elements if x.linespan[0] != 0]), max(
+                [x.linespan[1] for x in self.elements if x.linespan[1] != 0]))
         elif hasattr(self.elements, "lexspan"):
             self.lexspan = self.elements.lexspan
             self.linespan = self.elements.linespan
@@ -357,10 +526,16 @@
     def accept(self, visitor):
         visitor.visit_DotName(self)
 
+
 class ProtoFile(SourceElement):
 
     def __init__(self, body, linespan=None, lexspan=None, p=None):
-        super(ProtoFile, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
+        super(
+            ProtoFile,
+            self).__init__(
+            linespan=linespan,
+            lexspan=lexspan,
+            p=p)
         self._fields += ['body']
         self.body = body
         Base.p(self.body, self)
diff --git a/plyxproto/parser.py b/plyxproto/parser.py
index 6213a07..e976727 100755
--- a/plyxproto/parser.py
+++ b/plyxproto/parser.py
@@ -6,34 +6,96 @@
 
 import ply.lex as lex
 import ply.yacc as yacc
-from .model import *
 
-import pdb
+from .model import (
+    DotName,
+    EnumDefinition,
+    EnumFieldDefinition,
+    ExtensionsDirective,
+    ExtensionsMax,
+    FieldDefinition,
+    FieldDirective,
+    FieldType,
+    ImportStatement,
+    LinkDefinition,
+    LinkSpec,
+    Literal,
+    MapDefinition,
+    MessageDefinition,
+    MessageExtension,
+    MethodDefinition,
+    Name,
+    OptionStatement,
+    PackageStatement,
+    PolicyDefinition,
+    ProtoFile,
+    ReduceDefinition,
+    ServiceDefinition,
+)
+
 from helpers import LexHelper, LU
 from logicparser import FOLParser, FOLLexer, FOLParsingError
 import ast
 
+
 class PythonError(Exception):
     pass
 
+
 class ParsingError(Exception):
+
     def __init__(self, message, error_range):
         super(ParsingError, self).__init__(message)
         self.error_range = error_range
 
 
 class ProtobufLexer(object):
-    keywords = ('double', 'float', 'int32', 'int64', 'uint32', 'uint64', 'sint32', 'sint64',
-                'fixed32', 'fixed64', 'sfixed32', 'sfixed64', 'bool', 'string', 'bytes',
-                'message', 'required', 'optional', 'repeated', 'enum', 'extensions', 'max',  'extend',
-                'to', 'package', '_service', 'rpc', 'returns', 'true', 'false', 'option', 'import', 'manytoone', 'manytomany', 'onetoone', 'policy', 'map', 'reduce')
+    keywords = (
+        'double',
+        'float',
+        'int32',
+        'int64',
+        'uint32',
+        'uint64',
+        'sint32',
+        'sint64',
+        'fixed32',
+        'fixed64',
+        'sfixed32',
+        'sfixed64',
+        'bool',
+        'string',
+        'bytes',
+        'message',
+        'required',
+        'optional',
+        'repeated',
+        'enum',
+        'extensions',
+        'max',
+        'extend',
+        'to',
+        'package',
+        '_service',
+        'rpc',
+        'returns',
+        'true',
+        'false',
+        'option',
+        'import',
+        'manytoone',
+        'manytomany',
+        'onetoone',
+        'policy',
+        'map',
+        'reduce')
 
     tokens = [
         'POLICYBODY',
         'NAME',
         'NUM',
         'STRING_LITERAL',
-        #'LINE_COMMENT', 'BLOCK_COMMENT',
+        # 'LINE_COMMENT', 'BLOCK_COMMENT',
         'LBRACE', 'RBRACE', 'LBRACK', 'RBRACK',
         'LPAR', 'RPAR', 'EQ', 'SEMI', 'DOT',
         'ARROW', 'COLON', 'COMMA', 'SLASH',
@@ -41,7 +103,6 @@
         'STARTTOKEN'
     ] + [k.upper() for k in keywords]
 
-
     def t_POLICYBODY(self, t):
         r'< (.|\n)*? [^-]>'
         t.lexer.lineno += t.value.count('\n')
@@ -53,6 +114,7 @@
     t_STRING_LITERAL = r'\"([^\\\n]|(\\.))*?\"'
 
     t_ignore_LINE_COMMENT = '//.*'
+
     def t_BLOCK_COMMENT(self, t):
         r'/\*(.|\n)*?\*/'
         t.lexer.lineno += t.value.count('\n')
@@ -62,7 +124,6 @@
     t_LBRACK = '\\['
     t_RBRACK = '\\]'
 
-
     t_LPAR = '\\('
     t_RPAR = '\\)'
     t_EQ = '='
@@ -79,7 +140,7 @@
     def t_NAME(self, t):
         '[A-Za-z_$][A-Za-z0-9_+$]*'
         if t.value in ProtobufLexer.keywords:
-            #print "type: %s val %s t %s" % (t.type, t.value, t)
+            # print "type: %s val %s t %s" % (t.type, t.value, t)
             t.type = t.value.upper()
         return t
 
@@ -92,13 +153,14 @@
         t.lexer.lineno += len(t.value) / 2
 
     def t_error(self, t):
-        print("Illegal character '{}' ({}) in line {}".format(t.value[0], hex(ord(t.value[0])), t.lexer.lineno))
+        print("Illegal character '{}' ({}) in line {}".format(
+            t.value[0], hex(ord(t.value[0])), t.lexer.lineno))
         t.lexer.skip(1)
 
 
 def srcPort(x):
     if (x):
-        return [FieldDirective(Name('port'),x)]
+        return [FieldDirective(Name('port'), x)]
     else:
         return []
 
@@ -107,8 +169,12 @@
     tokens = ProtobufLexer.tokens
     offset = 0
     lh = LexHelper()
-    fol_lexer = lex.lex(module=FOLLexer())#, optimize=1)
-    fol_parser = yacc.yacc(module=FOLParser(), start='goal', outputdir='/tmp', debug=0)
+    fol_lexer = lex.lex(module=FOLLexer())  # , optimize=1)
+    fol_parser = yacc.yacc(
+        module=FOLParser(),
+        start='goal',
+        outputdir='/tmp',
+        debug=0)
 
     def setOffset(self, of):
         self.offset = of
@@ -118,11 +184,11 @@
         '''empty :'''
         pass
 
-    def p_field_modifier(self,p):
+    def p_field_modifier(self, p):
         '''field_modifier : REQUIRED
                           | OPTIONAL
                           | REPEATED'''
-        p[0] = LU.i(p,1)
+        p[0] = LU.i(p, 1)
 
     def p_primitive_type(self, p):
         '''primitive_type : DOUBLE
@@ -140,23 +206,23 @@
                           | BOOL
                           | STRING
                           | BYTES'''
-        p[0] = LU.i(p,1)
+        p[0] = LU.i(p, 1)
 
     def p_link_type(self, p):
         '''link_type      : ONETOONE
                           | MANYTOONE
                           | MANYTOMANY'''
-        p[0] = LU.i(p,1)
+        p[0] = LU.i(p, 1)
 
     def p_field_id(self, p):
         '''field_id : NUM'''
-        p[0] = LU.i(p,1)
+        p[0] = LU.i(p, 1)
 
     def p_rvalue(self, p):
         '''rvalue : NUM
                   | TRUE
                   | FALSE'''
-        p[0] = LU.i(p,1)
+        p[0] = LU.i(p, 1)
 
     def p_rvalue3(self, p):
         '''rvalue : STRING_LITERAL'''
@@ -177,7 +243,7 @@
     def p_field_directives(self, p):
         '''field_directives : LBRACK field_directive_times RBRACK'''
         p[0] = p[2]
-        #self.lh.set_parse_object(p[0], p)
+        # self.lh.set_parse_object(p[0], p)
 
     def p_field_directive(self, p):
         '''field_directive : NAME EQ rvalue'''
@@ -204,13 +270,13 @@
         '''csv : empty'''
 
     def p_csv(self, p):
-        '''csv : dotname 
+        '''csv : dotname
                | csv COMMA dotname'''
 
         if len(p) == 2:
-            p[0] = [LU(p,1)]
+            p[0] = [LU(p, 1)]
         else:
-            p[0] = p[1] + [LU(p,3)]
+            p[0] = p[1] + [LU(p, 3)]
 
     def p_field_directive_times(self, p):
         '''field_directive_times : field_directive_plus'''
@@ -224,17 +290,17 @@
         '''field_directive_plus : field_directive
                                | field_directive_plus COMMA field_directive'''
         if len(p) == 2:
-            p[0] = [LU(p,1)]
+            p[0] = [LU(p, 1)]
         else:
-            p[0] = p[1] + [LU(p,3)]
+            p[0] = p[1] + [LU(p, 3)]
 
     def p_dotname(self, p):
         '''dotname : NAME
                    | dotname DOT NAME'''
         if len(p) == 2:
-            p[0] = [LU(p,1)]
+            p[0] = [LU(p, 1)]
         else:
-            p[0] = p[1] + [LU(p,3)]
+            p[0] = p[1] + [LU(p, 3)]
 
     # Hack for cases when there is a field named 'message' or 'max'
     def p_fieldName(self, p):
@@ -242,13 +308,13 @@
                       | NAME
                       | MESSAGE
                       | MAX'''
-        p[0] = Name(LU.i(p,1))
+        p[0] = Name(LU.i(p, 1))
         self.lh.set_parse_object(p[0], p)
         p[0].deriveLex()
 
     def p_field_type(self, p):
         '''field_type : primitive_type'''
-        p[0] = FieldType(LU.i(p,1))
+        p[0] = FieldType(LU.i(p, 1))
         self.lh.set_parse_object(p[0], p)
 
     def p_field_type2(self, p):
@@ -260,7 +326,7 @@
     def p_slash_name(self, p):
         '''slash_name : SLASH dotname'''
         p[0] = p[2]
-        #self.lh.set_parse_object(p[0], p)
+        # self.lh.set_parse_object(p[0], p)
 
     def p_slash_name2(self, p):
         '''slash_name : empty'''
@@ -279,21 +345,45 @@
     def p_link_definition(self, p):
         '''link_definition : field_modifier link_type field_name policy_opt ARROW dotname slash_name colon_fieldname EQ field_id field_directives SEMI'''
         p[0] = LinkSpec(
-                FieldDefinition(LU.i(p,1), Name('int32'), LU.i(p, 3), LU.i(p,4), LU.i(p, 10), [FieldDirective(Name('type'), Name('link')), FieldDirective(Name('model'),LU.i(p, 6))] + srcPort(LU.i(p,8)) + LU.i(p,11)),
-                LinkDefinition(LU.i(p,2), LU.i(p,3), LU.i(p,6), LU.i(p,7), LU.i(p,8)))
+            FieldDefinition(
+                LU.i(
+                    p, 1), Name('int32'), LU.i(
+                    p, 3), LU.i(
+                    p, 4), LU.i(
+                        p, 10), [
+                            FieldDirective(
+                                Name('type'), Name('link')), FieldDirective(
+                                    Name('model'), LU.i(
+                                        p, 6))] + srcPort(
+                                            LU.i(
+                                                p, 8)) + LU.i(
+                                                    p, 11)), LinkDefinition(
+                                                        LU.i(
+                                                            p, 2), LU.i(
+                                                                p, 3), LU.i(
+                                                                    p, 6), LU.i(
+                                                                        p, 7), LU.i(
+                                                                            p, 8)))
 
         self.lh.set_parse_object(p[0], p)
 
     # Root of the field declaration.
     def p_field_definition(self, p):
         '''field_definition : field_modifier field_type field_name policy_opt EQ field_id field_directives SEMI'''
-        p[0] = FieldDefinition(LU.i(p,1), LU.i(p,2), LU.i(p, 3), LU.i(p,4), LU.i(p,6), LU.i(p,7))
+        p[0] = FieldDefinition(
+            LU.i(
+                p, 1), LU.i(
+                p, 2), LU.i(
+                p, 3), LU.i(
+                    p, 4), LU.i(
+                        p, 6), LU.i(
+                            p, 7))
         self.lh.set_parse_object(p[0], p)
 
     # Root of the enum field declaration.
     def p_enum_field(self, p):
         '''enum_field : field_name EQ NUM SEMI'''
-        p[0] = EnumFieldDefinition(LU.i(p, 1), LU.i(p,3))
+        p[0] = EnumFieldDefinition(LU.i(p, 1), LU.i(p, 3))
         self.lh.set_parse_object(p[0], p)
 
     def p_enum_body_part(self, p):
@@ -344,10 +434,12 @@
     def p_policy_definition(self, p):
         '''policy_definition : POLICY NAME POLICYBODY'''
         try:
-            fol = self.fol_parser.parse(p[3], lexer = self.fol_lexer)
-        except FOLParsingError, e:
+            fol = self.fol_parser.parse(p[3], lexer=self.fol_lexer)
+        except FOLParsingError as e:
             lineno, lexpos, length = e.error_range
-            raise ParsingError("Policy parsing error in policy %s"%p[2], (p.lineno(3) + lineno,lexpos + p.lexpos(3), length))
+            raise ParsingError(
+                "Policy parsing error in policy %s" %
+                p[2], (p.lineno(3) + lineno, lexpos + p.lexpos(3), length))
         p[0] = PolicyDefinition(Name(LU.i(p, 2)), fol)
         self.lh.set_parse_object(p[0], p)
 
@@ -355,7 +447,7 @@
     # enum_definition ::= 'enum' ident '{' { ident '=' integer ';' }* '}'
     def p_enum_definition(self, p):
         '''enum_definition : ENUM NAME LBRACE enum_body_opt RBRACE'''
-        p[0] = EnumDefinition(Name(LU.i(p, 2)), LU.i(p,4))
+        p[0] = EnumDefinition(Name(LU.i(p, 2)), LU.i(p, 4))
         self.lh.set_parse_object(p[0], p)
 
     def p_extensions_to(self, p):
@@ -370,13 +462,13 @@
     # extensions_definition ::= 'extensions' integer 'to' integer ';'
     def p_extensions_definition(self, p):
         '''extensions_definition : EXTENSIONS NUM TO extensions_to SEMI'''
-        p[0] = ExtensionsDirective(LU.i(p,2), LU.i(p,4))
+        p[0] = ExtensionsDirective(LU.i(p, 2), LU.i(p, 4))
         self.lh.set_parse_object(p[0], p)
 
     # message_extension ::= 'extend' ident '{' message_body '}'
     def p_message_extension(self, p):
         '''message_extension : EXTEND NAME LBRACE message_body RBRACE'''
-        p[0] = MessageExtension(Name(LU.i(p, 2)), LU.i(p,4))
+        p[0] = MessageExtension(Name(LU.i(p, 2)), LU.i(p, 4))
         self.lh.set_parse_object(p[0], p)
 
     def p_message_body_part(self, p):
@@ -389,12 +481,14 @@
                            | message_extension'''
         p[0] = p[1]
 
-    # message_body ::= { field_definition | enum_definition | message_definition | extensions_definition | message_extension }*
+    # message_body ::= { field_definition | enum_definition |
+    # message_definition | extensions_definition | message_extension }*
     def p_message_body(self, p):
         '''message_body : empty'''
         p[0] = []
 
-    # message_body ::= { field_definition | enum_definition | message_definition | extensions_definition | message_extension }*
+    # message_body ::= { field_definition | enum_definition |
+    # message_definition | extensions_definition | message_extension }*
     def p_message_body2(self, p):
         '''message_body : message_body_part
                       | message_body message_body_part'''
@@ -407,13 +501,27 @@
     # message_definition = MESSAGE_ - ident("messageId") + LBRACE + message_body("body") + RBRACE
     def p_message_definition(self, p):
         '''message_definition : MESSAGE NAME policy_opt csv_expr LBRACE message_body RBRACE'''
-        p[0] = MessageDefinition(Name(LU.i(p, 2)), LU.i(p,3), LU.i(p, 4), LU.i(p,6))
+        p[0] = MessageDefinition(
+            Name(
+                LU.i(
+                    p, 2)), LU.i(
+                p, 3), LU.i(
+                    p, 4), LU.i(
+                        p, 6))
         self.lh.set_parse_object(p[0], p)
 
-    # method_definition ::= 'rpc' ident '(' [ ident ] ')' 'returns' '(' [ ident ] ')' ';'
+    # method_definition ::= 'rpc' ident '(' [ ident ] ')' 'returns' '(' [
+    # ident ] ')' ';'
     def p_method_definition(self, p):
         '''method_definition : RPC NAME LPAR NAME RPAR RETURNS LPAR NAME RPAR'''
-        p[0] = MethodDefinition(Name(LU.i(p, 2)), Name(LU.i(p, 4)), Name(LU.i(p, 8)))
+        p[0] = MethodDefinition(
+            Name(
+                LU.i(
+                    p, 2)), Name(
+                LU.i(
+                    p, 4)), Name(
+                        LU.i(
+                            p, 8)))
         self.lh.set_parse_object(p[0], p)
 
     def p_method_definition_opt(self, p):
@@ -432,11 +540,11 @@
     # service_definition = SERVICE_ - ident("serviceName") + LBRACE + ZeroOrMore(Group(method_definition)) + RBRACE
     def p_service_definition(self, p):
         '''service_definition : _SERVICE NAME LBRACE method_definition_opt RBRACE'''
-        p[0] = ServiceDefinition(Name(LU.i(p, 2)), LU.i(p,4))
+        p[0] = ServiceDefinition(Name(LU.i(p, 2)), LU.i(p, 4))
         self.lh.set_parse_object(p[0], p)
 
     # package_directive ::= 'package' ident [ '.' ident]* ';'
-    def p_package_directive(self,p):
+    def p_package_directive(self, p):
         '''package_directive : PACKAGE dotname SEMI'''
         p[0] = PackageStatement(Name(LU.i(p, 2)))
         self.lh.set_parse_object(p[0], p)
@@ -444,7 +552,7 @@
     # import_directive = IMPORT_ - quotedString("importFileSpec") + SEMI
     def p_import_directive(self, p):
         '''import_directive : IMPORT STRING_LITERAL SEMI'''
-        p[0] = ImportStatement(Literal(LU.i(p,2)))
+        p[0] = ImportStatement(Literal(LU.i(p, 2)))
         self.lh.set_parse_object(p[0], p)
 
     def p_option_rvalue(self, p):
@@ -455,20 +563,20 @@
 
     def p_option_rvalue2(self, p):
         '''option_rvalue : STRING_LITERAL'''
-        p[0] = Literal(LU(p,1))
+        p[0] = Literal(LU(p, 1))
 
     def p_option_rvalue3(self, p):
         '''option_rvalue : NAME'''
-        p[0] = Name(LU.i(p,1))
+        p[0] = Name(LU.i(p, 1))
 
     # option_directive = OPTION_ - ident("optionName") + EQ + quotedString("optionValue") + SEMI
     def p_option_directive(self, p):
         '''option_directive : OPTION NAME EQ option_rvalue SEMI'''
-        p[0] = OptionStatement(Name(LU.i(p, 2)), LU.i(p,4))
+        p[0] = OptionStatement(Name(LU.i(p, 2)), LU.i(p, 4))
         self.lh.set_parse_object(p[0], p)
 
     # topLevelStatement = Group(message_definition | message_extension | enum_definition | service_definition | import_directive | option_directive | package_definition)
-    def p_topLevel(self,p):
+    def p_topLevel(self, p):
         '''topLevel : message_definition
                     | message_extension
                     | enum_definition
@@ -496,7 +604,7 @@
     # parser = Optional(package_directive) + ZeroOrMore(topLevelStatement)
     def p_protofile(self, p):
         '''protofile : statements'''
-        p[0] = ProtoFile(LU.i(p,1))
+        p[0] = ProtoFile(LU.i(p, 1))
         self.lh.set_parse_object(p[0], p)
 
     # Parsing starting point
@@ -505,13 +613,18 @@
         p[0] = p[2]
 
     def p_error(self, p):
-        raise ParsingError("Parsing Error", (p.lineno,p.lexpos,len(p.value)))
+        raise ParsingError("Parsing Error", (p.lineno, p.lexpos, len(p.value)))
+
 
 class ProtobufAnalyzer(object):
 
     def __init__(self):
         self.lexer = lex.lex(module=ProtobufLexer())
-        self.parser = yacc.yacc(module=ProtobufParser(), start='goal', debug=0, outputdir='/tmp')
+        self.parser = yacc.yacc(
+            module=ProtobufParser(),
+            start='goal',
+            debug=0,
+            outputdir='/tmp')
 
     def tokenize_string(self, code):
         self.lexer.input(code)
@@ -519,7 +632,7 @@
             print(token)
 
     def tokenize_file(self, _file):
-        if type(_file) == str:
+        if isinstance(_file, str):
             _file = file(_file)
         content = ''
         for line in _file:
@@ -532,7 +645,7 @@
         return self.parser.parse(prefix + code, lexer=self.lexer, debug=debug)
 
     def parse_file(self, _file, debug=0):
-        if type(_file) == str:
+        if isinstance(_file, str):
             _file = file(_file)
         content = ''
         for line in _file:
diff --git a/setup.py b/setup.py
index fd3cf5e..fa753ac 100644
--- a/setup.py
+++ b/setup.py
@@ -9,23 +9,21 @@
 
 from setuptools import setup
 
-setup(name='plyxproto',
-      version='3.0.0',
-      description='xproto parser and processor',
-      author='Dusan Klinec (original protobuf parser), Sapan Bhatia (xproto extensions)',
-      author_email='sapan@opennetworking.org',
-      url='https://github.com/sb98052/plyprotobuf',
-      license='Apache Software License',
-
-      classifiers=[
-          'Development Status :: 5 - Production/Stable',
-          'Intended Audience :: Developers',
-          'Topic :: Software Development :: Build Tools',
-          'License :: OSI Approved :: Apache Software License',
-          'Programming Language :: Python :: 2',
-          'Programming Language :: Python :: 2.7'
-      ],
-      keywords='xproto protobuf xos parser',
-      packages=['plyxproto'],
-      install_requires=['ply']
-     )
+setup(
+    name='plyxproto',
+    version='3.0.0',
+    description='xproto parser and processor',
+    author='Dusan Klinec (original protobuf parser), Sapan Bhatia (xproto extensions), Zack Williams (maintenance)',
+    author_email='sapan@opennetworking.org',
+    url='https://github.com/sb98052/plyprotobuf',
+    license='Apache Software License',
+    classifiers=[
+        'Development Status :: 5 - Production/Stable',
+        'Intended Audience :: Developers',
+        'Topic :: Software Development :: Build Tools',
+        'License :: OSI Approved :: Apache Software License',
+        'Programming Language :: Python :: 2',
+        'Programming Language :: Python :: 2.7'],
+    keywords='xproto protobuf xos parser',
+    packages=['plyxproto'],
+    install_requires=['ply'])