Intel XENIX 286 Programmers Guide (86) - Tenox.tc

Intel XENIX 286 Programmers Guide (86) - Tenox.tc Intel XENIX 286 Programmers Guide (86) - Tenox.tc

09.06.2013 Views

XENIX Programming I* lexical analysis *I yylex(){ register c; {I* skip over blanks *I } while( ( c = getchar( )) = = ' ' ) if ( isupper(c) ){ yylval.ival = c-'A'; return( VREG ); } if ( islower(c) ){ yylval.ival = c -'a'; return( DREG ); } if( isdigit( c) II c = = '.' ){ I* gobble up digits, points, exponents *I char buf[BSZ + 1], * cp = buf; int dot = 0, exp = 0; for( ; (cp-buf) < BSZ ; + + cp,c = getchar() ){ *cp = c; if ( isdigit(c) ) continue; if(c =='.' ){ if( dot + + ll exp ) return( '.' ); I* above causes syntax error *I continue; } if (c = = 'e' ) { if ( exp + + ) return( ' e' ); I* above causes syntax error *I continue; } I* end of number *I break; } *cp = '\eO'; if( (cp-buf) > = BSZ ) printf( "constant too long: truncated\n"); else ungetc( c, stdin ); I* above pushes back last char read *I yylval.dval = atof { buf ); return{ CONST ); } return{ c); } yacc: Compiler-Compiler 10-37

yacc: Compiler-Compiler 10-38 INTERVAL hilo( a, b, c, d ) double a, b, c, d; { I* returns the smallest interval containing a, b, c, and d *I I* used by *, I routines *I INTERVAL v; if( a>b) { v.hi = a; v.lo = b; } else { v.hi = b; v.lo = a; } if( c>d ) { if ( c>v.hi ) v.hi = c; if ( d v.hi ) v.hi = d; if ( c = 0. && v.lo < = 0. ){ printf( "divisor interval contains 0.\n" ); return( 1); } return(O); } INTERVAL vdiv( a, b, v) double a, b; INTERVAL v; { return( hilo( alv.hi, alv.lo, blv.hi, blv.lo) ); } XENIX Programming

<strong>XENIX</strong> Programming<br />

I* lexical analysis *I<br />

yylex(){<br />

register c;<br />

{I* skip over blanks *I }<br />

while( ( c = ge<strong>tc</strong>har( )) = = ' ' )<br />

if ( isupper(c) ){<br />

yylval.ival = c-'A';<br />

return( VREG );<br />

}<br />

if ( islower(c) ){<br />

yylval.ival = c -'a';<br />

return( DREG );<br />

}<br />

if( isdigit( c) II c = = '.' ){<br />

I* gobble up digits, points, exponents *I<br />

char buf[BSZ + 1], * cp = buf;<br />

int dot = 0, exp = 0;<br />

for( ; (cp-buf) < BSZ ; + + cp,c = ge<strong>tc</strong>har() ){<br />

*cp = c;<br />

if ( isdigit(c) ) continue;<br />

if(c =='.' ){<br />

if( dot + + ll exp ) return( '.' );<br />

I* above causes syntax error *I<br />

continue;<br />

}<br />

if (c = = 'e' ) {<br />

if ( exp + + ) return( ' e' );<br />

I* above causes syntax error *I<br />

continue;<br />

}<br />

I* end of number *I<br />

break;<br />

}<br />

*cp = '\eO';<br />

if( (cp-buf) > = BSZ )<br />

printf( "constant too long: truncated\n");<br />

else unge<strong>tc</strong>( c, stdin );<br />

I* above pushes back last char read *I<br />

yylval.dval = atof { buf );<br />

return{ CONST );<br />

}<br />

return{ c);<br />

}<br />

yacc: Compiler-Compiler<br />

10-37

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!