詞法分析程序scaner( ),sym;error( )
每個函數名是相應的非終結符,函數體是根據右部符號串的結構編寫。
當遇到終結符時,則編寫語句if(當前讀入的符號==a)則讀入下一個單詞
當遇到非終結符A時,則編寫語句調用A( )
當遇到規則A→ε時,則編寫語句調用if(當前讀入的符號∉ FOLLOW(A))error( )
對於給定的文法G[E] :
E→E+T|E-T|T
T→T*F| T/F|F
F→(E)|i
消除左遞歸后的文法是:
E→TE'
E'→+TE'|-TE'|∑
T→FT'
T'→*FT'|/FT'|∑
F→(E)|i
是否是LL(1)文法?
select(E→TE')=first(TE')={(,i}
select(E'→+TE')=first(+TE')={+}
select(E'→-TE')=first(-TE')={-}
select(E'→∑)=follow(E')={),#}
select(T→FT')=first(FT')={(,i}
select(T'→*FT')=first(*FT')={*}
select(T'→/FT')=first(/FT')={/}
select(T'→∑)=follow(T')={+,-,),#)
select(F→(E))=first((E))={(}
select(F→i)=first(i)={i}
由上分析,得知此文法滿足LL(1)文法
代碼如下
#include<stdio.h> #include<string> char str[10]; //記錄要分析的字符串 int x=0; //記錄第一個字符 void E(); void X(); void T(); void Y(); void F(); int main() { int len; printf("請輸入算數表達式:"); scanf("%s",str); len=strlen(str); str[len]='#'; str[len+1]='\0'; E(); printf("\n正確!\n"); strcpy(str,""); x=0; return 0; } void E() { T(); X(); } void X() { if(str[x]=='+'||str[x]=='-') { x++; T(); X(); } } void T() { F(); Y(); } void Y() { if(str[x]=='*'||str[x]=='/') { x++; F(); Y(); } } void F() { if(str[x]>='a'&&str[x]<='z') { x++; } else if(str[x]>=0&&str[x]<=9) { x++; } else if (str[x]=='(') { x++; E(); if(str[x]==')') { x++; } else { printf("\n錯誤!\n"); exit(0); } } else { printf("\n錯誤r!\n"); exit(0); } }