summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/README8
-rw-r--r--test/calclex.py49
-rwxr-xr-xtest/cleanup.sh4
-rw-r--r--test/lex_closure.py54
-rw-r--r--test/lex_doc1.py26
-rw-r--r--test/lex_dup1.py29
-rw-r--r--test/lex_dup2.py33
-rw-r--r--test/lex_dup3.py31
-rw-r--r--test/lex_empty.py20
-rw-r--r--test/lex_error1.py24
-rw-r--r--test/lex_error2.py26
-rw-r--r--test/lex_error3.py27
-rw-r--r--test/lex_error4.py27
-rw-r--r--test/lex_hedit.py47
-rw-r--r--test/lex_ignore.py31
-rw-r--r--test/lex_ignore2.py29
-rw-r--r--test/lex_literal1.py25
-rw-r--r--test/lex_literal2.py25
-rw-r--r--test/lex_literal3.py26
-rw-r--r--test/lex_many_tokens.py27
-rw-r--r--test/lex_module.py10
-rw-r--r--test/lex_module_import.py42
-rw-r--r--test/lex_object.py55
-rw-r--r--test/lex_re1.py27
-rw-r--r--test/lex_re2.py27
-rw-r--r--test/lex_re3.py29
-rw-r--r--test/lex_rule1.py27
-rw-r--r--test/lex_rule2.py29
-rw-r--r--test/lex_rule3.py27
-rw-r--r--test/lex_state1.py40
-rw-r--r--test/lex_state2.py40
-rw-r--r--test/lex_state3.py42
-rw-r--r--test/lex_state4.py41
-rw-r--r--test/lex_state5.py40
-rw-r--r--test/lex_state_noerror.py39
-rw-r--r--test/lex_state_norule.py40
-rw-r--r--test/lex_state_try.py45
-rw-r--r--test/lex_token1.py19
-rw-r--r--test/lex_token2.py22
-rw-r--r--test/lex_token3.py24
-rw-r--r--test/lex_token4.py26
-rw-r--r--test/lex_token_dup.py29
-rw-r--r--test/test_cpp_nonascii.c2
-rw-r--r--test/testcpp.py153
-rwxr-xr-xtest/testlex.py402
-rw-r--r--test/testyacc.py404
-rw-r--r--test/yacc_badargs.py68
-rw-r--r--test/yacc_badid.py77
-rw-r--r--test/yacc_badprec.py64
-rw-r--r--test/yacc_badprec2.py68
-rw-r--r--test/yacc_badprec3.py68
-rw-r--r--test/yacc_badrule.py68
-rw-r--r--test/yacc_badtok.py68
-rw-r--r--test/yacc_dup.py68
-rw-r--r--test/yacc_error1.py68
-rw-r--r--test/yacc_error2.py68
-rw-r--r--test/yacc_error3.py67
-rw-r--r--test/yacc_error4.py72
-rw-r--r--test/yacc_error5.py94
-rw-r--r--test/yacc_error6.py80
-rw-r--r--test/yacc_error7.py80
-rw-r--r--test/yacc_inf.py56
-rw-r--r--test/yacc_literal.py69
-rw-r--r--test/yacc_misplaced.py68
-rw-r--r--test/yacc_missing1.py68
-rw-r--r--test/yacc_nested.py33
-rw-r--r--test/yacc_nodoc.py67
-rw-r--r--test/yacc_noerror.py66
-rw-r--r--test/yacc_nop.py68
-rw-r--r--test/yacc_notfunc.py66
-rw-r--r--test/yacc_notok.py67
-rw-r--r--test/yacc_prec1.py68
-rw-r--r--test/yacc_rr.py72
-rw-r--r--test/yacc_rr_unused.py30
-rw-r--r--test/yacc_simple.py68
-rw-r--r--test/yacc_sr.py63
-rw-r--r--test/yacc_term1.py68
-rw-r--r--test/yacc_unicode_literals.py70
-rw-r--r--test/yacc_unused.py77
-rw-r--r--test/yacc_unused_rule.py72
-rw-r--r--test/yacc_uprec.py63
-rw-r--r--test/yacc_uprec2.py63
82 files changed, 0 insertions, 4669 deletions
diff --git a/test/README b/test/README
deleted file mode 100644
index 03b167c..0000000
--- a/test/README
+++ /dev/null
@@ -1,8 +0,0 @@
-This directory mostly contains tests for various types of error
-conditions. To run:
-
- $ python testlex.py
- $ python testyacc.py
- $ python testcpp.py
-
-The script 'cleanup.sh' cleans up this directory to its original state.
diff --git a/test/calclex.py b/test/calclex.py
deleted file mode 100644
index 030a986..0000000
--- a/test/calclex.py
+++ /dev/null
@@ -1,49 +0,0 @@
-# -----------------------------------------------------------------------------
-# calclex.py
-# -----------------------------------------------------------------------------
-import sys
-
-if ".." not in sys.path: sys.path.insert(0,"..")
-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()
-
-
-
diff --git a/test/cleanup.sh b/test/cleanup.sh
deleted file mode 100755
index 9374f2c..0000000
--- a/test/cleanup.sh
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/sh
-
-rm -rf *~ *.pyc *.pyo *.dif *.out __pycache__
-
diff --git a/test/lex_closure.py b/test/lex_closure.py
deleted file mode 100644
index 30ee679..0000000
--- a/test/lex_closure.py
+++ /dev/null
@@ -1,54 +0,0 @@
-# -----------------------------------------------------------------------------
-# lex_closure.py
-# -----------------------------------------------------------------------------
-import sys
-
-if ".." not in sys.path: sys.path.insert(0,"..")
-import ply.lex as lex
-
-tokens = (
- 'NAME','NUMBER',
- 'PLUS','MINUS','TIMES','DIVIDE','EQUALS',
- 'LPAREN','RPAREN',
- )
-
-def make_calc():
-
- # 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.lineno += t.value.count("\n")
-
- def t_error(t):
- print("Illegal character '%s'" % t.value[0])
- t.lexer.skip(1)
-
- # Build the lexer
- return lex.lex()
-
-make_calc()
-lex.runmain(data="3+4")
-
-
-
diff --git a/test/lex_doc1.py b/test/lex_doc1.py
deleted file mode 100644
index 8a2bfcc..0000000
--- a/test/lex_doc1.py
+++ /dev/null
@@ -1,26 +0,0 @@
-# lex_doc1.py
-#
-# Missing documentation string
-
-import sys
-if ".." not in sys.path: sys.path.insert(0,"..")
-
-import ply.lex as lex
-
-tokens = [
- "PLUS",
- "MINUS",
- "NUMBER",
- ]
-
-t_PLUS = r'\+'
-t_MINUS = r'-'
-def t_NUMBER(t):
- pass
-
-def t_error(t):
- pass
-
-lex.lex()
-
-
diff --git a/test/lex_dup1.py b/test/lex_dup1.py
deleted file mode 100644
index fd04cdb..0000000
--- a/test/lex_dup1.py
+++ /dev/null
@@ -1,29 +0,0 @@
-# lex_dup1.py
-#
-# Duplicated rule specifiers
-
-import sys
-if ".." not in sys.path: sys.path.insert(0,"..")
-
-import ply.lex as lex
-
-tokens = [
- "PLUS",
- "MINUS",
- "NUMBER",
- ]
-
-t_PLUS = r'\+'
-t_MINUS = r'-'
-t_NUMBER = r'\d+'
-
-t_NUMBER = r'\d+'
-
-def t_error(t):
- pass
-
-
-
-lex.lex()
-
-
diff --git a/test/lex_dup2.py b/test/lex_dup2.py
deleted file mode 100644
index 870e5e7..0000000
--- a/test/lex_dup2.py
+++ /dev/null
@@ -1,33 +0,0 @@
-# lex_dup2.py
-#
-# Duplicated rule specifiers
-
-import sys
-if ".." not in sys.path: sys.path.insert(0,"..")
-
-import ply.lex as lex
-
-tokens = [
- "PLUS",
- "MINUS",
- "NUMBER",
- ]
-
-t_PLUS = r'\+'
-t_MINUS = r'-'
-def t_NUMBER(t):
- r'\d+'
- pass
-
-def t_NUMBER(t):
- r'\d+'
- pass
-
-def t_error(t):
- pass
-
-
-
-lex.lex()
-
-
diff --git a/test/lex_dup3.py b/test/lex_dup3.py
deleted file mode 100644
index 94b5592..0000000
--- a/test/lex_dup3.py
+++ /dev/null
@@ -1,31 +0,0 @@
-# lex_dup3.py
-#
-# Duplicated rule specifiers
-
-import sys
-if ".." not in sys.path: sys.path.insert(0,"..")
-
-import ply.lex as lex
-
-tokens = [
- "PLUS",
- "MINUS",
- "NUMBER",
- ]
-
-t_PLUS = r'\+'
-t_MINUS = r'-'
-t_NUMBER = r'\d+'
-
-def t_NUMBER(t):
- r'\d+'
- pass
-
-def t_error(t):
- pass
-
-
-
-lex.lex()
-
-
diff --git a/test/lex_empty.py b/test/lex_empty.py
deleted file mode 100644
index e0368bf..0000000
--- a/test/lex_empty.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# lex_empty.py
-#
-# No rules defined
-
-import sys
-if ".." not in sys.path: sys.path.insert(0,"..")
-
-import ply.lex as lex
-
-tokens = [
- "PLUS",
- "MINUS",
- "NUMBER",
- ]
-
-
-
-lex.lex()
-
-
diff --git a/test/lex_error1.py b/test/lex_error1.py
deleted file mode 100644
index 4508a80..0000000
--- a/test/lex_error1.py
+++ /dev/null
@@ -1,24 +0,0 @@
-# lex_error1.py
-#
-# Missing t_error() rule
-
-import sys
-if ".." not in sys.path: sys.path.insert(0,"..")
-
-import ply.lex as lex
-
-tokens = [
- "PLUS",
- "MINUS",
- "NUMBER",
- ]
-
-t_PLUS = r'\+'
-t_MINUS = r'-'
-t_NUMBER = r'\d+'
-
-
-
-lex.lex()
-
-
diff --git a/test/lex_error2.py b/test/lex_error2.py
deleted file mode 100644
index 8040d39..0000000
--- a/test/lex_error2.py
+++ /dev/null
@@ -1,26 +0,0 @@
-# lex_error2.py
-#
-# t_error defined, but not function
-
-import sys
-if ".." not in sys.path: sys.path.insert(0,"..")
-
-import ply.lex as lex
-
-tokens = [
- "PLUS",
- "MINUS",
- "NUMBER",
- ]
-
-t_PLUS = r'\+'
-t_MINUS = r'-'
-t_NUMBER = r'\d+'
-
-t_error = "foo"
-
-
-
-lex.lex()
-
-
diff --git a/test/lex_error3.py b/test/lex_error3.py
deleted file mode 100644
index 1feefb6..0000000
--- a/test/lex_error3.py
+++ /dev/null
@@ -1,27 +0,0 @@
-# lex_error3.py
-#
-# t_error defined as function, but with wrong # args
-
-import sys
-if ".." not in sys.path: sys.path.insert(0,"..")
-
-import ply.lex as lex
-
-tokens = [
- "PLUS",
- "MINUS",
- "NUMBER",
- ]
-
-t_PLUS = r'\+'
-t_MINUS = r'-'
-t_NUMBER = r'\d+'
-
-def t_error():
- pass
-
-
-
-lex.lex()
-
-
diff --git a/test/lex_error4.py b/test/lex_error4.py
deleted file mode 100644
index f4f48db..0000000
--- a/test/lex_error4.py
+++ /dev/null
@@ -1,27 +0,0 @@
-# lex_error4.py
-#
-# t_error defined as function, but too many args
-
-import sys
-if ".." not in sys.path: sys.path.insert(0,"..")
-
-import ply.lex as lex
-
-tokens = [
- "PLUS",
- "MINUS",
- "NUMBER",
- ]
-
-t_PLUS = r'\+'
-t_MINUS = r'-'
-t_NUMBER = r'\d+'
-
-def t_error(t,s):
- pass
-
-
-
-lex.lex()
-
-
diff --git a/test/lex_hedit.py b/test/lex_hedit.py
deleted file mode 100644
index 34f15a1..0000000
--- a/test/lex_hedit.py
+++ /dev/null
@@ -1,47 +0,0 @@
-# -----------------------------------------------------------------------------
-# hedit.py
-#
-# Paring of Fortran H Edit descriptions (Contributed by Pearu Peterson)
-#
-# These tokens can't be easily tokenized because they are of the following
-# form:
-#
-# nHc1...cn
-#
-# where n is a positive integer and c1 ... cn are characters.
-#
-# This example shows how to modify the state of the lexer to parse
-# such tokens
-# -----------------------------------------------------------------------------
-import sys
-if ".." not in sys.path: sys.path.insert(0,"..")
-
-import ply.lex as lex
-
-tokens = (
- 'H_EDIT_DESCRIPTOR',
- )
-
-# Tokens
-t_ignore = " \t\n"
-
-def t_H_EDIT_DESCRIPTOR(t):
- r"\d+H.*" # This grabs all of the remaining text
- i = t.value.index('H')
- n = eval(t.value[:i])
-
- # Adjust the tokenizing position
- t.lexer.lexpos -= len(t.value) - (i+1+n)
- t.value = t.value[i+1:i+1+n]
- return t
-
-def t_error(t):
- print("Illegal character '%s'" % t.value[0])
- t.lexer.skip(1)
-
-# Build the lexer
-lex.lex()
-lex.runmain(data="3Habc 10Habcdefghij 2Hxy")
-
-
-
diff --git a/test/lex_ignore.py b/test/lex_ignore.py
deleted file mode 100644
index 6c43b4c..0000000
--- a/test/lex_ignore.py
+++ /dev/null
@@ -1,31 +0,0 @@
-# lex_ignore.py
-#
-# Improperly specific ignore declaration
-
-import sys
-if ".." not in sys.path: sys.path.insert(0,"..")
-
-import ply.lex as lex
-
-tokens = [
- "PLUS",
- "MINUS",
- "NUMBER",
- ]
-
-t_PLUS = r'\+'
-t_MINUS = r'-'
-t_NUMBER = r'\d+'
-
-def t_ignore(t):
- ' \t'
- pass
-
-def t_error(t):
- pass
-
-import sys
-
-lex.lex()
-
-
diff --git a/test/lex_ignore2.py b/test/lex_ignore2.py
deleted file mode 100644
index f60987a..0000000
--- a/test/lex_ignore2.py
+++ /dev/null
@@ -1,29 +0,0 @@
-# lex_ignore2.py
-#
-# ignore declaration as a raw string
-
-import sys
-if ".." not in sys.path: sys.path.insert(0,"..")
-
-import ply.lex as lex
-
-tokens = [
- "PLUS",
- "MINUS",
- "NUMBER",
- ]
-
-t_PLUS = r'\+'
-t_MINUS = r'-'
-t_NUMBER = r'\d+'
-
-t_ignore = r' \t'
-
-def t_error(t):
- pass
-
-
-
-lex.lex()
-
-
diff --git a/test/lex_literal1.py b/test/lex_literal1.py
deleted file mode 100644
index db389c3..0000000
--- a/test/lex_literal1.py
+++ /dev/null
@@ -1,25 +0,0 @@
-# lex_literal1.py
-#
-# Bad literal specification
-
-import sys
-if ".." not in sys.path: sys.path.insert(0,"..")
-
-import ply.lex as lex
-
-tokens = [
- "NUMBER",
- ]
-
-literals = ["+","-","**"]
-
-def t_NUMBER(t):
- r'\d+'
- return t
-
-def t_error(t):
- pass
-
-lex.lex()
-
-
diff --git a/test/lex_literal2.py b/test/lex_literal2.py
deleted file mode 100644
index b50b92c..0000000
--- a/test/lex_literal2.py
+++ /dev/null
@@ -1,25 +0,0 @@
-# lex_literal2.py
-#
-# Bad literal specification
-
-import sys
-if ".." not in sys.path: sys.path.insert(0,"..")
-
-import ply.lex as lex
-
-tokens = [
- "NUMBER",
- ]
-
-literals = 23
-
-def t_NUMBER(t):
- r'\d+'
- return t
-
-def t_error(t):
- pass
-
-lex.lex()
-
-
diff --git a/test/lex_literal3.py b/test/lex_literal3.py
deleted file mode 100644
index 91ab980..0000000
--- a/test/lex_literal3.py
+++ /dev/null
@@ -1,26 +0,0 @@
-# lex_literal3.py
-#
-# An empty literal specification given as a list
-# Issue 8 : Literals empty list causes IndexError
-
-import sys
-if ".." not in sys.path: sys.path.insert(0,"..")
-
-import ply.lex as lex
-
-tokens = [
- "NUMBER",
- ]
-
-literals = []
-
-def t_NUMBER(t):
- r'\d+'
- return t
-
-def t_error(t):
- pass
-
-lex.lex()
-
-
diff --git a/test/lex_many_tokens.py b/test/lex_many_tokens.py
deleted file mode 100644
index 81ae57a..0000000
--- a/test/lex_many_tokens.py
+++ /dev/null
@@ -1,27 +0,0 @@
-# lex_many_tokens.py
-#
-# Test lex's ability to handle a large number of tokens (beyond the
-# 100-group limit of the re module)
-
-import sys
-if ".." not in sys.path: sys.path.insert(0,"..")
-
-import ply.lex as lex
-
-tokens = ["TOK%d" % i for i in range(1000)]
-
-for tok in tokens:
- if sys.version_info[0] < 3:
- exec("t_%s = '%s:'" % (tok,tok))
- else:
- exec("t_%s = '%s:'" % (tok,tok), globals())
-
-t_ignore = " \t"
-
-def t_error(t):
- pass
-
-lex.lex()
-lex.runmain(data="TOK34: TOK143: TOK269: TOK372: TOK452: TOK561: TOK999:")
-
-
diff --git a/test/lex_module.py b/test/lex_module.py
deleted file mode 100644
index 8bdd3ed..0000000
--- a/test/lex_module.py
+++ /dev/null
@@ -1,10 +0,0 @@
-# lex_module.py
-#
-
-import sys
-if ".." not in sys.path: sys.path.insert(0,"..")
-
-import ply.lex as lex
-import lex_module_import
-lex.lex(module=lex_module_import)
-lex.runmain(data="3+4")
diff --git a/test/lex_module_import.py b/test/lex_module_import.py
deleted file mode 100644
index df42082..0000000
--- a/test/lex_module_import.py
+++ /dev/null
@@ -1,42 +0,0 @@
-# -----------------------------------------------------------------------------
-# lex_module_import.py
-#
-# A lexer defined in a module, but built in lex_module.py
-# -----------------------------------------------------------------------------
-
-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.lineno += t.value.count("\n")
-
-def t_error(t):
- print("Illegal character '%s'" % t.value[0])
- t.lexer.skip(1)
-
diff --git a/test/lex_object.py b/test/lex_object.py
deleted file mode 100644
index 7e9f389..0000000
--- a/test/lex_object.py
+++ /dev/null
@@ -1,55 +0,0 @@
-# -----------------------------------------------------------------------------
-# lex_object.py
-# -----------------------------------------------------------------------------
-import sys
-
-if ".." not in sys.path: sys.path.insert(0,"..")
-import ply.lex as lex
-
-class CalcLexer:
- 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(self,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(self,t):
- r'\n+'
- t.lineno += t.value.count("\n")
-
- def t_error(self,t):
- print("Illegal character '%s'" % t.value[0])
- t.lexer.skip(1)
-
-
-calc = CalcLexer()
-
-# Build the lexer
-lex.lex(object=calc)
-lex.runmain(data="3+4")
-
-
-
-
diff --git a/test/lex_re1.py b/test/lex_re1.py
deleted file mode 100644
index 5be7aef..0000000
--- a/test/lex_re1.py
+++ /dev/null
@@ -1,27 +0,0 @@
-# lex_re1.py
-#
-# Bad regular expression in a string
-
-import sys
-if ".." not in sys.path: sys.path.insert(0,"..")
-
-import ply.lex as lex
-
-tokens = [
- "PLUS",
- "MINUS",
- "NUMBER",
- ]
-
-t_PLUS = r'\+'
-t_MINUS = r'-'
-t_NUMBER = r'(\d+'
-
-def t_error(t):
- pass
-
-
-
-lex.lex()
-
-
diff --git a/test/lex_re2.py b/test/lex_re2.py
deleted file mode 100644
index 8dfb8e3..0000000
--- a/test/lex_re2.py
+++ /dev/null
@@ -1,27 +0,0 @@
-# lex_re2.py
-#
-# Regular expression rule matches empty string
-
-import sys
-if ".." not in sys.path: sys.path.insert(0,"..")
-
-import ply.lex as lex
-
-tokens = [
- "PLUS",
- "MINUS",
- "NUMBER",
- ]
-
-t_PLUS = r'\+?'
-t_MINUS = r'-'
-t_NUMBER = r'(\d+)'
-
-def t_error(t):
- pass
-
-
-
-lex.lex()
-
-
diff --git a/test/lex_re3.py b/test/lex_re3.py
deleted file mode 100644
index e179925..0000000
--- a/test/lex_re3.py
+++ /dev/null
@@ -1,29 +0,0 @@
-# lex_re3.py
-#
-# Regular expression rule matches empty string
-
-import sys
-if ".." not in sys.path: sys.path.insert(0,"..")
-
-import ply.lex as lex
-
-tokens = [
- "PLUS",
- "MINUS",
- "NUMBER",
- "POUND",
- ]
-
-t_PLUS = r'\+'
-t_MINUS = r'-'
-t_NUMBER = r'(\d+)'
-t_POUND = r'#'
-
-def t_error(t):
- pass
-
-
-
-lex.lex()
-
-
diff --git a/test/lex_rule1.py b/test/lex_rule1.py
deleted file mode 100644
index 0406c6f..0000000
--- a/test/lex_rule1.py
+++ /dev/null
@@ -1,27 +0,0 @@
-# lex_rule1.py
-#
-# Rule function with incorrect number of arguments
-
-import sys
-if ".." not in sys.path: sys.path.insert(0,"..")
-
-import ply.lex as lex
-
-tokens = [
- "PLUS",
- "MINUS",
- "NUMBER",
- ]
-
-t_PLUS = r'\+'
-t_MINUS = r'-'
-t_NUMBER = 1
-
-def t_error(t):
- pass
-
-
-
-lex.lex()
-
-
diff --git a/test/lex_rule2.py b/test/lex_rule2.py
deleted file mode 100644
index 1c29d87..0000000
--- a/test/lex_rule2.py
+++ /dev/null
@@ -1,29 +0,0 @@
-# lex_rule2.py
-#
-# Rule function with incorrect number of arguments
-
-import sys
-if ".." not in sys.path: sys.path.insert(0,"..")
-
-import ply.lex as lex
-
-tokens = [
- "PLUS",
- "MINUS",
- "NUMBER",
- ]
-
-t_PLUS = r'\+'
-t_MINUS = r'-'
-def t_NUMBER():
- r'\d+'
- return t
-
-def t_error(t):
- pass
-
-
-
-lex.lex()
-
-
diff --git a/test/lex_rule3.py b/test/lex_rule3.py
deleted file mode 100644
index 9ea94da..0000000
--- a/test/lex_rule3.py
+++ /dev/null
@@ -1,27 +0,0 @@
-# lex_rule3.py
-#
-# Rule function with incorrect number of arguments
-
-import sys
-if ".." not in sys.path: sys.path.insert(0,"..")
-
-import ply.lex as lex
-
-tokens = [
- "PLUS",
- "MINUS",
- "NUMBER",
- ]
-
-t_PLUS = r'\+'
-t_MINUS = r'-'
-def t_NUMBER(t,s):
- r'\d+'
- return t
-
-def t_error(t):
- pass
-
-lex.lex()
-
-
diff --git a/test/lex_state1.py b/test/lex_state1.py
deleted file mode 100644
index 7528c91..0000000
--- a/test/lex_state1.py
+++ /dev/null
@@ -1,40 +0,0 @@
-# lex_state1.py
-#
-# Bad state declaration
-
-import sys
-if ".." not in sys.path: sys.path.insert(0,"..")
-
-import ply.lex as lex
-
-tokens = [
- "PLUS",
- "MINUS",
- "NUMBER",
- ]
-
-states = 'comment'
-
-t_PLUS = r'\+'
-t_MINUS = r'-'
-t_NUMBER = r'\d+'
-
-# Comments
-def t_comment(t):
- r'/\*'
- t.lexer.begin('comment')
- print("Entering comment state")
-
-def t_comment_body_part(t):
- r'(.|\n)*\*/'
- print("comment body %s" % t)
- t.lexer.begin('INITIAL')
-
-def t_error(t):
- pass
-
-
-
-lex.lex()
-
-
diff --git a/test/lex_state2.py b/test/lex_state2.py
deleted file mode 100644
index 3aef69e..0000000
--- a/test/lex_state2.py
+++ /dev/null
@@ -1,40 +0,0 @@
-# lex_state2.py
-#
-# Bad state declaration
-
-import sys
-if ".." not in sys.path: sys.path.insert(0,"..")
-
-import ply.lex as lex
-
-tokens = [
- "PLUS",
- "MINUS",
- "NUMBER",
- ]
-
-states = ('comment','example')
-
-t_PLUS = r'\+'
-t_MINUS = r'-'
-t_NUMBER = r'\d+'
-
-# Comments
-def t_comment(t):
- r'/\*'
- t.lexer.begin('comment')
- print("Entering comment state")
-
-def t_comment_body_part(t):
- r'(.|\n)*\*/'
- print("comment body %s" % t)
- t.lexer.begin('INITIAL')
-
-def t_error(t):
- pass
-
-
-
-lex.lex()
-
-
diff --git a/test/lex_state3.py b/test/lex_state3.py
deleted file mode 100644
index 616e484..0000000
--- a/test/lex_state3.py
+++ /dev/null
@@ -1,42 +0,0 @@
-# lex_state3.py
-#
-# Bad state declaration
-
-import sys
-if ".." not in sys.path: sys.path.insert(0,"..")
-
-import ply.lex as lex
-
-tokens = [
- "PLUS",
- "MINUS",
- "NUMBER",
- ]
-
-comment = 1
-states = ((comment, 'inclusive'),
- ('example', 'exclusive'))
-
-t_PLUS = r'\+'
-t_MINUS = r'-'
-t_NUMBER = r'\d+'
-
-# Comments
-def t_comment(t):
- r'/\*'
- t.lexer.begin('comment')
- print("Entering comment state")
-
-def t_comment_body_part(t):
- r'(.|\n)*\*/'
- print("comment body %s" % t)
- t.lexer.begin('INITIAL')
-
-def t_error(t):
- pass
-
-
-
-lex.lex()
-
-
diff --git a/test/lex_state4.py b/test/lex_state4.py
deleted file mode 100644
index 1825016..0000000
--- a/test/lex_state4.py
+++ /dev/null
@@ -1,41 +0,0 @@
-# lex_state4.py
-#
-# Bad state declaration
-
-import sys
-if ".." not in sys.path: sys.path.insert(0,"..")
-
-import ply.lex as lex
-
-tokens = [
- "PLUS",
- "MINUS",
- "NUMBER",
- ]
-
-
-states = (('comment', 'exclsive'),)
-
-t_PLUS = r'\+'
-t_MINUS = r'-'
-t_NUMBER = r'\d+'
-
-# Comments
-def t_comment(t):
- r'/\*'
- t.lexer.begin('comment')
- print("Entering comment state")
-
-def t_comment_body_part(t):
- r'(.|\n)*\*/'
- print("comment body %s" % t)
- t.lexer.begin('INITIAL')
-
-def t_error(t):
- pass
-
-
-
-lex.lex()
-
-
diff --git a/test/lex_state5.py b/test/lex_state5.py
deleted file mode 100644
index 4ce828e..0000000
--- a/test/lex_state5.py
+++ /dev/null
@@ -1,40 +0,0 @@
-# lex_state5.py
-#
-# Bad state declaration
-
-import sys
-if ".." not in sys.path: sys.path.insert(0,"..")
-
-import ply.lex as lex
-
-tokens = [
- "PLUS",
- "MINUS",
- "NUMBER",
- ]
-
-states = (('comment', 'exclusive'),
- ('comment', 'exclusive'))
-
-t_PLUS = r'\+'
-t_MINUS = r'-'
-t_NUMBER = r'\d+'
-
-# Comments
-def t_comment(t):
- r'/\*'
- t.lexer.begin('comment')
- print("Entering comment state")
-
-def t_comment_body_part(t):
- r'(.|\n)*\*/'
- print("comment body %s" % t)
- t.lexer.begin('INITIAL')
-
-def t_error(t):
- pass
-
-
-lex.lex()
-
-
diff --git a/test/lex_state_noerror.py b/test/lex_state_noerror.py
deleted file mode 100644
index 90bbea8..0000000
--- a/test/lex_state_noerror.py
+++ /dev/null
@@ -1,39 +0,0 @@
-# lex_state_noerror.py
-#
-# Declaration of a state for which no rules are defined
-
-import sys
-if ".." not in sys.path: sys.path.insert(0,"..")
-
-import ply.lex as lex
-
-tokens = [
- "PLUS",
- "MINUS",
- "NUMBER",
- ]
-
-states = (('comment', 'exclusive'),)
-
-t_PLUS = r'\+'
-t_MINUS = r'-'
-t_NUMBER = r'\d+'
-
-# Comments
-def t_comment(t):
- r'/\*'
- t.lexer.begin('comment')
- print("Entering comment state")
-
-def t_comment_body_part(t):
- r'(.|\n)*\*/'
- print("comment body %s" % t)
- t.lexer.begin('INITIAL')
-
-def t_error(t):
- pass
-
-
-lex.lex()
-
-
diff --git a/test/lex_state_norule.py b/test/lex_state_norule.py
deleted file mode 100644
index 64ec6d3..0000000
--- a/test/lex_state_norule.py
+++ /dev/null
@@ -1,40 +0,0 @@
-# lex_state_norule.py
-#
-# Declaration of a state for which no rules are defined
-
-import sys
-if ".." not in sys.path: sys.path.insert(0,"..")
-
-import ply.lex as lex
-
-tokens = [
- "PLUS",
- "MINUS",
- "NUMBER",
- ]
-
-states = (('comment', 'exclusive'),
- ('example', 'exclusive'))
-
-t_PLUS = r'\+'
-t_MINUS = r'-'
-t_NUMBER = r'\d+'
-
-# Comments
-def t_comment(t):
- r'/\*'
- t.lexer.begin('comment')
- print("Entering comment state")
-
-def t_comment_body_part(t):
- r'(.|\n)*\*/'
- print("comment body %s" % t)
- t.lexer.begin('INITIAL')
-
-def t_error(t):
- pass
-
-
-lex.lex()
-
-
diff --git a/test/lex_state_try.py b/test/lex_state_try.py
deleted file mode 100644
index fd5ba22..0000000
--- a/test/lex_state_try.py
+++ /dev/null
@@ -1,45 +0,0 @@
-# lex_state_try.py
-#
-# Declaration of a state for which no rules are defined
-
-import sys
-if ".." not in sys.path: sys.path.insert(0,"..")
-
-import ply.lex as lex
-
-tokens = [
- "PLUS",
- "MINUS",
- "NUMBER",
- ]
-
-states = (('comment', 'exclusive'),)
-
-t_PLUS = r'\+'
-t_MINUS = r'-'
-t_NUMBER = r'\d+'
-
-t_ignore = " \t"
-
-# Comments
-def t_comment(t):
- r'/\*'
- t.lexer.begin('comment')
- print("Entering comment state")
-
-def t_comment_body_part(t):
- r'(.|\n)*\*/'
- print("comment body %s" % t)
- t.lexer.begin('INITIAL')
-
-def t_error(t):
- pass
-
-t_comment_error = t_error
-t_comment_ignore = t_ignore
-
-lex.lex()
-
-data = "3 + 4 /* This is a comment */ + 10"
-
-lex.runmain(data=data)
diff --git a/test/lex_token1.py b/test/lex_token1.py
deleted file mode 100644
index 6fca300..0000000
--- a/test/lex_token1.py
+++ /dev/null
@@ -1,19 +0,0 @@
-# lex_token1.py
-#
-# Tests for absence of tokens variable
-
-import sys
-if ".." not in sys.path: sys.path.insert(0,"..")
-
-import ply.lex as lex
-
-t_PLUS = r'\+'
-t_MINUS = r'-'
-t_NUMBER = r'\d+'
-
-def t_error(t):
- pass
-
-lex.lex()
-
-
diff --git a/test/lex_token2.py b/test/lex_token2.py
deleted file mode 100644
index 6e65ab0..0000000
--- a/test/lex_token2.py
+++ /dev/null
@@ -1,22 +0,0 @@
-# lex_token2.py
-#
-# Tests for tokens of wrong type
-
-import sys
-if ".." not in sys.path: sys.path.insert(0,"..")
-
-import ply.lex as lex
-
-tokens = "PLUS MINUS NUMBER"
-
-t_PLUS = r'\+'
-t_MINUS = r'-'
-t_NUMBER = r'\d+'
-
-def t_error(t):
- pass
-
-
-lex.lex()
-
-
diff --git a/test/lex_token3.py b/test/lex_token3.py
deleted file mode 100644
index 636452e..0000000
--- a/test/lex_token3.py
+++ /dev/null
@@ -1,24 +0,0 @@
-# lex_token3.py
-#
-# tokens is right type, but is missing a token for one rule
-
-import sys
-if ".." not in sys.path: sys.path.insert(0,"..")
-
-import ply.lex as lex
-
-tokens = [
- "PLUS",
- "NUMBER",
- ]
-
-t_PLUS = r'\+'
-t_MINUS = r'-'
-t_NUMBER = r'\d+'
-
-def t_error(t):
- pass
-
-lex.lex()
-
-
diff --git a/test/lex_token4.py b/test/lex_token4.py
deleted file mode 100644
index 52947e9..0000000
--- a/test/lex_token4.py
+++ /dev/null
@@ -1,26 +0,0 @@
-# lex_token4.py
-#
-# Bad token name
-
-import sys
-if ".." not in sys.path: sys.path.insert(0,"..")
-
-import ply.lex as lex
-
-tokens = [
- "PLUS",
- "MINUS",
- "-",
- "NUMBER",
- ]
-
-t_PLUS = r'\+'
-t_MINUS = r'-'
-t_NUMBER = r'\d+'
-
-def t_error(t):
- pass
-
-lex.lex()
-
-
diff --git a/test/lex_token_dup.py b/test/lex_token_dup.py
deleted file mode 100644
index 384f4e9..0000000
--- a/test/lex_token_dup.py
+++ /dev/null
@@ -1,29 +0,0 @@
-# lex_token_dup.py
-#
-# Duplicate token name in tokens
-
-import sys
-if ".." not in sys.path: sys.path.insert(0,"..")
-
-import ply.lex as lex
-
-tokens = [
- "PLUS",
- "MINUS",
- "NUMBER",
- "MINUS"
- ]
-
-t_PLUS = r'\+'
-t_MINUS = r'-'
-
-def t_NUMBER(t):
- r'\d+'
- return t
-
-def t_error(t):
- pass
-
-lex.lex()
-
-
diff --git a/test/test_cpp_nonascii.c b/test/test_cpp_nonascii.c
deleted file mode 100644
index 3e97d81..0000000
--- a/test/test_cpp_nonascii.c
+++ /dev/null
@@ -1,2 +0,0 @@
-/* ë */
-#define x 1 \ No newline at end of file
diff --git a/test/testcpp.py b/test/testcpp.py
deleted file mode 100644
index dbfb3e4..0000000
--- a/test/testcpp.py
+++ /dev/null
@@ -1,153 +0,0 @@
-from unittest import TestCase, main
-
-from multiprocessing import Process, Queue
-from six.moves.queue import Empty
-
-import sys
-import locale
-
-if ".." not in sys.path:
- sys.path.insert(0, "..")
-
-from ply.lex import lex
-from ply.cpp import *
-
-
-def preprocessing(in_, out_queue):
- out = None
-
- try:
- p = Preprocessor(lex())
- p.parse(in_)
- tokens = [t.value for t in p.parser]
- out = "".join(tokens)
- finally:
- out_queue.put(out)
-
-class CPPTests(TestCase):
- "Tests related to ANSI-C style lexical preprocessor."
-
- def __test_preprocessing(self, in_, expected, time_limit = 1.0):
- out_queue = Queue()
-
- preprocessor = Process(
- name = "PLY`s C preprocessor",
- target = preprocessing,
- args = (in_, out_queue)
- )
-
- preprocessor.start()
-
- try:
- out = out_queue.get(timeout = time_limit)
- except Empty:
- preprocessor.terminate()
- raise RuntimeError("Time limit exceeded!")
- else:
- self.assertMultiLineEqual(out, expected)
-
- def test_infinite_argument_expansion(self):
- # CPP does not drags set of currently expanded macros through macro
- # arguments expansion. If there is a match between an argument value
- # and name of an already expanded macro then CPP falls into infinite
- # recursion.
- self.__test_preprocessing("""\
-#define a(x) x
-#define b a(b)
-b
-""" , """\
-
-
-b"""
- )
-
-
- def test_concatenation(self):
- self.__test_preprocessing("""\
-#define a(x) x##_
-#define b(x) _##x
-#define c(x) _##x##_
-#define d(x,y) _##x##y##_
-
-a(i)
-b(j)
-c(k)
-d(q,s)"""
- , """\
-
-
-
-
-
-i_
-_j
-_k_
-_qs_"""
- )
-
- def test_deadloop_macro(self):
- # If there is a word which equals to name of a parametrized macro, then
- # attempt to expand such word as a macro manages the parser to fall
- # into an infinite loop.
-
- self.__test_preprocessing("""\
-#define a(x) x
-
-a;"""
- , """\
-
-
-a;"""
- )
-
- def test_index_error(self):
- # If there are no tokens after a word ("a") which equals to name of
- # a parameterized macro, then attempt to expand this word leads to
- # IndexError.
-
- self.__test_preprocessing("""\
-#define a(x) x
-
-a"""
- , """\
-
-
-a"""
- )
-
- def test_evalexpr(self):
- # #if 1 != 2 is not processed correctly; undefined values are converted
- # to 0L instead of 0 (issue #195)
- #
- self.__test_preprocessing("""\
-#if (1!=0) && (!x || (!(1==2)))
-a;
-#else
-b;
-#endif
-"""
- , """\
-
-a;
-
-"""
- )
-
- def test_include_nonascii(self):
- # Issue #196: #included files are read using the current locale's
- # getdefaultencoding. if a #included file contains non-ascii characters,
- # while default encoding is e.g. US_ASCII, this causes an error
- locale.setlocale(locale.LC_ALL, 'C')
- self.__test_preprocessing("""\
-#include "test_cpp_nonascii.c"
-x;
-
-"""
- , """\
-
-
-1;
-"""
- )
-
-main()
diff --git a/test/testlex.py b/test/testlex.py
deleted file mode 100755
index a41fda8..0000000
--- a/test/testlex.py
+++ /dev/null
@@ -1,402 +0,0 @@
-# testlex.py
-
-import unittest
-try:
- import StringIO
-except ImportError:
- import io as StringIO
-
-import sys
-import os
-import warnings
-import platform
-
-sys.path.insert(0,"..")
-sys.tracebacklimit = 0
-
-import ply.lex
-
-try:
- from importlib.util import cache_from_source
-except ImportError:
- # Python 2.7, but we don't care.
- cache_from_source = None
-
-
-def make_pymodule_path(filename, optimization=None):
- path = os.path.dirname(filename)
- file = os.path.basename(filename)
- mod, ext = os.path.splitext(file)
-
- if sys.hexversion >= 0x3050000:
- fullpath = cache_from_source(filename, optimization=optimization)
- elif sys.hexversion >= 0x3040000:
- fullpath = cache_from_source(filename, ext=='.pyc')
- elif sys.hexversion >= 0x3020000:
- import imp
- modname = mod+"."+imp.get_tag()+ext
- fullpath = os.path.join(path,'__pycache__',modname)
- else:
- fullpath = filename
- return fullpath
-
-def pymodule_out_exists(filename, optimization=None):
- return os.path.exists(make_pymodule_path(filename,
- optimization=optimization))
-
-def pymodule_out_remove(filename, optimization=None):
- os.remove(make_pymodule_path(filename, optimization=optimization))
-
-def implementation():
- if platform.system().startswith("Java"):
- return "Jython"
- elif hasattr(sys, "pypy_version_info"):
- return "PyPy"
- else:
- return "CPython"
-
-test_pyo = (implementation() == 'CPython')
-
-def check_expected(result, expected, contains=False):
- if sys.version_info[0] >= 3:
- if isinstance(result,str):
- result = result.encode('ascii')
- if isinstance(expected,str):
- expected = expected.encode('ascii')
- resultlines = result.splitlines()
- expectedlines = expected.splitlines()
-
- if len(resultlines) != len(expectedlines):
- return False
-
- for rline,eline in zip(resultlines,expectedlines):
- if contains:
- if eline not in rline:
- return False
- else:
- if not rline.endswith(eline):
- return False
- return True
-
-def run_import(module):
- code = "import "+module
- exec(code)
- del sys.modules[module]
-
-# Tests related to errors and warnings when building lexers
-class LexErrorWarningTests(unittest.TestCase):
- def setUp(self):
- sys.stderr = StringIO.StringIO()
- sys.stdout = StringIO.StringIO()
- if sys.hexversion >= 0x3020000:
- warnings.filterwarnings('ignore',category=ResourceWarning)
-
- def tearDown(self):
- sys.stderr = sys.__stderr__
- sys.stdout = sys.__stdout__
- def test_lex_doc1(self):
- self.assertRaises(SyntaxError,run_import,"lex_doc1")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "lex_doc1.py:18: No regular expression defined for rule 't_NUMBER'\n"))
- def test_lex_dup1(self):
- self.assertRaises(SyntaxError,run_import,"lex_dup1")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "lex_dup1.py:20: Rule t_NUMBER redefined. Previously defined on line 18\n" ))
-
- def test_lex_dup2(self):
- self.assertRaises(SyntaxError,run_import,"lex_dup2")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "lex_dup2.py:22: Rule t_NUMBER redefined. Previously defined on line 18\n" ))
-
- def test_lex_dup3(self):
- self.assertRaises(SyntaxError,run_import,"lex_dup3")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "lex_dup3.py:20: Rule t_NUMBER redefined. Previously defined on line 18\n" ))
-
- def test_lex_empty(self):
- self.assertRaises(SyntaxError,run_import,"lex_empty")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "No rules of the form t_rulename are defined\n"
- "No rules defined for state 'INITIAL'\n"))
-
- def test_lex_error1(self):
- run_import("lex_error1")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "No t_error rule is defined\n"))
-
- def test_lex_error2(self):
- self.assertRaises(SyntaxError,run_import,"lex_error2")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "Rule 't_error' must be defined as a function\n")
- )
-
- def test_lex_error3(self):
- self.assertRaises(SyntaxError,run_import,"lex_error3")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "lex_error3.py:20: Rule 't_error' requires an argument\n"))
-
- def test_lex_error4(self):
- self.assertRaises(SyntaxError,run_import,"lex_error4")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "lex_error4.py:20: Rule 't_error' has too many arguments\n"))
-
- def test_lex_ignore(self):
- self.assertRaises(SyntaxError,run_import,"lex_ignore")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "lex_ignore.py:20: Rule 't_ignore' must be defined as a string\n"))
-
- def test_lex_ignore2(self):
- run_import("lex_ignore2")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "t_ignore contains a literal backslash '\\'\n"))
-
-
- def test_lex_re1(self):
- self.assertRaises(SyntaxError,run_import,"lex_re1")
- result = sys.stderr.getvalue()
- if sys.hexversion < 0x3050000:
- msg = "Invalid regular expression for rule 't_NUMBER'. unbalanced parenthesis\n"
- else:
- msg = "Invalid regular expression for rule 't_NUMBER'. missing ), unterminated subpattern at position 0"
- self.assertTrue(check_expected(result,
- msg,
- contains=True))
-
- def test_lex_re2(self):
- self.assertRaises(SyntaxError,run_import,"lex_re2")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "Regular expression for rule 't_PLUS' matches empty string\n"))
-
- def test_lex_re3(self):
- self.assertRaises(SyntaxError,run_import,"lex_re3")
- result = sys.stderr.getvalue()
-# self.assertTrue(check_expected(result,
-# "Invalid regular expression for rule 't_POUND'. unbalanced parenthesis\n"
-# "Make sure '#' in rule 't_POUND' is escaped with '\\#'\n"))
-
- if sys.hexversion < 0x3050000:
- msg = ("Invalid regular expression for rule 't_POUND'. unbalanced parenthesis\n"
- "Make sure '#' in rule 't_POUND' is escaped with '\\#'\n")
- else:
- msg = ("Invalid regular expression for rule 't_POUND'. missing ), unterminated subpattern at position 0\n"
- "ERROR: Make sure '#' in rule 't_POUND' is escaped with '\#'")
- self.assertTrue(check_expected(result,
- msg,
- contains=True), result)
-
- def test_lex_rule1(self):
- self.assertRaises(SyntaxError,run_import,"lex_rule1")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "t_NUMBER not defined as a function or string\n"))
-
- def test_lex_rule2(self):
- self.assertRaises(SyntaxError,run_import,"lex_rule2")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "lex_rule2.py:18: Rule 't_NUMBER' requires an argument\n"))
-
- def test_lex_rule3(self):
- self.assertRaises(SyntaxError,run_import,"lex_rule3")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "lex_rule3.py:18: Rule 't_NUMBER' has too many arguments\n"))
-
-
- def test_lex_state1(self):
- self.assertRaises(SyntaxError,run_import,"lex_state1")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "states must be defined as a tuple or list\n"))
-
- def test_lex_state2(self):
- self.assertRaises(SyntaxError,run_import,"lex_state2")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "Invalid state specifier 'comment'. Must be a tuple (statename,'exclusive|inclusive')\n"
- "Invalid state specifier 'example'. Must be a tuple (statename,'exclusive|inclusive')\n"))
-
- def test_lex_state3(self):
- self.assertRaises(SyntaxError,run_import,"lex_state3")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "State name 1 must be a string\n"
- "No rules defined for state 'example'\n"))
-
- def test_lex_state4(self):
- self.assertRaises(SyntaxError,run_import,"lex_state4")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "State type for state 'comment' must be 'inclusive' or 'exclusive'\n"))
-
-
- def test_lex_state5(self):
- self.assertRaises(SyntaxError,run_import,"lex_state5")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "State 'comment' already defined\n"))
-
- def test_lex_state_noerror(self):
- run_import("lex_state_noerror")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "No error rule is defined for exclusive state 'comment'\n"))
-
- def test_lex_state_norule(self):
- self.assertRaises(SyntaxError,run_import,"lex_state_norule")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "No rules defined for state 'example'\n"))
-
- def test_lex_token1(self):
- self.assertRaises(SyntaxError,run_import,"lex_token1")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "No token list is defined\n"
- "Rule 't_NUMBER' defined for an unspecified token NUMBER\n"
- "Rule 't_PLUS' defined for an unspecified token PLUS\n"
- "Rule 't_MINUS' defined for an unspecified token MINUS\n"
-))
-
- def test_lex_token2(self):
- self.assertRaises(SyntaxError,run_import,"lex_token2")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "tokens must be a list or tuple\n"
- "Rule 't_NUMBER' defined for an unspecified token NUMBER\n"
- "Rule 't_PLUS' defined for an unspecified token PLUS\n"
- "Rule 't_MINUS' defined for an unspecified token MINUS\n"
-))
-
- def test_lex_token3(self):
- self.assertRaises(SyntaxError,run_import,"lex_token3")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "Rule 't_MINUS' defined for an unspecified token MINUS\n"))
-
-
- def test_lex_token4(self):
- self.assertRaises(SyntaxError,run_import,"lex_token4")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "Bad token name '-'\n"))
-
-
- def test_lex_token_dup(self):
- run_import("lex_token_dup")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "Token 'MINUS' multiply defined\n"))
-
-
- def test_lex_literal1(self):
- self.assertRaises(SyntaxError,run_import,"lex_literal1")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "Invalid literal '**'. Must be a single character\n"))
-
- def test_lex_literal2(self):
- self.assertRaises(SyntaxError,run_import,"lex_literal2")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "Invalid literals specification. literals must be a sequence of characters\n"))
-
-import os
-import subprocess
-import shutil
-
-# Tests related to various build options associated with lexers
-class LexBuildOptionTests(unittest.TestCase):
- def setUp(self):
- sys.stderr = StringIO.StringIO()
- sys.stdout = StringIO.StringIO()
- def tearDown(self):
- sys.stderr = sys.__stderr__
- sys.stdout = sys.__stdout__
- try:
- shutil.rmtree("lexdir")
- except OSError:
- pass
-
- def test_lex_module(self):
- run_import("lex_module")
- result = sys.stdout.getvalue()
- self.assertTrue(check_expected(result,
- "(NUMBER,3,1,0)\n"
- "(PLUS,'+',1,1)\n"
- "(NUMBER,4,1,2)\n"))
-
- def test_lex_object(self):
- run_import("lex_object")
- result = sys.stdout.getvalue()
- self.assertTrue(check_expected(result,
- "(NUMBER,3,1,0)\n"
- "(PLUS,'+',1,1)\n"
- "(NUMBER,4,1,2)\n"))
-
- def test_lex_closure(self):
- run_import("lex_closure")
- result = sys.stdout.getvalue()
- self.assertTrue(check_expected(result,
- "(NUMBER,3,1,0)\n"
- "(PLUS,'+',1,1)\n"
- "(NUMBER,4,1,2)\n"))
-
- def test_lex_many_tokens(self):
- run_import("lex_many_tokens")
- result = sys.stdout.getvalue()
- self.assertTrue(check_expected(result,
- "(TOK34,'TOK34:',1,0)\n"
- "(TOK143,'TOK143:',1,7)\n"
- "(TOK269,'TOK269:',1,15)\n"
- "(TOK372,'TOK372:',1,23)\n"
- "(TOK452,'TOK452:',1,31)\n"
- "(TOK561,'TOK561:',1,39)\n"
- "(TOK999,'TOK999:',1,47)\n"
- ))
-
-# Tests related to run-time behavior of lexers
-class LexRunTests(unittest.TestCase):
- def setUp(self):
- sys.stderr = StringIO.StringIO()
- sys.stdout = StringIO.StringIO()
- def tearDown(self):
- sys.stderr = sys.__stderr__
- sys.stdout = sys.__stdout__
-
- def test_lex_hedit(self):
- run_import("lex_hedit")
- result = sys.stdout.getvalue()
- self.assertTrue(check_expected(result,
- "(H_EDIT_DESCRIPTOR,'abc',1,0)\n"
- "(H_EDIT_DESCRIPTOR,'abcdefghij',1,6)\n"
- "(H_EDIT_DESCRIPTOR,'xy',1,20)\n"))
-
- def test_lex_state_try(self):
- run_import("lex_state_try")
- result = sys.stdout.getvalue()
- self.assertTrue(check_expected(result,
- "(NUMBER,'3',1,0)\n"
- "(PLUS,'+',1,2)\n"
- "(NUMBER,'4',1,4)\n"
- "Entering comment state\n"
- "comment body LexToken(body_part,'This is a comment */',1,9)\n"
- "(PLUS,'+',1,30)\n"
- "(NUMBER,'10',1,32)\n"
- ))
-
-
-
-unittest.main()
diff --git a/test/testyacc.py b/test/testyacc.py
deleted file mode 100644
index c52d0ac..0000000
--- a/test/testyacc.py
+++ /dev/null
@@ -1,404 +0,0 @@
-# testyacc.py
-
-import unittest
-try:
- import StringIO
-except ImportError:
- import io as StringIO
-
-import sys
-import os
-import warnings
-import re
-import platform
-
-sys.path.insert(0,"..")
-sys.tracebacklimit = 0
-
-import ply.yacc
-
-def make_pymodule_path(filename):
- path = os.path.dirname(filename)
- file = os.path.basename(filename)
- mod, ext = os.path.splitext(file)
-
- if sys.hexversion >= 0x3040000:
- import importlib.util
- fullpath = importlib.util.cache_from_source(filename, ext=='.pyc')
- elif sys.hexversion >= 0x3020000:
- import imp
- modname = mod+"."+imp.get_tag()+ext
- fullpath = os.path.join(path,'__pycache__',modname)
- else:
- fullpath = filename
- return fullpath
-
-def pymodule_out_exists(filename):
- return os.path.exists(make_pymodule_path(filename))
-
-def pymodule_out_remove(filename):
- os.remove(make_pymodule_path(filename))
-
-def implementation():
- if platform.system().startswith("Java"):
- return "Jython"
- elif hasattr(sys, "pypy_version_info"):
- return "PyPy"
- else:
- return "CPython"
-
-# Check the output to see if it contains all of a set of expected output lines.
-# This alternate implementation looks weird, but is needed to properly handle
-# some variations in error message order that occurs due to dict hash table
-# randomization that was introduced in Python 3.3
-def check_expected(result, expected):
- # Normalize 'state n' text to account for randomization effects in Python 3.3
- expected = re.sub(r' state \d+', 'state <n>', expected)
- result = re.sub(r' state \d+', 'state <n>', result)
-
- resultlines = set()
- for line in result.splitlines():
- if line.startswith("WARNING: "):
- line = line[9:]
- elif line.startswith("ERROR: "):
- line = line[7:]
- resultlines.add(line)
-
- # Selectively remove expected lines from the output
- for eline in expected.splitlines():
- resultlines = set(line for line in resultlines if not line.endswith(eline))
-
- # Return True if no result lines remain
- return not bool(resultlines)
-
-def run_import(module):
- code = "import "+module
- exec(code)
- del sys.modules[module]
-
-# Tests related to errors and warnings when building parsers
-class YaccErrorWarningTests(unittest.TestCase):
- def setUp(self):
- sys.stderr = StringIO.StringIO()
- sys.stdout = StringIO.StringIO()
- try:
- os.remove("parsetab.py")
- pymodule_out_remove("parsetab.pyc")
- except OSError:
- pass
-
- if sys.hexversion >= 0x3020000:
- warnings.filterwarnings('ignore', category=ResourceWarning)
- warnings.filterwarnings('ignore', category=DeprecationWarning)
-
- def tearDown(self):
- sys.stderr = sys.__stderr__
- sys.stdout = sys.__stdout__
- def test_yacc_badargs(self):
- self.assertRaises(ply.yacc.YaccError,run_import,"yacc_badargs")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "yacc_badargs.py:23: Rule 'p_statement_assign' has too many arguments\n"
- "yacc_badargs.py:27: Rule 'p_statement_expr' requires an argument\n"
- ))
- def test_yacc_badid(self):
- self.assertRaises(ply.yacc.YaccError,run_import,"yacc_badid")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "yacc_badid.py:32: Illegal name 'bad&rule' in rule 'statement'\n"
- "yacc_badid.py:36: Illegal rule name 'bad&rule'\n"
- ))
-
- def test_yacc_badprec(self):
- try:
- run_import("yacc_badprec")
- except ply.yacc.YaccError:
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "precedence must be a list or tuple\n"
- ))
- def test_yacc_badprec2(self):
- self.assertRaises(ply.yacc.YaccError,run_import,"yacc_badprec2")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "Bad precedence table\n"
- ))
-
- def test_yacc_badprec3(self):
- run_import("yacc_badprec3")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "Precedence already specified for terminal 'MINUS'\n"
- "Generating LALR tables\n"
-
- ))
-
- def test_yacc_badrule(self):
- self.assertRaises(ply.yacc.YaccError,run_import,"yacc_badrule")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "yacc_badrule.py:24: Syntax error. Expected ':'\n"
- "yacc_badrule.py:28: Syntax error in rule 'statement'\n"
- "yacc_badrule.py:33: Syntax error. Expected ':'\n"
- "yacc_badrule.py:42: Syntax error. Expected ':'\n"
- ))
-
- def test_yacc_badtok(self):
- try:
- run_import("yacc_badtok")
- except ply.yacc.YaccError:
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "tokens must be a list or tuple\n"))
-
- def test_yacc_dup(self):
- run_import("yacc_dup")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "yacc_dup.py:27: Function p_statement redefined. Previously defined on line 23\n"
- "Token 'EQUALS' defined, but not used\n"
- "There is 1 unused token\n"
- "Generating LALR tables\n"
-
- ))
- def test_yacc_error1(self):
- try:
- run_import("yacc_error1")
- except ply.yacc.YaccError:
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "yacc_error1.py:61: p_error() requires 1 argument\n"))
-
- def test_yacc_error2(self):
- try:
- run_import("yacc_error2")
- except ply.yacc.YaccError:
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "yacc_error2.py:61: p_error() requires 1 argument\n"))
-
- def test_yacc_error3(self):
- try:
- run_import("yacc_error3")
- except ply.yacc.YaccError:
- e = sys.exc_info()[1]
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "'p_error' defined, but is not a function or method\n"))
-
- def test_yacc_error4(self):
- self.assertRaises(ply.yacc.YaccError,run_import,"yacc_error4")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "yacc_error4.py:62: Illegal rule name 'error'. Already defined as a token\n"
- ))
-
-
- def test_yacc_error5(self):
- run_import("yacc_error5")
- result = sys.stdout.getvalue()
- self.assertTrue(check_expected(result,
- "Group at 3:10 to 3:12\n"
- "Undefined name 'a'\n"
- "Syntax error at 'b'\n"
- "Syntax error at 4:18 to 4:22\n"
- "Assignment Error at 2:5 to 5:27\n"
- "13\n"
- ))
-
- def test_yacc_error6(self):
- run_import("yacc_error6")
- result = sys.stdout.getvalue()
- self.assertTrue(check_expected(result,
- "a=7\n"
- "Line 3: Syntax error at '*'\n"
- "c=21\n"
- ))
-
- def test_yacc_error7(self):
- run_import("yacc_error7")
- result = sys.stdout.getvalue()
- self.assertTrue(check_expected(result,
- "a=7\n"
- "Line 3: Syntax error at '*'\n"
- "c=21\n"
- ))
-
- def test_yacc_inf(self):
- self.assertRaises(ply.yacc.YaccError,run_import,"yacc_inf")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "Token 'NUMBER' defined, but not used\n"
- "There is 1 unused token\n"
- "Infinite recursion detected for symbol 'statement'\n"
- "Infinite recursion detected for symbol 'expression'\n"
- ))
- def test_yacc_literal(self):
- self.assertRaises(ply.yacc.YaccError,run_import,"yacc_literal")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "yacc_literal.py:36: Literal token '**' in rule 'expression' may only be a single character\n"
- ))
- def test_yacc_misplaced(self):
- self.assertRaises(ply.yacc.YaccError,run_import,"yacc_misplaced")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "yacc_misplaced.py:32: Misplaced '|'\n"
- ))
-
- def test_yacc_missing1(self):
- self.assertRaises(ply.yacc.YaccError,run_import,"yacc_missing1")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "yacc_missing1.py:24: Symbol 'location' used, but not defined as a token or a rule\n"
- ))
-
- def test_yacc_nested(self):
- run_import("yacc_nested")
- result = sys.stdout.getvalue()
- self.assertTrue(check_expected(result,
- "A\n"
- "A\n"
- "A\n",
- ))
-
- def test_yacc_nodoc(self):
- run_import("yacc_nodoc")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "yacc_nodoc.py:27: No documentation string specified in function 'p_statement_expr' (ignored)\n"
- "Generating LALR tables\n"
- ))
-
- def test_yacc_noerror(self):
- run_import("yacc_noerror")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "no p_error() function is defined\n"
- "Generating LALR tables\n"
- ))
-
- def test_yacc_nop(self):
- run_import("yacc_nop")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "yacc_nop.py:27: Possible grammar rule 'statement_expr' defined without p_ prefix\n"
- "Generating LALR tables\n"
- ))
-
- def test_yacc_notfunc(self):
- run_import("yacc_notfunc")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "'p_statement_assign' not defined as a function\n"
- "Token 'EQUALS' defined, but not used\n"
- "There is 1 unused token\n"
- "Generating LALR tables\n"
- ))
- def test_yacc_notok(self):
- try:
- run_import("yacc_notok")
- except ply.yacc.YaccError:
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "No token list is defined\n"))
-
- def test_yacc_rr(self):
- run_import("yacc_rr")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "Generating LALR tables\n"
- "1 reduce/reduce conflict\n"
- "reduce/reduce conflict in state 15 resolved using rule (statement -> NAME EQUALS NUMBER)\n"
- "rejected rule (expression -> NUMBER) in state 15\n"
-
- ))
-
- def test_yacc_rr_unused(self):
- run_import("yacc_rr_unused")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "no p_error() function is defined\n"
- "Generating LALR tables\n"
- "3 reduce/reduce conflicts\n"
- "reduce/reduce conflict in state 1 resolved using rule (rule3 -> A)\n"
- "rejected rule (rule4 -> A) in state 1\n"
- "reduce/reduce conflict in state 1 resolved using rule (rule3 -> A)\n"
- "rejected rule (rule5 -> A) in state 1\n"
- "reduce/reduce conflict in state 1 resolved using rule (rule4 -> A)\n"
- "rejected rule (rule5 -> A) in state 1\n"
- "Rule (rule5 -> A) is never reduced\n"
- ))
-
- def test_yacc_simple(self):
- run_import("yacc_simple")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "Generating LALR tables\n"
- ))
-
- def test_yacc_sr(self):
- run_import("yacc_sr")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "Generating LALR tables\n"
- "20 shift/reduce conflicts\n"
- ))
-
- def test_yacc_term1(self):
- self.assertRaises(ply.yacc.YaccError,run_import,"yacc_term1")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "yacc_term1.py:24: Illegal rule name 'NUMBER'. Already defined as a token\n"
- ))
-
- def test_yacc_unicode_literals(self):
- run_import("yacc_unicode_literals")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "Generating LALR tables\n"
- ))
-
- def test_yacc_unused(self):
- self.assertRaises(ply.yacc.YaccError,run_import,"yacc_unused")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "yacc_unused.py:62: Symbol 'COMMA' used, but not defined as a token or a rule\n"
- "Symbol 'COMMA' is unreachable\n"
- "Symbol 'exprlist' is unreachable\n"
- ))
- def test_yacc_unused_rule(self):
- run_import("yacc_unused_rule")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "yacc_unused_rule.py:62: Rule 'integer' defined, but not used\n"
- "There is 1 unused rule\n"
- "Symbol 'integer' is unreachable\n"
- "Generating LALR tables\n"
- ))
-
- def test_yacc_uprec(self):
- self.assertRaises(ply.yacc.YaccError,run_import,"yacc_uprec")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "yacc_uprec.py:37: Nothing known about the precedence of 'UMINUS'\n"
- ))
-
- def test_yacc_uprec2(self):
- self.assertRaises(ply.yacc.YaccError,run_import,"yacc_uprec2")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "yacc_uprec2.py:37: Syntax error. Nothing follows %prec\n"
- ))
-
- def test_yacc_prec1(self):
- self.assertRaises(ply.yacc.YaccError,run_import,"yacc_prec1")
- result = sys.stderr.getvalue()
- self.assertTrue(check_expected(result,
- "Precedence rule 'left' defined for unknown symbol '+'\n"
- "Precedence rule 'left' defined for unknown symbol '*'\n"
- "Precedence rule 'left' defined for unknown symbol '-'\n"
- "Precedence rule 'left' defined for unknown symbol '/'\n"
- ))
-
-unittest.main()
diff --git a/test/yacc_badargs.py b/test/yacc_badargs.py
deleted file mode 100644
index 9a1d03f..0000000
--- a/test/yacc_badargs.py
+++ /dev/null
@@ -1,68 +0,0 @@
-# -----------------------------------------------------------------------------
-# yacc_badargs.py
-#
-# Rules with wrong # args
-# -----------------------------------------------------------------------------
-import sys
-sys.tracebacklimit = 0
-sys.path.insert(0,"..")
-import ply.yacc as yacc
-
-from calclex import tokens
-
-# Parsing rules
-precedence = (
- ('left','PLUS','MINUS'),
- ('left','TIMES','DIVIDE'),
- ('right','UMINUS'),
- )
-
-# dictionary of names
-names = { }
-
-def p_statement_assign(t,s):
- 'statement : NAME EQUALS expression'
- names[t[1]] = t[3]
-
-def p_statement_expr():
- 'statement : expression'
- print(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)
-
-yacc.yacc()
-
-
-
-
diff --git a/test/yacc_badid.py b/test/yacc_badid.py
deleted file mode 100644
index e4b9f5e..0000000
--- a/test/yacc_badid.py
+++ /dev/null
@@ -1,77 +0,0 @@
-# -----------------------------------------------------------------------------
-# yacc_badid.py
-#
-# Attempt to define a rule with a bad-identifier name
-# -----------------------------------------------------------------------------
-import sys
-
-if ".." not in sys.path: sys.path.insert(0,"..")
-import ply.yacc as yacc
-
-from calclex import tokens
-
-# 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'
- print(t[1])
-
-def p_statement_expr2(t):
- 'statement : bad&rule'
- pass
-
-def p_badrule(t):
- 'bad&rule : expression'
- pass
-
-
-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):
- pass
-
-yacc.yacc()
-
-
-
-
diff --git a/test/yacc_badprec.py b/test/yacc_badprec.py
deleted file mode 100644
index 3013bb6..0000000
--- a/test/yacc_badprec.py
+++ /dev/null
@@ -1,64 +0,0 @@
-# -----------------------------------------------------------------------------
-# yacc_badprec.py
-#
-# Bad precedence specifier
-# -----------------------------------------------------------------------------
-import sys
-
-if ".." not in sys.path: sys.path.insert(0,"..")
-import ply.yacc as yacc
-
-from calclex import tokens
-
-# Parsing rules
-precedence = "blah"
-
-# 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'
- print(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)
-
-yacc.yacc()
-
-
-
-
diff --git a/test/yacc_badprec2.py b/test/yacc_badprec2.py
deleted file mode 100644
index 83093b4..0000000
--- a/test/yacc_badprec2.py
+++ /dev/null
@@ -1,68 +0,0 @@
-# -----------------------------------------------------------------------------
-# yacc_badprec2.py
-#
-# Bad precedence
-# -----------------------------------------------------------------------------
-import sys
-
-if ".." not in sys.path: sys.path.insert(0,"..")
-import ply.yacc as yacc
-
-from calclex import tokens
-
-# Parsing rules
-precedence = (
- 42,
- ('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'
- print(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)
-
-yacc.yacc()
-
-
-
-
diff --git a/test/yacc_badprec3.py b/test/yacc_badprec3.py
deleted file mode 100644
index d925ecd..0000000
--- a/test/yacc_badprec3.py
+++ /dev/null
@@ -1,68 +0,0 @@
-# -----------------------------------------------------------------------------
-# yacc_badprec3.py
-#
-# Bad precedence
-# -----------------------------------------------------------------------------
-import sys
-
-if ".." not in sys.path: sys.path.insert(0,"..")
-import ply.yacc as yacc
-
-from calclex import tokens
-
-# Parsing rules
-precedence = (
- ('left','PLUS','MINUS'),
- ('left','TIMES','DIVIDE','MINUS'),
- ('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'
- print(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[3] == '/': 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)
-
-yacc.yacc()
-
-
-
-
diff --git a/test/yacc_badrule.py b/test/yacc_badrule.py
deleted file mode 100644
index 92af646..0000000
--- a/test/yacc_badrule.py
+++ /dev/null
@@ -1,68 +0,0 @@
-# -----------------------------------------------------------------------------
-# yacc_badrule.py
-#
-# Syntax problems in the rule strings
-# -----------------------------------------------------------------------------
-import sys
-
-if ".." not in sys.path: sys.path.insert(0,"..")
-import ply.yacc as yacc
-
-from calclex import tokens
-
-# 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'
- print(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)
-
-yacc.yacc()
-
-
-
-
diff --git a/test/yacc_badtok.py b/test/yacc_badtok.py
deleted file mode 100644
index fc4afe1..0000000
--- a/test/yacc_badtok.py
+++ /dev/null
@@ -1,68 +0,0 @@
-# -----------------------------------------------------------------------------
-# yacc_badtok.py
-#
-# A grammar, but tokens is a bad datatype
-# -----------------------------------------------------------------------------
-
-import sys
-if ".." not in sys.path: sys.path.insert(0,"..")
-import ply.yacc as yacc
-
-tokens = "Hello"
-
-# 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'
- print(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)
-
-yacc.yacc()
-
-
-
-
diff --git a/test/yacc_dup.py b/test/yacc_dup.py
deleted file mode 100644
index 309ba32..0000000
--- a/test/yacc_dup.py
+++ /dev/null
@@ -1,68 +0,0 @@
-# -----------------------------------------------------------------------------
-# yacc_dup.py
-#
-# Duplicated rule name
-# -----------------------------------------------------------------------------
-import sys
-
-if ".." not in sys.path: sys.path.insert(0,"..")
-import ply.yacc as yacc
-
-from calclex import tokens
-
-# Parsing rules
-precedence = (
- ('left','PLUS','MINUS'),
- ('left','TIMES','DIVIDE'),
- ('right','UMINUS'),
- )
-
-# dictionary of names
-names = { }
-
-def p_statement(t):
- 'statement : NAME EQUALS expression'
- names[t[1]] = t[3]
-
-def p_statement(t):
- 'statement : expression'
- print(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)
-
-yacc.yacc()
-
-
-
-
diff --git a/test/yacc_error1.py b/test/yacc_error1.py
deleted file mode 100644
index 10ac6a9..0000000
--- a/test/yacc_error1.py
+++ /dev/null
@@ -1,68 +0,0 @@
-# -----------------------------------------------------------------------------
-# yacc_error1.py
-#
-# Bad p_error() function
-# -----------------------------------------------------------------------------
-import sys
-
-if ".." not in sys.path: sys.path.insert(0,"..")
-import ply.yacc as yacc
-
-from calclex import tokens
-
-# 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'
- print(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,s):
- print("Syntax error at '%s'" % t.value)
-
-yacc.yacc()
-
-
-
-
diff --git a/test/yacc_error2.py b/test/yacc_error2.py
deleted file mode 100644
index 7591418..0000000
--- a/test/yacc_error2.py
+++ /dev/null
@@ -1,68 +0,0 @@
-# -----------------------------------------------------------------------------
-# yacc_error2.py
-#
-# Bad p_error() function
-# -----------------------------------------------------------------------------
-import sys
-
-if ".." not in sys.path: sys.path.insert(0,"..")
-import ply.yacc as yacc
-
-from calclex import tokens
-
-# 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'
- print(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():
- print("Syntax error at '%s'" % t.value)
-
-yacc.yacc()
-
-
-
-
diff --git a/test/yacc_error3.py b/test/yacc_error3.py
deleted file mode 100644
index 4604a48..0000000
--- a/test/yacc_error3.py
+++ /dev/null
@@ -1,67 +0,0 @@
-# -----------------------------------------------------------------------------
-# yacc_error3.py
-#
-# Bad p_error() function
-# -----------------------------------------------------------------------------
-import sys
-
-if ".." not in sys.path: sys.path.insert(0,"..")
-import ply.yacc as yacc
-
-from calclex import tokens
-
-# 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'
- print(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
-
-p_error = "blah"
-
-yacc.yacc()
-
-
-
-
diff --git a/test/yacc_error4.py b/test/yacc_error4.py
deleted file mode 100644
index 9c550cd..0000000
--- a/test/yacc_error4.py
+++ /dev/null
@@ -1,72 +0,0 @@
-# -----------------------------------------------------------------------------
-# yacc_error4.py
-#
-# Attempt to define a rule named 'error'
-# -----------------------------------------------------------------------------
-import sys
-
-if ".." not in sys.path: sys.path.insert(0,"..")
-import ply.yacc as yacc
-
-from calclex import tokens
-
-# 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'
- print(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_handler(t):
- 'error : NAME'
- pass
-
-def p_error(t):
- pass
-
-yacc.yacc()
-
-
-
-
diff --git a/test/yacc_error5.py b/test/yacc_error5.py
deleted file mode 100644
index 9eb0f85..0000000
--- a/test/yacc_error5.py
+++ /dev/null
@@ -1,94 +0,0 @@
-# -----------------------------------------------------------------------------
-# yacc_error5.py
-#
-# Lineno and position tracking with error tokens
-# -----------------------------------------------------------------------------
-import sys
-
-if ".." not in sys.path: sys.path.insert(0,"..")
-import ply.yacc as yacc
-
-from calclex import tokens
-
-# 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_assign_error(t):
- 'statement : NAME EQUALS error'
- line_start, line_end = t.linespan(3)
- pos_start, pos_end = t.lexspan(3)
- print("Assignment Error at %d:%d to %d:%d" % (line_start,pos_start,line_end,pos_end))
-
-def p_statement_expr(t):
- 'statement : expression'
- print(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'
- line_start, line_end = t.linespan(2)
- pos_start, pos_end = t.lexspan(2)
- print("Group at %d:%d to %d:%d" % (line_start,pos_start, line_end, pos_end))
- t[0] = t[2]
-
-def p_expression_group_error(t):
- 'expression : LPAREN error RPAREN'
- line_start, line_end = t.linespan(2)
- pos_start, pos_end = t.lexspan(2)
- print("Syntax error at %d:%d to %d:%d" % (line_start,pos_start, line_end, pos_end))
- t[0] = 0
-
-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()
-import calclex
-calclex.lexer.lineno=1
-parser.parse("""
-a = 3 +
-(4*5) +
-(a b c) +
-+ 6 + 7
-""", tracking=True)
-
-
-
-
-
-
diff --git a/test/yacc_error6.py b/test/yacc_error6.py
deleted file mode 100644
index 8d0ec85..0000000
--- a/test/yacc_error6.py
+++ /dev/null
@@ -1,80 +0,0 @@
-# -----------------------------------------------------------------------------
-# yacc_error6.py
-#
-# Panic mode recovery test
-# -----------------------------------------------------------------------------
-import sys
-
-if ".." not in sys.path: sys.path.insert(0,"..")
-import ply.yacc as yacc
-
-from calclex import tokens
-
-# Parsing rules
-precedence = (
- ('left','PLUS','MINUS'),
- ('left','TIMES','DIVIDE'),
- ('right','UMINUS'),
- )
-
-def p_statements(t):
- 'statements : statements statement'
- pass
-
-def p_statements_1(t):
- 'statements : statement'
- pass
-
-def p_statement_assign(p):
- 'statement : LPAREN NAME EQUALS expression RPAREN'
- print("%s=%s" % (p[2],p[4]))
-
-def p_statement_expr(t):
- 'statement : LPAREN expression RPAREN'
- print(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_number(t):
- 'expression : NUMBER'
- t[0] = t[1]
-
-def p_error(p):
- if p:
- print("Line %d: Syntax error at '%s'" % (p.lineno, p.value))
- # Scan ahead looking for a name token
- while True:
- tok = parser.token()
- if not tok or tok.type == 'RPAREN':
- break
- if tok:
- parser.restart()
- return None
-
-parser = yacc.yacc()
-import calclex
-calclex.lexer.lineno=1
-
-parser.parse("""
-(a = 3 + 4)
-(b = 4 + * 5 - 6 + *)
-(c = 10 + 11)
-""")
-
-
-
-
-
-
diff --git a/test/yacc_error7.py b/test/yacc_error7.py
deleted file mode 100644
index abdc834..0000000
--- a/test/yacc_error7.py
+++ /dev/null
@@ -1,80 +0,0 @@
-# -----------------------------------------------------------------------------
-# yacc_error7.py
-#
-# Panic mode recovery test using deprecated functionality
-# -----------------------------------------------------------------------------
-import sys
-
-if ".." not in sys.path: sys.path.insert(0,"..")
-import ply.yacc as yacc
-
-from calclex import tokens
-
-# Parsing rules
-precedence = (
- ('left','PLUS','MINUS'),
- ('left','TIMES','DIVIDE'),
- ('right','UMINUS'),
- )
-
-def p_statements(t):
- 'statements : statements statement'
- pass
-
-def p_statements_1(t):
- 'statements : statement'
- pass
-
-def p_statement_assign(p):
- 'statement : LPAREN NAME EQUALS expression RPAREN'
- print("%s=%s" % (p[2],p[4]))
-
-def p_statement_expr(t):
- 'statement : LPAREN expression RPAREN'
- print(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_number(t):
- 'expression : NUMBER'
- t[0] = t[1]
-
-def p_error(p):
- if p:
- print("Line %d: Syntax error at '%s'" % (p.lineno, p.value))
- # Scan ahead looking for a name token
- while True:
- tok = parser.token()
- if not tok or tok.type == 'RPAREN':
- break
- if tok:
- parser.restart()
- return None
-
-parser = yacc.yacc()
-import calclex
-calclex.lexer.lineno=1
-
-parser.parse("""
-(a = 3 + 4)
-(b = 4 + * 5 - 6 + *)
-(c = 10 + 11)
-""")
-
-
-
-
-
-
diff --git a/test/yacc_inf.py b/test/yacc_inf.py
deleted file mode 100644
index efd3612..0000000
--- a/test/yacc_inf.py
+++ /dev/null
@@ -1,56 +0,0 @@
-# -----------------------------------------------------------------------------
-# yacc_inf.py
-#
-# Infinite recursion
-# -----------------------------------------------------------------------------
-import sys
-
-if ".." not in sys.path: sys.path.insert(0,"..")
-import ply.yacc as yacc
-
-from calclex import tokens
-
-# 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'
- print(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_error(t):
- print("Syntax error at '%s'" % t.value)
-
-yacc.yacc()
-
-
-
-
diff --git a/test/yacc_literal.py b/test/yacc_literal.py
deleted file mode 100644
index 0d62803..0000000
--- a/test/yacc_literal.py
+++ /dev/null
@@ -1,69 +0,0 @@
-# -----------------------------------------------------------------------------
-# yacc_literal.py
-#
-# Grammar with bad literal characters
-# -----------------------------------------------------------------------------
-import sys
-
-if ".." not in sys.path: sys.path.insert(0,"..")
-import ply.yacc as yacc
-
-from calclex import tokens
-
-# Parsing rules
-precedence = (
- ('left','+','-'),
- ('left','*','/'),
- ('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'
- print(t[1])
-
-def p_expression_binop(t):
- '''expression : expression '+' expression
- | expression '-' expression
- | expression '*' expression
- | expression '/' expression
- | expression '**' 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)
-
-yacc.yacc()
-
-
-
-
diff --git a/test/yacc_misplaced.py b/test/yacc_misplaced.py
deleted file mode 100644
index 9159b01..0000000
--- a/test/yacc_misplaced.py
+++ /dev/null
@@ -1,68 +0,0 @@
-# -----------------------------------------------------------------------------
-# yacc_misplaced.py
-#
-# A misplaced | in grammar rules
-# -----------------------------------------------------------------------------
-import sys
-
-if ".." not in sys.path: sys.path.insert(0,"..")
-import ply.yacc as yacc
-
-from calclex import tokens
-
-# 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'
- print(t[1])
-
-def p_expression_binop(t):
- ''' | 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)
-
-yacc.yacc()
-
-
-
-
diff --git a/test/yacc_missing1.py b/test/yacc_missing1.py
deleted file mode 100644
index d1b5105..0000000
--- a/test/yacc_missing1.py
+++ /dev/null
@@ -1,68 +0,0 @@
-# -----------------------------------------------------------------------------
-# yacc_missing1.py
-#
-# Grammar with a missing rule
-# -----------------------------------------------------------------------------
-import sys
-
-if ".." not in sys.path: sys.path.insert(0,"..")
-import ply.yacc as yacc
-
-from calclex import tokens
-
-# Parsing rules
-precedence = (
- ('left','PLUS','MINUS'),
- ('left','TIMES','DIVIDE'),
- ('right','UMINUS'),
- )
-
-# dictionary of names
-names = { }
-
-def p_statement_assign(t):
- 'statement : location EQUALS expression'
- names[t[1]] = t[3]
-
-def p_statement_expr(t):
- 'statement : expression'
- print(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)
-
-yacc.yacc()
-
-
-
-
diff --git a/test/yacc_nested.py b/test/yacc_nested.py
deleted file mode 100644
index a3543a9..0000000
--- a/test/yacc_nested.py
+++ /dev/null
@@ -1,33 +0,0 @@
-import sys
-
-if ".." not in sys.path: sys.path.insert(0,"..")
-
-from ply import lex, yacc
-
-t_A = 'A'
-t_B = 'B'
-t_C = 'C'
-
-tokens = ('A', 'B', 'C')
-
-the_lexer = lex.lex()
-
-def t_error(t):
- pass
-
-def p_error(p):
- pass
-
-def p_start(t):
- '''start : A nest C'''
- pass
-
-def p_nest(t):
- '''nest : B'''
- print(t[-1])
-
-the_parser = yacc.yacc(debug = False)
-
-the_parser.parse('ABC', the_lexer)
-the_parser.parse('ABC', the_lexer, tracking=True)
-the_parser.parse('ABC', the_lexer, tracking=True, debug=1)
diff --git a/test/yacc_nodoc.py b/test/yacc_nodoc.py
deleted file mode 100644
index 0f61920..0000000
--- a/test/yacc_nodoc.py
+++ /dev/null
@@ -1,67 +0,0 @@
-# -----------------------------------------------------------------------------
-# yacc_nodoc.py
-#
-# Rule with a missing doc-string
-# -----------------------------------------------------------------------------
-import sys
-
-if ".." not in sys.path: sys.path.insert(0,"..")
-import ply.yacc as yacc
-
-from calclex import tokens
-
-# 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):
- print(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)
-
-yacc.yacc()
-
-
-
-
diff --git a/test/yacc_noerror.py b/test/yacc_noerror.py
deleted file mode 100644
index b38c758..0000000
--- a/test/yacc_noerror.py
+++ /dev/null
@@ -1,66 +0,0 @@
-# -----------------------------------------------------------------------------
-# yacc_noerror.py
-#
-# No p_error() rule defined.
-# -----------------------------------------------------------------------------
-import sys
-
-if ".." not in sys.path: sys.path.insert(0,"..")
-import ply.yacc as yacc
-
-from calclex import tokens
-
-# 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'
- print(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
-
-
-yacc.yacc()
-
-
-
-
diff --git a/test/yacc_nop.py b/test/yacc_nop.py
deleted file mode 100644
index 789a9cf..0000000
--- a/test/yacc_nop.py
+++ /dev/null
@@ -1,68 +0,0 @@
-# -----------------------------------------------------------------------------
-# yacc_nop.py
-#
-# Possible grammar rule defined without p_ prefix
-# -----------------------------------------------------------------------------
-import sys
-
-if ".." not in sys.path: sys.path.insert(0,"..")
-import ply.yacc as yacc
-
-from calclex import tokens
-
-# 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 statement_expr(t):
- 'statement : expression'
- print(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)
-
-yacc.yacc()
-
-
-
-
diff --git a/test/yacc_notfunc.py b/test/yacc_notfunc.py
deleted file mode 100644
index 5093a74..0000000
--- a/test/yacc_notfunc.py
+++ /dev/null
@@ -1,66 +0,0 @@
-# -----------------------------------------------------------------------------
-# yacc_notfunc.py
-#
-# p_rule not defined as a function
-# -----------------------------------------------------------------------------
-import sys
-
-if ".." not in sys.path: sys.path.insert(0,"..")
-import ply.yacc as yacc
-
-from calclex import tokens
-
-# Parsing rules
-precedence = (
- ('left','PLUS','MINUS'),
- ('left','TIMES','DIVIDE'),
- ('right','UMINUS'),
- )
-
-# dictionary of names
-names = { }
-
-p_statement_assign = "Blah"
-
-def p_statement_expr(t):
- 'statement : expression'
- print(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)
-
-yacc.yacc()
-
-
-
-
diff --git a/test/yacc_notok.py b/test/yacc_notok.py
deleted file mode 100644
index cff55a8..0000000
--- a/test/yacc_notok.py
+++ /dev/null
@@ -1,67 +0,0 @@
-# -----------------------------------------------------------------------------
-# yacc_notok.py
-#
-# A grammar, but we forgot to import the tokens list
-# -----------------------------------------------------------------------------
-
-import sys
-
-if ".." not in sys.path: sys.path.insert(0,"..")
-import ply.yacc as 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'
- print(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)
-
-yacc.yacc()
-
-
-
-
diff --git a/test/yacc_prec1.py b/test/yacc_prec1.py
deleted file mode 100644
index 99fcd90..0000000
--- a/test/yacc_prec1.py
+++ /dev/null
@@ -1,68 +0,0 @@
-# -----------------------------------------------------------------------------
-# yacc_prec1.py
-#
-# Tests case where precedence specifier doesn't match up to terminals
-# -----------------------------------------------------------------------------
-import sys
-
-if ".." not in sys.path: sys.path.insert(0,"..")
-import ply.yacc as yacc
-
-from calclex import tokens
-
-# Parsing rules
-precedence = (
- ('left', '+', '-'),
- ('left', '*', '/'),
- ('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'
- print(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)
-
-yacc.yacc()
-
-
-
-
diff --git a/test/yacc_rr.py b/test/yacc_rr.py
deleted file mode 100644
index e7336c2..0000000
--- a/test/yacc_rr.py
+++ /dev/null
@@ -1,72 +0,0 @@
-# -----------------------------------------------------------------------------
-# yacc_rr.py
-#
-# A grammar with a reduce/reduce conflict
-# -----------------------------------------------------------------------------
-import sys
-
-if ".." not in sys.path: sys.path.insert(0,"..")
-import ply.yacc as yacc
-
-from calclex import tokens
-
-# 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_assign_2(t):
- 'statement : NAME EQUALS NUMBER'
- names[t[1]] = t[3]
-
-def p_statement_expr(t):
- 'statement : expression'
- print(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)
-
-yacc.yacc()
-
-
-
-
diff --git a/test/yacc_rr_unused.py b/test/yacc_rr_unused.py
deleted file mode 100644
index 1ca5f7e..0000000
--- a/test/yacc_rr_unused.py
+++ /dev/null
@@ -1,30 +0,0 @@
-# -----------------------------------------------------------------------------
-# yacc_rr_unused.py
-#
-# A grammar with reduce/reduce conflicts and a rule that never
-# gets reduced.
-# -----------------------------------------------------------------------------
-import sys
-
-if ".." not in sys.path: sys.path.insert(0,"..")
-import ply.yacc as yacc
-
-tokens = ('A', 'B', 'C')
-
-def p_grammar(p):
- '''
- rule1 : rule2 B
- | rule2 C
-
- rule2 : rule3 B
- | rule4
- | rule5
-
- rule3 : A
-
- rule4 : A
-
- rule5 : A
- '''
-
-yacc.yacc()
diff --git a/test/yacc_simple.py b/test/yacc_simple.py
deleted file mode 100644
index bd989f4..0000000
--- a/test/yacc_simple.py
+++ /dev/null
@@ -1,68 +0,0 @@
-# -----------------------------------------------------------------------------
-# yacc_simple.py
-#
-# A simple, properly specifier grammar
-# -----------------------------------------------------------------------------
-import sys
-
-if ".." not in sys.path: sys.path.insert(0,"..")
-import ply.yacc as yacc
-
-from calclex import tokens
-
-# 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'
- print(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)
-
-yacc.yacc()
-
-
-
-
diff --git a/test/yacc_sr.py b/test/yacc_sr.py
deleted file mode 100644
index 69a1e9c..0000000
--- a/test/yacc_sr.py
+++ /dev/null
@@ -1,63 +0,0 @@
-# -----------------------------------------------------------------------------
-# yacc_sr.py
-#
-# A grammar with shift-reduce conflicts
-# -----------------------------------------------------------------------------
-import sys
-
-if ".." not in sys.path: sys.path.insert(0,"..")
-import ply.yacc as yacc
-
-from calclex import tokens
-
-# Parsing rules
-
-# 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'
- print(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'
- 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)
-
-yacc.yacc()
-
-
-
-
diff --git a/test/yacc_term1.py b/test/yacc_term1.py
deleted file mode 100644
index eaa36e9..0000000
--- a/test/yacc_term1.py
+++ /dev/null
@@ -1,68 +0,0 @@
-# -----------------------------------------------------------------------------
-# yacc_term1.py
-#
-# Terminal used on the left-hand-side
-# -----------------------------------------------------------------------------
-import sys
-
-if ".." not in sys.path: sys.path.insert(0,"..")
-import ply.yacc as yacc
-
-from calclex import tokens
-
-# Parsing rules
-precedence = (
- ('left','PLUS','MINUS'),
- ('left','TIMES','DIVIDE'),
- ('right','UMINUS'),
- )
-
-# dictionary of names
-names = { }
-
-def p_statement_assign(t):
- 'NUMBER : NAME EQUALS expression'
- names[t[1]] = t[3]
-
-def p_statement_expr(t):
- 'statement : expression'
- print(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)
-
-yacc.yacc()
-
-
-
-
diff --git a/test/yacc_unicode_literals.py b/test/yacc_unicode_literals.py
deleted file mode 100644
index 5ae4f5b..0000000
--- a/test/yacc_unicode_literals.py
+++ /dev/null
@@ -1,70 +0,0 @@
-# -----------------------------------------------------------------------------
-# yacc_unicode_literals
-#
-# Test for unicode literals on Python 2.x
-# -----------------------------------------------------------------------------
-from __future__ import unicode_literals
-
-import sys
-
-if ".." not in sys.path: sys.path.insert(0,"..")
-import ply.yacc as yacc
-
-from calclex import tokens
-
-# 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'
- print(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)
-
-yacc.yacc()
-
-
-
-
diff --git a/test/yacc_unused.py b/test/yacc_unused.py
deleted file mode 100644
index 55b677b..0000000
--- a/test/yacc_unused.py
+++ /dev/null
@@ -1,77 +0,0 @@
-# -----------------------------------------------------------------------------
-# yacc_unused.py
-#
-# A grammar with an unused rule
-# -----------------------------------------------------------------------------
-import sys
-
-if ".." not in sys.path: sys.path.insert(0,"..")
-import ply.yacc as yacc
-
-from calclex import tokens
-
-# 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'
- print(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_expr_list(t):
- 'exprlist : exprlist COMMA expression'
- pass
-
-def p_expr_list_2(t):
- 'exprlist : expression'
- pass
-
-
-def p_error(t):
- print("Syntax error at '%s'" % t.value)
-
-yacc.yacc()
-
-
-
-
diff --git a/test/yacc_unused_rule.py b/test/yacc_unused_rule.py
deleted file mode 100644
index 4868ef8..0000000
--- a/test/yacc_unused_rule.py
+++ /dev/null
@@ -1,72 +0,0 @@
-# -----------------------------------------------------------------------------
-# yacc_unused_rule.py
-#
-# Grammar with an unused rule
-# -----------------------------------------------------------------------------
-import sys
-
-if ".." not in sys.path: sys.path.insert(0,"..")
-import ply.yacc as yacc
-
-from calclex import tokens
-
-# 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'
- print(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_integer(t):
- 'integer : NUMBER'
- t[0] = t[1]
-
-def p_error(t):
- print("Syntax error at '%s'" % t.value)
-
-yacc.yacc()
-
-
-
-
diff --git a/test/yacc_uprec.py b/test/yacc_uprec.py
deleted file mode 100644
index 569adb8..0000000
--- a/test/yacc_uprec.py
+++ /dev/null
@@ -1,63 +0,0 @@
-# -----------------------------------------------------------------------------
-# yacc_uprec.py
-#
-# A grammar with a bad %prec specifier
-# -----------------------------------------------------------------------------
-import sys
-
-if ".." not in sys.path: sys.path.insert(0,"..")
-import ply.yacc as yacc
-
-from calclex import tokens
-
-# Parsing rules
-
-# 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'
- print(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)
-
-yacc.yacc()
-
-
-
-
diff --git a/test/yacc_uprec2.py b/test/yacc_uprec2.py
deleted file mode 100644
index 73274bf..0000000
--- a/test/yacc_uprec2.py
+++ /dev/null
@@ -1,63 +0,0 @@
-# -----------------------------------------------------------------------------
-# yacc_uprec2.py
-#
-# A grammar with a bad %prec specifier
-# -----------------------------------------------------------------------------
-import sys
-
-if ".." not in sys.path: sys.path.insert(0,"..")
-import ply.yacc as yacc
-
-from calclex import tokens
-
-# Parsing rules
-
-# 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'
- print(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'
- 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)
-
-yacc.yacc()
-
-
-
-