home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 11 Util / 11-Util.zip / MAWK113.ZIP / mawk113 / modbison.awk < prev    next >
Text File  |  1992-06-11  |  1KB  |  67 lines

  1. #
  2. # This awk script removes bison's use of alloca()
  3. #
  4. # If the parser stack overflows, bison reallocates the stack using
  5. # alloca().  The chance of parser overflow on an awk program is nil,
  6. # and since mawk never uses alloca() and some systems don't have it
  7. # the most portable solution is to #if 0  it out
  8. #
  9. # This script works with bison 1.14 and 1.18
  10. #
  11.  
  12. # Also with bison 1.14, two arrays yyphrs[] and yyrhs[] slip
  13. # through that aren't needed if YYDEBUG == 0 so this script
  14. # also puts #if YYDEBUG != 0  conditionals around them.  This
  15. # only matters to those with small (64K) or so memory.
  16.  
  17. # This script is useful for any bison output to be used for
  18. # example under MsDOS with a small model program.
  19.  
  20.  
  21.  
  22. BEGIN { state = 0 }
  23.  
  24. NR==2 && $0 !~ /Bison/ {
  25.   print "modbison: y.tab.c is not Bison output" | "cat 1>&2"
  26.   exit 1
  27. }
  28.  
  29.  
  30. state == 0 && $0 ~ /^static const short yyprhs\[\] = {/ {
  31.  
  32.   print "#if YYDEBUG != 0"
  33.   print
  34.   state = 1
  35.   next
  36. }
  37.  
  38.  
  39. state == 1 && $0 ~ /^#if YYDEBUG/ {
  40.  
  41.   print "#endif"
  42.   print 
  43.   state = 2
  44.   next
  45. }
  46.  
  47. state == 2 && $0 ~ /^[ \t]*if \(yyssp >= yyss \+ yystacksize - 1\)/ {
  48.  
  49.    print ; getline ; print
  50.    print "/* bison output modified to quit on stack overflow */"
  51.    print "\tfprintf(stderr ,\"bison parser overflow\\n\") ;"
  52.    print "\treturn 2 ;"
  53.    print "#if 0"
  54.    state = 3
  55.    next
  56. }
  57.  
  58. state == 3 && $0 ~ /YYABORT/ {
  59.    print
  60.    print "#endif  /* if 0 */"
  61.    state = 4
  62.    next
  63. }
  64.  
  65. { print }
  66.      
  67.