|
下のプログラムですが、簡単な電卓のプログラムなんだけど、いまいちどのように働いているのか分かりません・・ ソースにコメントを付けて分かりやすくしたいのですけど、誰か助けて!
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
void error(const char *emsg) { fprintf(stderr, "%s", emsg), exit(1); }
typedef enum {
NUMBER, PRINT, END, BAD_TOKEN,
PLUS = '+', MINUS = '-', MUL = '*', DIV = '/',
LP = '(', RP = ')',
} Token_type;
int value;
Token_type token;
Token_type gettok(void)
{
int c;
while (isspace(c = getchar()) && c != '\n')
;
switch (c) {
case '\n':
return token = PRINT;
case EOF:
return token = END;
case '+':
case '-':
case '*':
case '/':
case '(':
case ')':
return token = c;
default:
if (isdigit(c)) {
ungetc(c, stdin);
scanf("%d", &value);
return token = NUMBER;
}
return token = BAD_TOKEN;
}
}
int expr(void);
int prime(void)
{
switch (gettok()) {
int e;
case NUMBER:
return value;
case '(':
e = expr();
if (token != ')')
error("括弧が閉じていません");
return e;
default:
error("Bad token\n");
}
}
int term(void)
{
int left = prime();
for (;;)
switch (gettok()) {
case '*':
left *= prime();
break;
case '/':
left /= prime();
break;
default:
return left;
}
}
int expr(void)
{
int left = term();
for (;;)
switch (token) {
case '+':
left += term();
break;
case '-':
left -= term();
break;
default:
return left;
}
}
int main(void)
{
for (;;)
printf("%d\n", expr());
return 0;
}
|