14479Sbinkertn@umich.edu#!/usr/local/bin/python
24479Sbinkertn@umich.edu# yply.py
34479Sbinkertn@umich.edu#
44479Sbinkertn@umich.edu# Author: David Beazley (dave@dabeaz.com)
54479Sbinkertn@umich.edu# Date  : October 2, 2006
64479Sbinkertn@umich.edu#
74479Sbinkertn@umich.edu# Converts a UNIX-yacc specification file into a PLY-compatible
84479Sbinkertn@umich.edu# specification.   To use, simply do this:
94479Sbinkertn@umich.edu#
104479Sbinkertn@umich.edu#   % python yply.py [-nocode] inputfile.y >myparser.py
114479Sbinkertn@umich.edu#
124479Sbinkertn@umich.edu# The output of this program is Python code. In the output,
134479Sbinkertn@umich.edu# any C code in the original file is included, but is commented.
144479Sbinkertn@umich.edu# If you use the -nocode option, then all of the C code in the
154479Sbinkertn@umich.edu# original file is discarded.
164479Sbinkertn@umich.edu#
174479Sbinkertn@umich.edu# Disclaimer:  This just an example I threw together in an afternoon.
184479Sbinkertn@umich.edu# It might have some bugs.  However, it worked when I tried it on
194479Sbinkertn@umich.edu# a yacc-specified C++ parser containing 442 rules and 855 parsing
204479Sbinkertn@umich.edu# states.
214479Sbinkertn@umich.edu#
224479Sbinkertn@umich.edu
234479Sbinkertn@umich.eduimport sys
244479Sbinkertn@umich.edusys.path.insert(0,"../..")
254479Sbinkertn@umich.edu
264479Sbinkertn@umich.eduimport ylex
274479Sbinkertn@umich.eduimport yparse
284479Sbinkertn@umich.edu
294479Sbinkertn@umich.edufrom ply import *
304479Sbinkertn@umich.edu
314479Sbinkertn@umich.eduif len(sys.argv) == 1:
324479Sbinkertn@umich.edu    print "usage : yply.py [-nocode] inputfile"
334479Sbinkertn@umich.edu    raise SystemExit
344479Sbinkertn@umich.edu
354479Sbinkertn@umich.eduif len(sys.argv) == 3:
364479Sbinkertn@umich.edu    if sys.argv[1] == '-nocode':
374479Sbinkertn@umich.edu         yparse.emit_code = 0
384479Sbinkertn@umich.edu    else:
394479Sbinkertn@umich.edu         print "Unknown option '%s'" % sys.argv[1]
404479Sbinkertn@umich.edu         raise SystemExit
414479Sbinkertn@umich.edu    filename = sys.argv[2]
424479Sbinkertn@umich.eduelse:
434479Sbinkertn@umich.edu    filename = sys.argv[1]
444479Sbinkertn@umich.edu
454479Sbinkertn@umich.eduyacc.parse(open(filename).read())
464479Sbinkertn@umich.edu
474479Sbinkertn@umich.eduprint """
484479Sbinkertn@umich.eduif __name__ == '__main__':
494479Sbinkertn@umich.edu    from ply import *
504479Sbinkertn@umich.edu    yacc.yacc()
514479Sbinkertn@umich.edu"""
524479Sbinkertn@umich.edu
534479Sbinkertn@umich.edu
54