/*
Very Simple Compiler
Parser part
$Id: s-compile.c,v 1.2 96/11/16 01:15:20 kono Exp Locker: kono $
*/
#include < stdio.h>
void error(char *);
void expr();
int token();
char *ptr,*last_ptr,*before;
int value,lvalue;
int last_token;
int
token()
{
int c,d;
last_ptr = ptr; /* for error position */
c= *ptr;
if(!c) {
last_token = EOF;
return last_token;
}
ptr++;
if (c< =' ') { /* comment */
while(*ptr++);
ptr--;
last_token = EOF;
last_ptr = ptr;
return last_token;
}
if('0'< =c && c< ='9') { /* Decimal */
d = c-'0';
while(c= *ptr++) {
if('0'< =c && c< ='9') {
d = d*10 + (c - '0');
} else {
break;
}
}
c && ptr--;
value = d;
last_token = '0';
return last_token;
} else if ('a'< =c && c< ='z') { /* variable */
value = c-'a'; /* return variable reference */
last_token = 'v';
return last_token;
} else {
last_token = c;
return last_token;
return c;
}
}
void
expr()
{
do {
token();
switch(last_token) {
case '0':
printf("%d\tvalue\n",value);
break;
case 'v':
printf("%c\tvariable\n",value+'a');
break;
case EOF:
break;
default:
printf("%c\ttoken\n",last_token);
break;
}
} while(last_token!=EOF);
}
int
main()
{
int d;
char buf[BUFSIZ];
while (fgets(buf,BUFSIZ,stdin)) {
ptr = buf;
before = buf;
printf("#### %s",buf);
expr();
}
return 0;
}
void
error(s)
char *s;
{
fprintf(stderr,"%s on %s\n",s,last_ptr);
}
/* end */