diff options
Diffstat (limited to 'ply')
-rw-r--r-- | ply/lex.py | 41 | ||||
-rw-r--r-- | ply/yacc.py | 30 |
2 files changed, 41 insertions, 30 deletions
@@ -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)) |