天天看點

java實作文法分析代碼下載下傳位址說明Syntactic_Analysis.cTest Case

java實作文法分析代碼下載下傳位址說明Syntactic_Analysis.cTest Case

代碼下載下傳位址

源碼請點選:Github

說明

首先改寫文法為LL(1)文法;然後為每一個非終結符,構造相應的遞歸過程,過程的名字表示規則左部的非終結符;
過程體按規則右部符号串的順序編寫。
           

Syntactic_Analysis.c

#include<stdio.h>

void E();
void T();
void E1();
void T1();
void F();

char s[];
int i, SIGN;

int main()
{
    printf("請輸入一個語句,以#号結束語句(直接輸入#号推出)\n");
    while(  )
    {
        SIGN = ;
        i=;
        scanf("%s",&s);
        if( s[] == '#')
            return ;

        E();
        if(s[i]=='#')
            printf("正确語句!\n");
        printf("請輸入一個語句,以#号結束語句\n");
    }
    return ;
}

void E()
{
    if(SIGN==)
    {
            T();
        E1();
    }
}

void E1()
{
    if(SIGN==)
    {
        if(s[i]=='+')
        {
            ++i;
            T();
            E1();
        }
        else if(s[i]!='#'&&s[i]!=')')
        {
            printf("語句有誤!\n");
            SIGN=;
        }
    }
}

void T()
{
    if(SIGN==)
    {
        F();
        T1();
    }
}

void T1()
{
    if(SIGN==)
    {
        if(s[i]=='*')
        {
            ++i;
            F();
            T1();
        }
        else if(s[i]!='#'&&s[i]!=')'&&s[i]!='+')
        {
            printf("語句有誤!\n");
            SIGN=;
        }
    }
}

void F()
{
    if(SIGN==)
    {
        if(s[i]=='(')
        {
            ++i;
            E();
            if(s[i]==')')
                ++i;
            else if(s[i]== '#')
            {
                printf("語句有誤!\n");
                SIGN=;
                ++i;
            }
        }
        else if(s[i]=='i')
            ++i;
        else
        {
            printf("語句有誤!\n");
            SIGN=;
        }
    }
}
           

Test Case

(1)輸入i,預期顯示語句正确!    
(2)輸入iii,預期顯示語句有誤!    
(3)輸入a,預期顯示語句有誤!    
(4)輸入(i),預期顯示語句正确!    
(5)輸入(a),預期顯示語句有誤!    
(6)輸入(i+i),預期顯示語句正确!
(7)輸入(i+i,預期顯示語句有誤!
(8)輸入((i*i)+i)*i,預期顯示語句正确!
(9)輸入((((i+i*i)))),預期顯示語句正确!    
(10)輸入(i+ia,預期顯示語句有誤!    
(11)輸入i+i*i+i*a,預期顯示語句有誤!
           

#個人首頁:www.iooy.com