四則演算の字句解析を実装してみる。
コード↓
/* ---------サブルーチン(字句解析)ここから--------- */ /* --------------------------------- ・構造体のresultに字句の種類を格納 ・構造体のjikuに字句を格納 --------------------------------- */ int lexical_analysis() { int d,h,li,li2; d=0,h=0; for(li=0;li<MAXLENG;li++) { lexical_result[li].result=0; for(li2=0;li2<MAXLENG;li2++) { lexical_result[li].jiku[li2]=' '; } } n=1; o=1; op=getc(fp); while(1) { if(isspace(op)) {/* スペースの判定 */ putc(op,fp2); op=getc(fp); } else if(isalpha(op)) {/* 識別子の判定 */ lexical_result[d].result=1; lexical_result[d].jiku[h]=op; op=getc(fp); h++; while(isalnum(op)) { lexical_result[d].jiku[h]=op; op=getc(fp); h++; } fprintf(fp2,"i%d.%d",n,gyou_kaihi); n++; d++; h=0; } else if(isdigit(op)) {/* 定数の判定 */ lexical_result[d].result=2; lexical_result[d].jiku[h]=op; op=getc(fp); h++; while(isdigit(op)) { lexical_result[d].jiku[h]=op; op=getc(fp); h++; } fprintf(fp2,"num%d.%d",o,gyou_kaihi); o++; d++; h=0; } else if(op==':') {/* ':='の判定 */ lexical_result[d].result=3; lexical_result[d].jiku[h]=op; putc(op,fp2); op=getc(fp); h++; if(op=='=') { lexical_result[d].jiku[h]=op; putc(op,fp2); op=getc(fp); d++; h=0; } else { printf("lexical ERROR!\n"); /* ':'の次に'='がこなかったときエラー表示 */ } } else if(op=='+') {/* '+'の判定 */ lexical_result[d].result=4; lexical_result[d].jiku[h]=op; putc(op,fp2); op=getc(fp); d++; h=0; } else if(op=='-') {/* '-'の判定 */ lexical_result[d].result=5; lexical_result[d].jiku[h]=op; putc(op,fp2); op=getc(fp); d++; h=0; } else if(op=='*') {/* '*'の判定 */ lexical_result[d].result=6; lexical_result[d].jiku[h]=op; putc(op,fp2); op=getc(fp); d++; h=0; } else if(op=='/') {/* '/'の判定 */ lexical_result[d].result=7; lexical_result[d].jiku[h]=op; putc(op,fp2); op=getc(fp); d++; h=0; } else if(op=='(') {/* '('の判定 */ lexical_result[d].result=8; lexical_result[d].jiku[h]=op; putc(op,fp2); op=getc(fp); d++; h=0; } else if(op==')') {/* ')'の判定 */ lexical_result[d].result=9; lexical_result[d].jiku[h]=op; putc(op,fp2); op=getc(fp); d++; h=0; } else if(op==';') {/* ';'の判定 */ lexical_result[d].result=10; lexical_result[d].jiku[h]=op; break; } } return 0; } /* ---------サブルーチン(字句解析)ここまで--------- */