int curloc;  
int lexval;  
int token;  
int pusharg;  
int thechar;  
int nglob;  
int nlocal;  
int nfun;  
int strsize;  
int narg;  
int curgloboffs;  
int nsym;  
int pushop;  
int argids[50 ];
int globids[300 ];
int globoffs[300 ];
int globscalar[300 ];
int funids[300 ];
int funoffs[300 ];
int localids[50 ];
char symbol[5000 ];
char code[5000 ];
char names[5000 ];
int
digit(int c)
{
    return (( '/' < c ) * (  c < ':' )) ;
}
int
letter(int c)
{
    return (( '`' < c ) * (  c < '{' )) 
        ;
}
int
eqstr(char *p, char *q)
{
    while(*p) {
	if (*p++ != *q++)
	    return 0;
    }
    return !*q;
}
int
lookup(char *name)
{
    int i;
    char *ns;
    ns = names;
    i = 0;
    while(i < nsym) {
	if (eqstr(ns, name)) {
	    return i;
	}
	while(*ns++)
	    ;
	i++;
    }
    while(*ns++ = *name++)
	;
    return nsym++;
}
int
next()
{
    int r;
    r = thechar;
    thechar = getchar();
    return r;
}
int
gobble(int t, int rr, int r)
{
    if (thechar == t) {
	next();
	return rr;
    }
    return r;
}
int
getstring(int delim)
{
    int c;
    strsize = 0;
    while((c = next()) != delim) {
	if (c == '\\') {
	    if ( (c = next()) == 'n') c = '\n';
	      if (c == 't') c = '\t';
	      if (c == '0') c = 0;
	}
	symbol[strsize++] = c;
    }
    symbol[strsize++] = 0;
}
int
getlex()
{
    int c;
    char *p;
    while( (( 0 < (c = next()) ) * (  c < '!' )) )	 
	;
    if ((( c == -1 ) + ( 
	(( c == '(' ) + ( 
	(( c == ')' ) + ( 
        (( c == '[' ) + ( 
        (( c == ']' ) + ( 
        (( c == '{' ) + ( 
        (( c == '}' ) + ( 
        (( c == ',' ) + ( 
            c == ';' ))  ))  ))  ))  ))  ))  ))  )) )
	return c;
    if (c == '/') {
	if (thechar == '*') {
	    while((( next() != '*' ) + (  thechar != '/' )) )
		;
	    next();
	    return getlex();
	} else
	    return 1115 ;
    }
    if (c == '*') return 1114 ;
    if (c == '%') return 1116 ;
    if (c == '-')
	return gobble(c,1225 ,1013 );
    if (c == '<')
	return 808 ;
    if (c == '=')
	return gobble(c,806 ,101 );
    if (c == '+')
	return gobble(c,1219 ,1012 );
    if (c == '!')
	return gobble('=',807 ,1217 );
    if (c == '\'') {
	getstring(c);
	lexval = symbol[0];
	return 257 ;
    }
    if (c == '"') {
	getstring(c);
	return 258 ;
    }
    if (digit(c)) {
	lexval = c - '0';
	while(digit(thechar)) {
	    lexval = lexval * 10 + next() - '0';
	}
	return 257 ;
    }
	p = symbol;
	*p++ = c;
	while(letter(thechar))
	    *p++ = next();
	*p = 0;
	if ( (lexval = lookup(symbol)) < 7 ) {
	    if (lexval == 6 )
		return 517 ;
	    return lexval + 512 ;
	}
	return 256 ;
}
int 
istoken(int t)
{
    if (token == t) {
	token = getlex();
	return 1;
    }
    return 0;
}
int
type()
{
    istoken( 517  ) ;
    while(istoken(1114 ))
	;
}
int
name()
{
    int r;
    r = lexval;
    token = getlex();
    return r;
}
int
emit(int opc)
{
    code[curloc++] = opc;
}
int
emitat(int a, int c)
{
    code[a++] = c;
    code[a] = c/256;
}
int
emitop(int rator, int rand)
{
    int r;
    emit(rator+ 7 );
    r = curloc;
    emit(rand);
    emit(rand/256);
    return r;
}
int
pushloop(int puop, int max, int *arr)
{
    int i;
    i = 0;
    pushop = puop;
    while (i < max) {
	if (arr[i] == lexval) {
	    pusharg = i;
	    return 1;
	}
	i++;
    }
    return 0;
}
int
pushval()
{
    int lval;
    lval = 1;
    if (pushloop(64 , nlocal, localids)) {
    } else if (pushloop(32 , narg, argids)) {
	pusharg = narg-pusharg-1;
    } else if (pushloop(96 , nglob, globids)) {
	lval = globscalar[pusharg];
	pusharg = globoffs[pusharg];
    } else {
	lval = 0;
	if (pushloop(192 , nfun, funids)) {
	    pusharg = funoffs[pusharg];
	} else if (lexval < 9 ) {
	    pusharg = lexval- 7 ;
	}
    }
    emitop(pushop, pusharg);
    return lval;
}
int
pderef(int l)
{
    if (l)
	emit(23 );
}
int
expr(int needval, int prec)
{
    int na;
    int islval;
    int jdst;
    int op;
    int any;
    int opprec;
    islval = 0;
    if (istoken(257 )) {
	emitop(128 , lexval);
    } else if (istoken(258 )) {
	emitop(144 , strsize);
	any = 0;
	while(any < strsize)
	    emit(symbol[any++]);
    } else if (istoken(256 )) {
	islval = pushval();
    } else if (istoken('(')) {
	islval = expr(0, 0 );
	istoken( ')' ) ;
    } else if (istoken(1217 )) {
	expr(1, 100 );
	emit(17 );
    } else if (istoken(1013 )) {
	expr(1, 100 );
	emit(18 );
    } else if (istoken(1114 )) {
	expr(1, 100 );
	islval = 1;
    } 
    any = 1;
    while(any) {
	op = token % 100 ;
	if (istoken('(')) {
	    pderef(islval);
	    na = 0;
	    if (!istoken(')')) {
		do {
		    expr(1, 0 );
		    na++;
		} while(istoken(','));
		istoken( ')' ) ;
	    }
	    emitop(176 , na*2);
	    islval = 0;
	} else if (istoken('[')) {
	    pderef(islval);
	    expr(1, 0 );
	    emit(12 );
	    istoken( ']' ) ;
	    islval = 1;
	} else if (istoken(1219 )) {
	    emit(op);
	    islval = 0;
	} else if (istoken(1225 )) {
	    emit(op);
	    islval = 0;
	} else
	    any = 0;
    }
    opprec = token / 100 ;
    while (prec < opprec) {
	if ( (op = token % 100 ) != 1 ) {
	    pderef(islval);
	}
	{
	    token = getlex();
	    expr(1, opprec);
	    emit(op);
	}
	islval = 0;
	opprec = token / 100 ;
    }
    if (needval) {
	pderef(islval);
	islval = 0;
    }
    return islval;
}
int
pexpr()
{
    istoken( '(' ) ;
    expr(1, 0 );
    istoken( ')' ) ;
}
int
stmt()
{
    int jdest;
    int tst;
    if (istoken('{')) {
	while(!istoken('}'))
	    stmt();
    } else if (istoken(513 )) {
	pexpr();
	jdest = emitop (224 , 0);
	stmt();
	if (istoken(514 )) {
	    tst = emitop (208 , 0);
	    emitat(jdest, curloc);
	    stmt();
	    emitat(tst, curloc);
	} else {
	    emitat(jdest, curloc);
	}
    } else if (istoken(515 )) {
	tst = curloc;
	pexpr();
	jdest = emitop (224 , 0);
	stmt();
	emitop (208 , tst);
	emitat(jdest, curloc);
    } else if (istoken(516 )) {
	jdest = curloc;
	stmt();
	istoken( 515  ) ;
	pexpr();
	emit(17 );
	emitop (224 , jdest);
    } else if (istoken(512 )) {
	expr(1, 0 );
	istoken( ';' ) ;
	emit(10 );
    } else if (istoken(';')) {
    } else {
	expr(1, 0 );
	emit(22 );
	istoken( ';' ) ;
    }
}
int
parse()
{
    int objid;
    token = getlex();
    while(1) {
	if (token < 0)
	    return 1;
	type();			 
	objid = name();		 
	if (istoken('(')) {
	    funids[nfun] = objid;
	    funoffs[nfun++] = curloc;
	    narg = 0;
	    if (!istoken(')')) {
		do {
		    type();
		    argids[narg++] = name();
		} while(istoken(','));
		istoken( ')' ) ;
	    }
	    istoken( '{' ) ;
	    nlocal = 0;
	    while(token == 517 ) {
		type();
		do {
		    localids[nlocal++] = name();
		} while (istoken(','));
		istoken( ';' ) ;
	    }
	    while(!istoken('}'))
		stmt();
	    emit(10 );
	} else {
	    globoffs[nglob] = curgloboffs;
	    if (istoken('[')) {
		istoken( 257  ) ;
		curgloboffs = curgloboffs + lexval;
		istoken( ']' ) ;
		globscalar[nglob] = 0;
	    } else {
		curgloboffs++;
		globscalar[nglob] = 1;
	    }
	    globids[nglob++] = objid;
	    istoken( ';' ) ;
	}
    }
}
int
main(
    )
{
    int n;
    char *p;
    char *q;
    nsym = 9 ;
    p = names;
    q = "return\0if\0else\0while\0do\0int\0char\0getchar\0putchar" ;
    n = 48 ;
    do
	*p++ = *q++;
    while(n--);
    curloc = 7;	 
    thechar = getchar();
    parse();
    n = curloc;
    curloc = 0;
    lexval = lookup("main");
    pushval();
    emitop(176 , 0);
    emit(27 );
    putchar(0);
    putchar(0);
    putchar(n);
    putchar(n/256);
    p = code;
    while(n--) {
	putchar(*p++);
    }
    return 0;
}
