#! /usr/bin/env python

#  Convert from bison *.yy file to BNF by stripping out
#   all of the c-code stuff
#
#  Copyright 2005 by Carl D. Sorensen
#

import sys
if len(sys.argv)!=3:
    print "Usage: yy.bnf yy_file bnf_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')
    percent_count = 0
    in_bnf = False
    quote_mode = False
    double_quote_mode = False
    comment_mode = False
    esc_mode = False
    output_mode = False
    bracket_level = 0
    half_comment = False

    ch=in_file.read(1)
    while ch != '':
       if esc_mode:
           if output_mode:
                out_file.write(ch)
           esc_mode = False
       elif ch == "\\":
           esc_mode = True
           if output_mode:
                out_file.write(ch)
       elif quote_mode:
           if ch=="'":
               quote_mode = False
           if output_mode:
                out_file.write(ch)
       elif double_quote_mode:
           if ch=='"':
              double_quote_mode = False
           if output_mode:
              out_file.write(ch)
       elif comment_mode:
           if ch == "*":
              half_comment = True
           elif half_comment and ch == "/":
              comment_mode = half_comment = False
           if output_mode:
              out_file.write(ch)
       else:
           if ch=="'":
               quote_mode = True
           if ch=="{":
               bracket_level = bracket_level+1
               output_mode = False
           if ch=="}":
               bracket_level = bracket_level-1
           if ch=="%":
               percent_count=percent_count+1
               if percent_count==2:
                   in_bnf =not(in_bnf)
           else:
               percent_count = 0
           if ch=="/":
              half_comment = True
           elif half_comment and ch=="*":
              comment_mode = True
           else:
              half_comment = False
           if output_mode:
               out_file.write(ch)
           if in_bnf and bracket_level==0:
               output_mode = True
           else:
               output_mode = False
       ch=in_file.read(1)
 
