java实现语法分析

4.jpg

代码下载地址

源码请点击:Github

说明

首先改写文法为LL(1)文法;然后为每一个非终结符,构造相应的递归过程,过程的名字表示规则左部的非终结符;
过程体按规则右部符号串的顺序编写。

Syntactic_Analysis.c

#include

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

char s[100];
int i, SIGN;

int main()
{
    printf("请输入一个语句,以#号结束语句(直接输入#号推出)\n");
    while( 1 )
    {
        SIGN = 0;
        i=0;
        scanf("%s",&s);
        if( s[0] == '#')
            return 0;

        E();
        if(s[i]=='#')
            printf("正确语句!\n");
        printf("请输入一个语句,以#号结束语句\n");
    }
    return 1;
}

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

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

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

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

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

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

你可能感兴趣的:(java实现语法分析)