使用递归的方法,计算非终结符的firstVT集合 // 0505 firstvt.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <stdio.h> #include <iostream> using namespace std; #define LENGTH 5 //产生式的长度 #define COUNT 7 //产生式的个数 //产生式 /* char product[][LENGTH]={ {'S','a'}, {'S','^'}, {'S','(','T',')'}, {'T','T',',','S'}, {'T','S'}, };//课本P122第1题 */ char product[][LENGTH]={ {'S','V'}, {'V','T'}, {'V','V','i','T'}, {'T','F'}, {'T','T','+','F'}, {'F',')','V','*'}, {'F','('}, };//课本P122第3题 void outputProduct()//打印产生式 { int i=0,j=0; while (product[i][0]!=NULL)//产生式左边不空 { printf("/n %c ->",product[i][0]);//打印非终结符 j=1; while(product[i][j]!=NULL) { printf(" %c ",product[i][j]);//打印终结符 j++; } i++;//下一条产生式 } } char firstTerm(char *s)//第一个终结符。若没有,返回非终结符 { int i=1; while (s[i]!=NULL) { if (s[i]<'A' || s[i]>'Z') { return s[i]; } i++; } return s[1];//返回产生式右边的第一个符号 } void firstVT(char s)//计算单个非终结符的firstVT集合,直接打印 { for (int i=0;i<COUNT;i++) { if (product[i][0]==s) { while (product[i][0]==s) { if (firstTerm(product[i])<'A' || firstTerm(product[i])>'Z')//终结符 { printf("%c ",firstTerm(product[i])); } else { firstVT(firstTerm(product[i])); } i++;//下一个产生式 } } } } void outputFirstVT()//打印所有非终结符的firstVT集合 { for (int i=0;i<COUNT;i++) { printf("/nfirstVT(%c)=",product[i][0]); while(product[i][0]==product[i+1][0]) { i++; } firstVT(product[i][0]); } } int _tmain(int argc, _TCHAR* argv[]) { outputProduct(); outputFirstVT(); printf("/n"); system("pause"); return 0; }