summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Beazley <dave@dabeaz.com>2015-05-07 15:53:44 -0500
committerDavid Beazley <dave@dabeaz.com>2015-05-07 15:53:44 -0500
commit192d922697726dc59c7af1480a04e9fcd022cffc (patch)
tree9d22b800583c2194af401169a7b6d09f17612d04
parentfee743164e888f03c68ec87aef8fa63877c24c64 (diff)
downloadply-192d922697726dc59c7af1480a04e9fcd022cffc.tar.gz
Fixed issue 63
-rw-r--r--CHANGES6
-rw-r--r--ply/lex.py41
-rw-r--r--ply/yacc.py30
3 files changed, 47 insertions, 30 deletions
diff --git a/CHANGES b/CHANGES
index fdda63f..91800a4 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,9 @@
+Version 3.7
+---------------------
+05/07/15: beazley
+ Fixed regression in handling of table modules if specified as module
+ objects. See https://github.com/dabeaz/ply/issues/63
+
Version 3.6
---------------------
04/25/15: beazley
diff --git a/ply/lex.py b/ply/lex.py
index 8ba2051..ed1e2ed 100644
--- a/ply/lex.py
+++ b/ply/lex.py
@@ -171,7 +171,10 @@ class Lexer:
# ------------------------------------------------------------
# writetab() - Write lexer information to a table file
# ------------------------------------------------------------
- def writetab(self, basetabmodule, outputdir=''):
+ def writetab(self, lextab, outputdir=''):
+ if isinstance(lextab, types.ModuleType):
+ raise IOError("Won't overwrite existing lextab module")
+ basetabmodule = lextab.split('.')[-1]
filename = os.path.join(outputdir, basetabmodule) + '.py'
with open(filename, 'w') as tf:
tf.write('# %s.py. This file automatically created by PLY (version %s). Don\'t edit!\n' % (basetabmodule, __version__))
@@ -885,29 +888,13 @@ def lex(module=None, object=None, debug=False, optimize=False, lextab='lextab',
else:
ldict = get_caller_module_dict(2)
- if outputdir is None:
- # If no output directory is set, the location of the output files
- # is determined according to the following rules:
- # - If lextab specifies a package, files go into that package directory
- # - Otherwise, files go in the same directory as the specifying module
- if '.' not in lextab:
- srcfile = ldict['__file__']
- else:
- parts = lextab.split('.')
- pkgname = '.'.join(parts[:-1])
- exec('import %s' % pkgname)
- srcfile = getattr(sys.modules[pkgname], '__file__', '')
- outputdir = os.path.dirname(srcfile)
-
# Determine if the module is package of a package or not.
# If so, fix the tabmodule setting so that tables load correctly
pkg = ldict.get('__package__')
- if pkg:
+ if pkg and isinstance(lextab, str):
if '.' not in lextab:
lextab = pkg + '.' + lextab
- baselextab = lextab.split('.')[-1]
-
# Collect parser information from the dictionary
linfo = LexerReflect(ldict, log=errorlog, reflags=reflags)
linfo.get_all()
@@ -1029,8 +1016,24 @@ def lex(module=None, object=None, debug=False, optimize=False, lextab='lextab',
# If in optimize mode, we write the lextab
if lextab and optimize:
+ if outputdir is None:
+ # If no output directory is set, the location of the output files
+ # is determined according to the following rules:
+ # - If lextab specifies a package, files go into that package directory
+ # - Otherwise, files go in the same directory as the specifying module
+ if isinstance(lextab, types.ModuleType):
+ srcfile = lextab.__file__
+ else:
+ if '.' not in lextab:
+ srcfile = ldict['__file__']
+ else:
+ parts = lextab.split('.')
+ pkgname = '.'.join(parts[:-1])
+ exec('import %s' % pkgname)
+ srcfile = getattr(sys.modules[pkgname], '__file__', '')
+ outputdir = os.path.dirname(srcfile)
try:
- lexobj.writetab(baselextab, outputdir)
+ lexobj.writetab(lextab, outputdir)
except IOError as e:
errorlog.warning("Couldn't write lextab module %r. %s" % (lextab, e))
diff --git a/ply/yacc.py b/ply/yacc.py
index f18e3eb..e0b4faf 100644
--- a/ply/yacc.py
+++ b/ply/yacc.py
@@ -2692,7 +2692,11 @@ class LRGeneratedTable(LRTable):
# This function writes the LR parsing tables to a file
# -----------------------------------------------------------------------------
- def write_table(self, basemodulename, outputdir='', signature=''):
+ def write_table(self, tabmodule, outputdir='', signature=''):
+ if isinstance(tabmodule, types.ModuleType):
+ raise IOError("Won't overwrite existing tabmodule")
+
+ basemodulename = tabmodule.split('.')[-1]
filename = os.path.join(outputdir, basemodulename) + '.py'
try:
f = open(filename, 'w')
@@ -3204,22 +3208,26 @@ def yacc(method='LALR', debug=yaccdebug, module=None, tabmodule=tab_module, star
# is determined according to the following rules:
# - If tabmodule specifies a package, files go into that package directory
# - Otherwise, files go in the same directory as the specifying module
- if '.' not in tabmodule:
- srcfile = pdict['__file__']
+ if isinstance(tabmodule, types.ModuleType):
+ srcfile = tabmodule.__file__
else:
- parts = tabmodule.split('.')
- pkgname = '.'.join(parts[:-1])
- exec('import %s' % pkgname)
- srcfile = getattr(sys.modules[pkgname], '__file__', '')
+ if '.' not in tabmodule:
+ srcfile = pdict['__file__']
+ else:
+ parts = tabmodule.split('.')
+ pkgname = '.'.join(parts[:-1])
+ exec('import %s' % pkgname)
+ srcfile = getattr(sys.modules[pkgname], '__file__', '')
outputdir = os.path.dirname(srcfile)
# Determine if the module is package of a package or not.
# If so, fix the tabmodule setting so that tables load correctly
pkg = pdict.get('__package__')
- if pkg and '.' not in tabmodule:
- tabmodule = pkg + '.' + tabmodule
+ if pkg and isinstance(tabmodule, str):
+ if '.' not in tabmodule:
+ tabmodule = pkg + '.' + tabmodule
+
- basetabmodule = tabmodule.split('.')[-1]
# Set start symbol if it's specified directly using an argument
if start is not None:
@@ -3432,7 +3440,7 @@ def yacc(method='LALR', debug=yaccdebug, module=None, tabmodule=tab_module, star
# Write the table file if requested
if write_tables:
try:
- lr.write_table(basetabmodule, outputdir, signature)
+ lr.write_table(tabmodule, outputdir, signature)
except IOError as e:
errorlog.warning("Couldn't create %r. %s" % (tabmodule, e))