Major Refactoring on plyxproto

- Reorganized code and removed copy of ply
- Reformatted code to be closer to PEP8
- Updated to Python3 compatibility
- Added tox test runner and created test cases
diff --git a/tests/test_logicparser.py b/tests/test_logicparser.py
new file mode 100644
index 0000000..bb3107d
--- /dev/null
+++ b/tests/test_logicparser.py
@@ -0,0 +1,72 @@
+# Copyright 2017-present Open Networking Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from __future__ import print_function
+import unittest
+
+import ply.lex as lex
+import ply.yacc as yacc
+from plyxproto.logicparser import FOLLexer, FOLParser
+
+
+class TestFOL(unittest.TestCase):
+
+    @classmethod
+    def setUpClass(self):
+
+        self.DEBUG = 0
+        self.lexer = lex.lex(module=FOLLexer(), debug=self.DEBUG)
+        self.parser = yacc.yacc(module=FOLParser(), start='goal', debug=self.DEBUG)
+
+    def test_true(self):
+        '''verify basic truth statement'''
+
+        t_in = "<true>"
+        p_out = self.parser.parse(t_in, lexer=self.lexer, debug=self.DEBUG)
+        self.assertEqual(p_out, "true")
+
+    def test_or(self):
+        '''verify or statement'''
+
+        t_in = "<a | b>"
+        p_out = self.parser.parse(t_in, lexer=self.lexer, debug=self.DEBUG)
+        self.assertEqual(p_out, {'|': ['a', 'b']})
+
+    def test_exists(self):
+        '''verify exists statement'''
+
+        t_in = "<exists a: x=y>"
+        p_out = self.parser.parse(t_in, lexer=self.lexer, debug=self.DEBUG)
+        self.assertEqual(p_out, {'exists': ['a', {'=': ('x', 'y')}]})
+
+    def test_forall(self):
+        '''verify forall statement'''
+
+        t_in = "<forall a: exists b: x.b=y.b>"
+        p_out = self.parser.parse(t_in, lexer=self.lexer, debug=self.DEBUG)
+        self.assertEqual(p_out, {'forall': ['a', {'exists': ['b', {'=': ('x.b', 'y.b')}]}]})
+
+    def test_endswith(self):
+        '''verify endswith statement'''
+
+        t_in = "<forall a: {{ a.endswith('good') }}>"
+        p_out = self.parser.parse(t_in, lexer=self.lexer, debug=self.DEBUG)
+        self.assertEqual(p_out, {'forall': ['a', {'python': "a.endswith('good')"}]})
+
+    def test_function(self):
+        '''verify policy function calls'''
+
+        t_in = "< *doit(foo) >"
+        p_out = self.parser.parse(t_in, lexer=self.lexer, debug=self.DEBUG)
+        self.assertEqual(p_out, {'policy': ['doit', 'foo']})