%x comment
%x comtwo
%x slt
%{
/*****************************************
  Team: Jon Gregory, Gor Nishanov
                  
      A "Pretty Print" utility
            for
       Java code

  written in Flex
 
 Project #2 (Pretty Printer portion)
 for RPI course 66-648 Compiler Design Theory

  March 7, 1997

 Made from modified code
from Lex part of Project #1

Mar 8, 1997

Modified again to churn out a HTML text file
that looks nice when viewed with an HTML viewer!

March 9, 1997

Modified to handle all lessthan and greater than
instances in comments, strings, etc...

 *****************************************/
int nindent = 0;
int nparan = 0;
int olom = 0;
int dflag = 0;
int ifwflag = 0;
int indamt = 1;
int nbrac = 1;
int lind = 0;
int dind = 0;
int amind[600];
int dfarr[600];
int dcar[600];
int lslb=0;
int aa =0;
int dclear=20;
int dwow=0;
int dwlc=0;
int tfl=0;


void dwipe( ) 
  { int q;
   for (q=0; q <= 599; ++q) dfarr[q]=0;
   }

void bnspace( snum ) int snum;
  { int sct;
    printf("\n<UL></UL>");
    if (snum>0 )
       for (sct=0; sct < snum; ++sct) printf("<UL>");
    if (snum<0 )
       for (sct=0; sct > snum; --sct) printf("</UL>");
   }

int adr( snum ) int snum;
  {    if (snum<10 ) {
              printf("<HTML><HEAD><TITLE>Java - beautified</TITLE><BODY>");
              printf("<TT>"); snum=50;}
   return snum;
}

void nspace( snumm ) int snumm;
  { int sctt;
    printf("\n<UL></UL>");
    if (snumm>0 )
       for (sctt=0; sctt <= snumm; ++sctt) printf("<UL>");
   }


%}

OctalDigit        [0-7]
DecimalDigit      [0-9]
HexDigit          [0-9a-fA-F]
NonzeroDigit      [1-9]

HexPrefix         0[xX]
Sign              [\+\-]
ExponentLetter    [eE]
IntegerSuffix     [lL]
FloatSuffix       [fFdD]

DecimalLiteral    {NonzeroDigit}{DecimalDigit}*
HexLiteral        {HexPrefix}{HexDigit}+
OctalLiteral      0{OctalDigit}*
Digits            {DecimalDigit}+
Exponent          {ExponentLetter}({Sign}?{DecimalDigit}+)?

CrazyFloat        "."{Digits}{Exponent}?{FloatSuffix}?
NormalFloat       {Digits}"."{Digits}?{Exponent}?{FloatSuffix}?
NominalFloat      {Digits}{FloatSuffix}
NoDotFloat        {Digits}{Exponent}{FloatSuffix}?

FloatingPointLiteral ({NormalFloat}|{NominalFloat}|{NoDotFloat}|{CrazyFloat})
IntegerLiteral       ({DecimalLiteral}|{HexLiteral}|{OctalLiteral}){IntegerSuffix}?

%%

{FloatingPointLiteral}  { tfl=adr(tfl);   printf (yytext); printf(""); }
{IntegerLiteral}        { tfl=adr(tfl);   printf (yytext); printf(""); }

"abstract"       { tfl=adr(tfl);  if (dclear>10) dwipe; if (dclear>10) dclear=0;
                   if (lslb==50) { dind=nindent-lind;bnspace(dind);lind=nindent;} lslb=0; printf("<B>"); printf(yytext); printf("</B>"); printf(" "); }
"boolean"        { tfl=adr(tfl);   printf("<B>"); printf(yytext); printf("</B>"); printf(" "); }
"break"          { tfl=adr(tfl);   printf("<B>"); printf(yytext); printf("</B>"); printf(" "); }
"byte"           { tfl=adr(tfl);   printf("<B>"); printf(yytext); printf("</B>"); printf(" "); }
"case"           { tfl=adr(tfl);   printf("<B>"); printf(yytext); printf("</B>"); printf(" "); }
"catch"          { tfl=adr(tfl);   printf("<B>"); printf(yytext); printf("</B>"); printf(" "); }
"char"           { tfl=adr(tfl);   printf("<B>"); printf(yytext); printf("</B>"); printf(" "); }
"class"          { tfl=adr(tfl);  if (dclear>10) dwipe; if (dclear>10) dclear=0;
                    if (lslb==50) { dind=nindent-lind;bnspace(dind);lind=nindent;} lslb=0;  printf("<B>"); printf(yytext); printf("</B>"); printf(" "); }
"const"          { tfl=adr(tfl);   printf("<B>"); printf(yytext); printf("</B>"); printf(" "); }
"continue"       { tfl=adr(tfl);   printf("<B>"); printf(yytext); printf("</B>"); printf(" "); }
"default"        { tfl=adr(tfl);   printf("<B>"); printf(yytext); printf("</B>"); printf(" "); }
"do"             { tfl=adr(tfl);   dfarr[nbrac]=50; ++dwlc; dcar[nbrac]=dwlc; printf("<B>"); printf(yytext); printf("</B>"); printf(" "); olom=50; dflag=50;
                    nindent=nindent+indamt;
                     printf("<I>");
               printf("   //   &lt;---  top of DO-WHILE loop # %d ",dcar[nbrac]);
                 printf("</I>");
                    dind=nindent-lind;bnspace(dind);lind=nindent;ifwflag=0;}




"double"         { tfl=adr(tfl);   printf("<B>"); printf(yytext); printf("</B>"); printf(" "); }

"else"[ \t\r\n]*"if"  { tfl=adr(tfl);  printf("<B>"); printf ("elseif"); printf("</B>"); printf(" "); ifwflag=50; }



"else"           { tfl=adr(tfl);   printf("<B>"); printf(yytext); printf("</B>"); printf(" "); nindent=nindent+indamt;olom=50; }

"else"[ \t\r\n]*/"{"           { tfl=adr(tfl);  printf("<B>"); printf ("else ");printf("</B>");}



"extends"        { tfl=adr(tfl);  if (dclear>10) dwipe; if (dclear>10) dclear=0;
                   if (lslb==50) { dind=nindent-lind;bnspace(dind);lind=nindent;} lslb=0;  printf("<B> "); printf(yytext); printf("</B>"); printf(" "); }
"final"          { tfl=adr(tfl);   printf("<B>"); printf(yytext); printf("</B>"); printf(" "); }
"finally"        { tfl=adr(tfl);   printf("<B>"); printf(yytext); printf("</B>"); printf(" "); }
"float"          { tfl=adr(tfl);   printf("<B>"); printf(yytext); printf("</B>"); printf(" "); }
"for"            { tfl=adr(tfl);   printf("<B>"); printf(yytext); printf("</B>"); printf(" "); ifwflag=50; }
"goto"           { tfl=adr(tfl);   printf("<B>"); printf(yytext); printf("</B>"); printf(" "); }
"if"             { tfl=adr(tfl);   printf("<B>"); printf(yytext); printf("</B>"); printf(" "); ifwflag=50; }
"implements"     { tfl=adr(tfl);   printf("<B> "); printf(yytext); printf("</B>"); printf(" "); }
"import"         { tfl=adr(tfl);   printf("<B>"); printf(yytext); printf("</B>"); printf(" "); }
"instanceof"     { tfl=adr(tfl);  if (dclear>10) dwipe; if (dclear>10) dclear=0;
                    if (lslb==50) { dind=nindent-lind;bnspace(dind);lind=nindent;} lslb=0;  printf("<B>"); printf(yytext); printf("</B>"); printf(" "); }
"int"            { tfl=adr(tfl);   printf("<B>"); printf(yytext); printf("</B>"); printf(" "); }
"interface"      { tfl=adr(tfl);  if (dclear>10) dwipe; if (dclear>10) dclear=0;
                    if (lslb==50) { dind=nindent-lind;bnspace(dind);lind=nindent;} lslb=0;  printf("<B>"); printf(yytext); printf("</B>"); printf(" "); }
"long"           { tfl=adr(tfl);   printf("<B>"); printf(yytext); printf("</B>"); printf(" "); }

"native"         { tfl=adr(tfl);   printf("<B>"); printf(yytext); printf("</B>"); printf(" "); }
"new"            { tfl=adr(tfl);   printf("<B>"); printf(yytext); printf("</B>"); printf(" "); }
"package"        { tfl=adr(tfl);   if (lslb==50) { dind=nindent-lind;bnspace(dind);lind=nindent;} lslb=0;  printf("<B>"); printf(yytext); printf("</B>"); printf(" "); }
"private"        { tfl=adr(tfl);   if (lslb==50) { dind=nindent-lind;bnspace(dind);lind=nindent;} lslb=0;  printf("<B>"); printf(yytext); printf("</B>"); printf(" "); }
"protected"      { tfl=adr(tfl);   printf("<B>"); printf(yytext); printf("</B>"); printf(" "); }
"public"         { tfl=adr(tfl);  if (lslb==50) { dind=nindent-lind;bnspace(dind);lind=nindent;} lslb=0; printf("<B>"); printf(yytext); printf("</B>"); printf(" "); }
"return"         { tfl=adr(tfl);   printf("<B>"); printf(yytext); printf("</B>"); printf(" "); }
"short"          { tfl=adr(tfl);   printf("<B>"); printf(yytext); printf("</B>"); printf(" "); }
"static"         { tfl=adr(tfl);  if (lslb==50) { dind=nindent-lind;bnspace(dind);lind=nindent;} lslb=0;  printf("<B>"); printf(yytext); printf("</B>"); printf(" "); }
"super"          { tfl=adr(tfl);   printf("<B>"); printf(yytext); printf("</B>"); printf(" "); }
"switch"         { tfl=adr(tfl);   printf("<B>"); printf(yytext); printf("</B>"); printf(" "); }
"synchronized"   { tfl=adr(tfl);   printf("<B>"); printf(yytext); printf("</B>"); printf(" "); }
"this"           { tfl=adr(tfl);   printf("<B>"); printf(yytext); printf("</B>"); printf(" "); }
"throw"          { tfl=adr(tfl);   printf("<B>"); printf(yytext); printf("</B>"); printf(" "); }
"throws"         { tfl=adr(tfl);   printf("<B>"); printf(yytext); printf("</B>"); printf(" "); }
"transient"      { tfl=adr(tfl);  if (lslb==50) { dind=nindent-lind;bnspace(dind);lind=nindent;} lslb=0;  printf("<B>"); printf(yytext); printf("</B>"); printf(" "); }
"try"            { tfl=adr(tfl);   printf("<B>"); printf(yytext); printf("</B>"); printf(" "); }
"void"           { tfl=adr(tfl);   if (lslb==50) { dind=nindent-lind;bnspace(dind);lind=nindent;} lslb=0;  printf("<B>"); printf(yytext); printf("</B>"); printf(" "); }
"volatile"       { tfl=adr(tfl);  if (lslb==50) { dind=nindent-lind;bnspace(dind);lind=nindent;} lslb=0;  printf("<B>"); printf(yytext); printf("</B>"); printf(" "); }
"while"          { tfl=adr(tfl);   printf("<B>"); printf(yytext); printf("</B>"); printf(" "); ifwflag=50; if (dflag==25) dwow=50;if (dflag==25) dflag=0;}

"*="       { tfl=adr(tfl);   printf (yytext);}
"/="       { tfl=adr(tfl);   printf (yytext);}
"%="       { tfl=adr(tfl);   printf (yytext); printf(""); }
"+="       { tfl=adr(tfl);   printf (yytext); printf(""); }
"-="       { tfl=adr(tfl);   printf (yytext); printf(""); }
"<<="      { tfl=adr(tfl);   printf ("&lt;&lt;="); printf(""); }
">>="      { tfl=adr(tfl);   printf ("&gt;&gt;="); printf(""); }
">>>="     { tfl=adr(tfl);   printf ("&gt;&gt;&gt;="); printf(""); }
"&="       { tfl=adr(tfl);   printf (yytext); printf(""); }
"^="       { tfl=adr(tfl);   printf (yytext); printf(""); }
"|="       { tfl=adr(tfl);   printf (yytext); printf(""); }
"="        { tfl=adr(tfl);   printf (yytext); printf(""); }

"++"       { tfl=adr(tfl);   printf (yytext); printf(""); }
"--"       { tfl=adr(tfl);   printf (yytext); printf(""); }

"=="       { tfl=adr(tfl);   printf (yytext); printf(""); }
"!="       { tfl=adr(tfl);   printf (yytext); printf(""); }

"<="       { tfl=adr(tfl);   printf ("&gt;="); printf(""); }
">="       { tfl=adr(tfl);   printf ("&lt;"); printf(""); }
">"        { tfl=adr(tfl);   printf ("&gt;="); printf(""); }
"<"        { tfl=adr(tfl);   printf ("&lt;"); printf(""); }

"||"       { tfl=adr(tfl);   printf (yytext); printf(""); }
"&&"       { tfl=adr(tfl);   printf (yytext); printf(""); }

">>"       { tfl=adr(tfl);   printf ("&gt;&gt;"); printf(""); }
"<<"       { tfl=adr(tfl);   printf ("&lt;&lt;"); printf(""); }
">>>"      { tfl=adr(tfl);   printf ("&gt;&gt;&gt;"); printf(""); }

[\(][ \t\r\n]*[\)]   { tfl=adr(tfl);   printf ("()"); }

[\{][ \t\r\n]*[\}]   { tfl=adr(tfl);   printf ("{ }"); printf("\n<UL></UL>");}


[\)][ \t\r\n]*[\{]   { tfl=adr(tfl);  --nparan; ++nbrac; nindent=nindent+indamt;amind[nbrac]=nindent;
                   printf (")  {"); dind=nindent-lind;bnspace(dind);lind=nindent; ifwflag=0;}


"("       { tfl=adr(tfl);   lslb=0; printf (yytext); printf(""); ++nparan;}

")"       { tfl=adr(tfl);   lslb=0; printf (yytext); printf(""); --nparan;
                if ( ( nparan==0 ) && ( dwow== 50)) ifwflag=0;
                if ( ( nparan==0 ) && ( dwow== 50)) olom=0;
                if ( ( nparan==0 ) && ( dwow== 50)) dwow=1;
                if ( ( nparan==0 ) && ( ifwflag== 50)) nindent=nindent+indamt;
                if ( ( nparan==0 ) && ( ifwflag== 50))  olom=50;
                if ( ( nparan==0 ) && ( ifwflag== 50)) { dind=nindent-lind;bnspace(dind);lind=nindent;}
                if ( ( nparan==0 ) && ( ifwflag== 50)) ifwflag=0;
                }

"{"       { tfl=adr(tfl);   if (dclear>10) dwipe; if (dclear>10) dclear=0;
                 dflag=0; dwow=0; lslb=0; ++nbrac; if (olom==0) nindent=nindent+indamt;
           amind[nbrac]=nindent; olom=0;printf(yytext); dind=nindent-lind;bnspace(dind);lind=nindent;}



"}"       { tfl=adr(tfl);   dflag=0; --nbrac; aa=nindent-amind[nbrac];
             nindent=amind[nbrac];if (lslb==0) { dind=nindent-lind;bnspace(dind);lind=nindent;}
             if (lslb==50) { dind=0-aa; bnspace(dind); lind=lind-aa;}
             printf (yytext); nindent=amind[nbrac]; dind=nindent-lind;bnspace(dind);lind=nindent; lslb=50;
             if (dfarr[nbrac]==50) dflag=25;if (dfarr[nbrac]==50) dfarr[nbrac]=0;
              if (nbrac==1) { dind=nindent-lind;bnspace(dind);lind=nindent;}}

"["       { tfl=adr(tfl);   printf (yytext); printf(""); }
"]"       { tfl=adr(tfl);   printf (yytext); printf(""); }
";"       { tfl=adr(tfl);   lslb=0; printf (yytext); printf(" ");
              if (dwow==1) printf("<I>");
              if (dwow==1) printf("   //   &lt;---  bottom of DO-WHILE loop # %d ",dcar[nbrac]);
              if (dwow==1) printf("</I>");
             if (dwow==1) dwow=0; 
            if (ifwflag==0) nindent=amind[nbrac];
            if (ifwflag==0) { dind=nindent-lind;bnspace(dind);lind=nindent; }
            if (ifwflag==0)  lslb=50;
             olom=0;
             if (dflag==50) dflag=25;}
","       { tfl=adr(tfl);   printf (yytext); printf(" "); }
"."       { tfl=adr(tfl);   printf (yytext); printf(""); }
"?"       { tfl=adr(tfl);   printf (yytext); printf(""); }
":"       { tfl=adr(tfl);   printf (yytext); printf(""); }

"^"       { tfl=adr(tfl);   printf (yytext); printf(""); }

"&"       { tfl=adr(tfl);   printf (yytext); printf(""); }
"|"       { tfl=adr(tfl);   printf (yytext); printf(""); }

"+"       { tfl=adr(tfl);   printf (yytext); printf(""); }
"-"       { tfl=adr(tfl);   printf (yytext); printf(""); }

"/"       { tfl=adr(tfl);   printf (yytext); printf(""); }
"*"       { tfl=adr(tfl);   printf (yytext); printf(""); }
"%"       { tfl=adr(tfl);   printf (yytext); printf(""); }

"~"       { tfl=adr(tfl);   printf (yytext); printf(""); }
"!"       { tfl=adr(tfl);   printf (yytext); printf(""); }

"null"   { tfl=adr(tfl);   printf (yytext); printf(""); }
"true"   { tfl=adr(tfl);   printf (yytext); printf(""); }
"false"  { tfl=adr(tfl);   printf (yytext); printf(""); }

\"     { BEGIN slt;tfl=adr(tfl);  lslb=0;  printf (yytext); printf(""); } /* StringLiteral*/
<slt>"<"   {  printf ("&lt;"); } /* StringLiteral*/
<slt>">"   {  printf ("&gt;"); } /* StringLiteral*/
<slt>[^"<>\n]*     {  lslb=0;  printf (yytext); printf(""); } /* StringLiteral*/
<slt>\"     { BEGIN INITIAL ;  lslb=0;  printf (yytext); printf(""); } /* StringLiteral*/

\'[^\'<>\n]+\'     { tfl=adr(tfl);  lslb=0;  printf (yytext); printf(""); } /* CharLiteral */
\'+"<"+\'     { tfl=adr(tfl);  lslb=0;  printf ("'&lt;'"); printf(""); } /* CharLiteral */
\'+">"+\'     { tfl=adr(tfl);  lslb=0; printf ("'&gt;'"); printf(""); } /* CharLiteral */

[a-zA-Z_][a-zA-Z0-9_]*    { tfl=adr(tfl);  lslb=0;  printf (yytext); printf(""); }

"/*"         {  BEGIN comment; tfl=adr(tfl); lslb=0; printf("<I>"); printf (yytext);}



<comment>[^*<>\n]*        {  printf (yytext); printf(" "); }
<comment>"*"+[^*<>/\n]*   {  printf (yytext); printf(" "); }
<comment>"<"   {  printf ("&lt;"); }
<comment>">"   {  printf ("&gt;"); }
<comment>\n             {  dind=nindent-lind;bnspace(dind);lind=nindent; }
<comment>"*"+"/"        { BEGIN INITIAL ;  printf (yytext);printf("</I>"); printf(" ");  dind=nindent-lind;bnspace(dind);lind=nindent; }


"//"    {  BEGIN comtwo; tfl=adr(tfl); lslb=0; printf("<I>"); printf (yytext); }
<comtwo>[^<>\n]*        {  printf (yytext);}
<comtwo>"<"   {  printf ("&lt;"); }
<comtwo>">"   {  printf ("&gt;"); }
<comtwo>\n             { BEGIN INITIAL ;  printf("</I>");dind=nindent-lind;bnspace(dind);lind=nindent; }

[ \t\r]+   { tfl=adr(tfl);   if (dclear>10) dwipe; if (dclear>10) dclear=0;
                    printf (""); }

"\n"     { tfl=adr(tfl);   if (dclear>10) dwipe; if (dclear>10) dclear=0;
                   printf (""); }

.     { tfl=adr(tfl);   printf (" HEY this aint good "); }


%%
int yywrap()  { printf("</TT>"); printf("</BODY> </HTML>"); return 1; }






