+++ /dev/null
-#! /usr/bin/env python
-
-# Convert from bison output file parser.output to
-# Grammar and index.
-# Drops all of the state information.
-# Converts \\ to \
-# Eliminates the @ variables created when {} is placed in the middle of a rule## all of the c-code stuff
-#
-#
-# Copyright 2005 by Carl D. Sorensen
-#
-
-# to create input file, run
-# bison -v parser.yy
-# this will create a file parser.output
-# then run
-# yyout2grammar.py parser.output your_output_file
-#
-
-import sys
-import re
-
-atre = re.compile('(@\d+):')
-
-write_me = True
-
-if len(sys.argv)!=3:
- print "Usage: yyout2grammar.py parser_output_file grammar_file."
-else:
- in_name = sys.argv[1]
- out_name = sys.argv[2]
-
- print "input file name",in_name
- print "output file name",out_name
- in_file = open(in_name,'r')
- out_file= open(out_name, 'w')
-
- at_items=[]
- inline = in_file.readline()
- while inline != '' and not(inline.startswith("Grammar")):
- inline = in_file.readline()
- if inline != '':
- out_file.write(inline)
- inline = in_file.readline()
- while inline != '' and not(inline.startswith("Terminals")):
- i = inline.find("$accept:")
- if i>-1:
- write_me = False
- inline = in_file.readline()
- atfound = re.findall(atre,inline)
- if len(atfound) > 0:
- at_items.extend(atfound)
- print at_items
- write_me = False
- inline=in_file.readline()
- else:
- for at_item in at_items:
- i=inline.find(at_item)
- if i >= 0:
- inline=inline[:i] + inline[i+len(at_item):]
- i=inline.find('"\\\\')
- while i > -1 :
- inline = inline[:i+1]+inline[i+2:]
- i = inline.find('"\\\\')
- if write_me:
- out_file.write(inline)
- inline = in_file.readline()
- write_me = True
- index_items = []
- # Write the Terminals header line and the following blank line
- out_file.write(inline)
- inline = in_file.readline()
- out_file.write(inline)
- inline = in_file.readline()
- while inline != '' and not(inline.startswith("Nonterminals")):
- i=inline.find('"\\\\')
- while i > -1 :
- inline = inline[:i+1]+inline[i+2:]
- i = inline.find('"\\\\')
- index_items.append(inline)
- inline = in_file.readline()
- index_items.sort(lambda x,y:cmp(x.lower(),y.lower()))
- for index_item in index_items:
- out_file.write(index_item)
- out_file.write('\n')
- # Write the Nonterminals header and the blank line
- out_file.write(inline)
- inline = in_file.readline()
- out_file.write(inline)
- index_items = []
- index_item=in_file.readline()
- inline=in_file.readline()
- while inline != '' and not(inline.startswith("state")):
- while inline.startswith(" "):
- index_item = index_item + inline
- inline = in_file.readline()
- if not(index_item.startswith("@")) and \
- not(index_item.startswith("$accept")):
- index_items.append(index_item)
- index_item = inline
- inline=in_file.readline()
- index_items.sort(lambda x,y:cmp(x.lower(),y.lower()))
- for index_item in index_items:
- out_file.write(index_item)