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