さてさて、構文解析1メモにおいてコーディングした構文解析部の残りのルーチン3つを今回は記載。
おさらいとして、以下のように解析の流れを構造化しておく。
/*
E → TE'
E' → +T[+}E'|ε
E' → -T[-}E'|ε
T → FT'
T' → *F[*]T'|ε
T' → /F[/]T'|ε
F → (E)|i[i]|num[num]
*/
/* E'がsyntactic_analysis_2()関数に対応 T'がsyntactic_analysis_3()関数に対応 F がsyntactic_analysis_4()関数に対応 */
では、残りのコードを以下に示す。↓
/* ------------------------------------サブルーチン(構文解析2)ここから--------------------------------- */
void syntactic_analysis_2()
{
if(lexical_result[i].result==4)
{/* '+'の構文解析の判定 */
i++;
syntactic_analysis_4();
syntactic_analysis_3();
syntactic_result[j].result=4;
fprintf(fp2,"+ ");
j++;
syntactic_analysis_2();
}
else if(lexical_result[i].result==5)
{/* '-'の構文解析の判定 */
i++;
syntactic_analysis_4();
syntactic_analysis_3();
syntactic_result[j].result=5;
fprintf(fp2,"- ");
j++;
syntactic_analysis_2();
}
}
/* ------------------------------------サブルーチン(構文解析2)ここまで--------------------------------- */
/* ------------------------------------サブルーチン(構文解析3)ここから--------------------------------- */
void syntactic_analysis_3()
{
if(lexical_result[i].result==6)
{/* '*'の構文解析の判定 */
i++;
syntactic_analysis_4();
syntactic_result[j].result=6;
fprintf(fp2,"* ");
j++;
syntactic_analysis_3();
}
else if(lexical_result[i].result==7)
{/* '/'の構文解析の判定 */
i++;
syntactic_analysis_4();
syntactic_result[j].result=7;
fprintf(fp2,"/ ");
j++;
syntactic_analysis_3();
}
}
/* ------------------------------------サブルーチン(構文解析3)ここまで--------------------------------- */
/* ------------------------------------サブルーチン(構文解析4)ここから--------------------------------- */
void syntactic_analysis_4()
{
int t;
if(lexical_result[i].result==1)
{/* '識別子'の構文解析の判定 */
syntactic_result[j].result=1;
for(t=0;t < MAXLENG;t++){
if(isalnum(lexical_result[i].jiku[t]))
{
syntactic_result[j].jiku[t]=lexical_result[i].jiku[t];
}
}
fprintf(fp2,"i%d.%d ",n,gyou_kaihi);
n++;
j++;
i++;
}
else if(lexical_result[i].result==2)
{/* '定数'の構文解析の判定 */
syntactic_result[j].result=2;
for(t=0;t < MAXLENG;t++)
{
if(isdigit(lexical_result[i].jiku[t]))
{
syntactic_result[j].jiku[t]=lexical_result[i].jiku[t];
}
}
fprintf(fp2,"num%d.%d ",o,gyou_kaihi);
o++;
j++;
i++;
}
else if(lexical_result[i].result==8)
{/* '('と')'の構文解析の判定 */
syntactic_result[j].result=8;
i++;
j++;
syntactic_analysis_4();
syntactic_analysis_3();
syntactic_analysis_2();
if(lexical_result[i].result==9)
{
syntactic_result[j].result=9;
i++;
j++;
}
}
}
/* ------------------------------------サブルーチン(構文解析4)ここまで--------------------------------- */