2008-05-23

Recursive Decent Programming

I made two easy programs below by means of recursive decent, which benefits for programmers as programming recursive method. As an example of it, these programs are used several recursive methods, but they run properly because I only programmed along syntax rule of regular expression.

No.1 caliculate.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int get_cnt;
char ch;
char* s;

int logic();

void error(){
printf("error");
exit(0);
}

int ch2int(char c){
if(ch=='0') return 0;
else if(ch=='1') return 1;
else error();
}

void get_char(void){
ch = s[get_cnt];
get_cnt++;
}

int logic_val(){
int val;
if('0'<=ch && ch<='9'){
val = ch - '0';
printf("%d\n",val);
get_char();
return val;
}else error();
}

int element(){
int tmp;
if(ch=='('){
printf("%c\n",ch);
get_char();
tmp = logic();
if(ch==')'){
printf("%c\n",ch);
get_char();
}else error();
return tmp;
}else return logic_val();
}

int operand(){
if(ch=='-'){
printf("%c\n",ch);
get_char();
return -(element());
}
return element();
}

int logic(){
int tmp;
tmp = operand();
while(ch=='*'||ch=='+'){
if(ch=='*'){
printf("%c\n",ch);
get_char();
tmp *= operand();
}else if(ch=='+'){
printf("%c\n",ch);
get_char();
tmp += operand();
}
}
return tmp;
}

int main(int argc,char *argv[]){
int i,result;
get_cnt=0;
s = argv[1];
get_char();
result = logic();
printf("result: %d\n",result);
}




No.2 notation.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int get_cnt, temp;
char ch;
char* s;
int digit;

int logic();

void error(){
printf("error");
exit(0);
}

void get_char(void){
ch = s[get_cnt];
get_cnt++;
}

int val(){
int val;
if('0'<=ch && ch<='9'){
val = ch - '0';
printf("%d\n",val);
get_char();
return val;
}else error();
}


void binary(){
int val;
if(ch=='0' || ch=='1'){
val = ch - '0';
get_char();
if(ch!='\0'){
binary();
}
temp += val * digit;
digit*=2;
}else error();
}

void octal(){
int val;
if('0'<=ch && ch<='7'){
val = ch - '0';
get_char();
if(ch!='\0'){
octal();
}
temp += val * digit;
digit *= 8;
}else error();
}

void decimal(){
int val;
if('0'<=ch && ch<='9'){
val = ch - '0';
get_char();
if(ch!='\0'){
decimal();
}
temp += val * digit;
digit *= 10;
}else error();
}

int notation(void){
int tmp;
if(ch=='2'){
get_char();
if(ch=='#'){
get_char();
binary();
return temp;
}
}else if(ch=='8'){
get_char();
if(ch=='#'){
get_char();
octal();
return temp;
}
}

if('0'<=ch && ch<='9'){
decimal();
return temp;
}else error();
}


int main(int argc,char *argv[]){
int result;
temp = 0;
digit=1;
get_cnt=0;
s = argv[1];
get_char();
result = notation();
printf("result: %d\n",result);
}



 今日友達に「意志が弱い」って言われた。
 大抵は終電まで大学にいるけど、それでも家が近いから帰ってもまだ深夜一時位だ。それならあと2時間は勉強できるはずなのに、勉強してない。それが出来ない原因は俺の意志が弱いからだ、って言われた。




 核心つきすぎて笑えたw確かにw

 OS advance courceとlanguage processorのおかげで、どれだけ勉強しても多分taskが0になる事はほぼない。というか、UMLとかdata miningとかCPUの中の人とか、色々勉強したいこともある。だから、勉強出来る時間と体力が残っていれば、少しでも取り掛かるべきだ。でなければ、友達や天才ハカーに追いつくことは出来ないし、一方的に離されていくだけだ。ただでさえ動くのが遅かったのに。

 すぐに現状に満足してしまうのは悪い癖だ。まだまだ精神的に幼稚。もっと自分自身を律する生活を心がけよう。

0 件のコメント: