代碼下載下傳位址
源碼請點選: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