構文解析2メモ(syntactic_analysis)

さてさて、構文解析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)ここまで--------------------------------- */