summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorDavid Beazley <dave@dabeaz.com>2015-04-25 09:21:40 -0500
committerDavid Beazley <dave@dabeaz.com>2015-04-25 09:21:40 -0500
commit9bb220d50391eda55bc45c29f16cd69859bc95a8 (patch)
tree278809e50e13d64d2f379c0738361875295e1f26 /test
parentdaa1160e3b7e7bd94dc06da9e11ce9e188406fda (diff)
downloadply-9bb220d50391eda55bc45c29f16cd69859bc95a8.tar.gz
IOError handling improvements. More tests. Doc update
Diffstat (limited to 'test')
-rw-r--r--test/pkg_test4/__init__.py9
-rw-r--r--test/pkg_test4/parsing/__init__.py0
-rw-r--r--test/pkg_test4/parsing/calclex.py47
-rw-r--r--test/pkg_test4/parsing/calcparse.py66
-rw-r--r--test/testyacc.py8
5 files changed, 130 insertions, 0 deletions
diff --git a/test/pkg_test4/__init__.py b/test/pkg_test4/__init__.py
new file mode 100644
index 0000000..0e19558
--- /dev/null
+++ b/test/pkg_test4/__init__.py
@@ -0,0 +1,9 @@
+# Tests proper handling of lextab and parsetab files in package structures
+
+# Here for testing purposes
+import sys
+if '..' not in sys.path:
+ sys.path.insert(0, '..')
+
+from .parsing.calcparse import parser
+
diff --git a/test/pkg_test4/parsing/__init__.py b/test/pkg_test4/parsing/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/test/pkg_test4/parsing/__init__.py
diff --git a/test/pkg_test4/parsing/calclex.py b/test/pkg_test4/parsing/calclex.py
new file mode 100644
index 0000000..b3c1a4d
--- /dev/null
+++ b/test/pkg_test4/parsing/calclex.py
@@ -0,0 +1,47 @@
+# -----------------------------------------------------------------------------
+# calclex.py
+# -----------------------------------------------------------------------------
+
+import ply.lex as lex
+
+tokens = (
+ 'NAME','NUMBER',
+ 'PLUS','MINUS','TIMES','DIVIDE','EQUALS',
+ 'LPAREN','RPAREN',
+ )
+
+# Tokens
+
+t_PLUS = r'\+'
+t_MINUS = r'-'
+t_TIMES = r'\*'
+t_DIVIDE = r'/'
+t_EQUALS = r'='
+t_LPAREN = r'\('
+t_RPAREN = r'\)'
+t_NAME = r'[a-zA-Z_][a-zA-Z0-9_]*'
+
+def t_NUMBER(t):
+ r'\d+'
+ try:
+ t.value = int(t.value)
+ except ValueError:
+ print("Integer value too large %s" % t.value)
+ t.value = 0
+ return t
+
+t_ignore = " \t"
+
+def t_newline(t):
+ r'\n+'
+ t.lexer.lineno += t.value.count("\n")
+
+def t_error(t):
+ print("Illegal character '%s'" % t.value[0])
+ t.lexer.skip(1)
+
+# Build the lexer
+lexer = lex.lex(optimize=True)
+
+
+
diff --git a/test/pkg_test4/parsing/calcparse.py b/test/pkg_test4/parsing/calcparse.py
new file mode 100644
index 0000000..c058e9f
--- /dev/null
+++ b/test/pkg_test4/parsing/calcparse.py
@@ -0,0 +1,66 @@
+# -----------------------------------------------------------------------------
+# yacc_simple.py
+#
+# A simple, properly specifier grammar
+# -----------------------------------------------------------------------------
+
+from .calclex import tokens
+from ply import yacc
+
+# Parsing rules
+precedence = (
+ ('left','PLUS','MINUS'),
+ ('left','TIMES','DIVIDE'),
+ ('right','UMINUS'),
+ )
+
+# dictionary of names
+names = { }
+
+def p_statement_assign(t):
+ 'statement : NAME EQUALS expression'
+ names[t[1]] = t[3]
+
+def p_statement_expr(t):
+ 'statement : expression'
+ t[0] = t[1]
+
+def p_expression_binop(t):
+ '''expression : expression PLUS expression
+ | expression MINUS expression
+ | expression TIMES expression
+ | expression DIVIDE expression'''
+ if t[2] == '+' : t[0] = t[1] + t[3]
+ elif t[2] == '-': t[0] = t[1] - t[3]
+ elif t[2] == '*': t[0] = t[1] * t[3]
+ elif t[2] == '/': t[0] = t[1] / t[3]
+
+def p_expression_uminus(t):
+ 'expression : MINUS expression %prec UMINUS'
+ t[0] = -t[2]
+
+def p_expression_group(t):
+ 'expression : LPAREN expression RPAREN'
+ t[0] = t[2]
+
+def p_expression_number(t):
+ 'expression : NUMBER'
+ t[0] = t[1]
+
+def p_expression_name(t):
+ 'expression : NAME'
+ try:
+ t[0] = names[t[1]]
+ except LookupError:
+ print("Undefined name '%s'" % t[1])
+ t[0] = 0
+
+def p_error(t):
+ print("Syntax error at '%s'" % t.value)
+
+parser = yacc.yacc()
+
+
+
+
+
diff --git a/test/testyacc.py b/test/testyacc.py
index e5223ae..90b0ebb 100644
--- a/test/testyacc.py
+++ b/test/testyacc.py
@@ -425,4 +425,12 @@ class YaccErrorWarningTests(unittest.TestCase):
r = parser.parse('3+4+5')
self.assertEqual(r, 12)
+ def test_pkg_test4(self):
+ from pkg_test4 import parser
+ self.assertFalse(os.path.exists('pkg_test4/parsing/parsetab.py'))
+ self.assertFalse(os.path.exists('pkg_test4/parsing/lextab.py'))
+ self.assertFalse(os.path.exists('pkg_test4/parsing/parser.out'))
+ r = parser.parse('3+4+5')
+ self.assertEqual(r, 12)
+
unittest.main()