字句解析メモ(C言語)

四則演算の字句解析を実装してみる。

コード↓

/* ---------サブルーチン(字句解析)ここから--------- */
/* ---------------------------------
・構造体の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;
}
/* ---------サブルーチン(字句解析)ここまで--------- */