简单的方法,计算优先函数 手动计算比较麻烦,而且容易出错。 根据定义,用计算机实现,快捷方便,准确可扩充 // 0505优先函数.cpp : 定义控制台应用程序的入口点。 // /* 使用说明: 1、改#define N 的值 2、改char M[N+1][N+1]的值 3、改F[N] G[N] 的值 4、当最后两次输出不同时,说明优先函数没有收敛,需增加训练次数。 (这种情况多是不存在优先函数,要注意哦) */ #include "stdafx.h" #include <stdio.h> #include <iostream> using namespace std; //#define N 7 //终结符的个数 //#define N 4 //终结符的个数 //#define N 6 //终结符的个数 //#define N 2 //终结符的个数 #define N 8 //终结符的个数 //int F[N]={1,1,1,1,1,1,1};//f的初始值 //int G[N]={1,1,1,1,1,1,1};//g的初始值 //int F[N]={1,1,1,1};//f的初始值 //int G[N]={1,1,1,1};//g的初始值 //int F[N]={1,1,1,1,1,1};//f的初始值 //int G[N]={1,1,1,1,1,1};//g的初始值 // int F[N]={1,1};//f的初始值 // int G[N]={1,1};//g的初始值 int F[N]={1,1,1,1,1,1,1,1};//f的初始值 int G[N]={1,1,1,1,1,1,1,1};//g的初始值 //算符优先关系表 》1 《 2 = 0 /* char M[N+1][N+1]={ {' ', '+', '*', '|', 'i', '(', ')', '#'}, {'+', '1', '2', '2', '2', '2', '1', '1'}, {'*', '1', '1', '2', '2', '2', '1', '1'}, {'|', '1', '1', '2', '2', '2', '1', '1'}, {'i', '1', '1', '1', ' ', ' ', '1', '1'}, {'(', '2', '2', '2', '2', '2', '0', ' '}, {')', '1', '1', '1', ' ', ' ', '1', '1'}, {'#', '2', '2', '2', '2', '2', ' ', '0'} };//来自课本P111,参考P118 */ /* char M[N+1][N+1]={ {' ', 'i', '*', '+', '#'}, {'i', ' ', '1', '1', '1'}, {'*', '2', '1', '1', '1'}, {'+', '2', '2', '1', '1'}, {'#', '2', '2', '2', '0'}, };//来自课本P119 */ /* char M[N+1][N+1]={ {' ', 'a', '^', '(', ')', ',', '#'}, {'a', ' ', ' ', ' ', '1', '1', '1'}, {'^', ' ', ' ', ' ', '1', '1', '1'}, {'(', '2', '2', '2', '0', '2', ' '}, {')', ' ', ' ', ' ', '1', '1', '1'}, {',', '2', '2', '2', '1', '1', ' '}, {'#', '2', '2', '2', ' ', ' ', '0'}, };//来自课本P122的第1题 */ /* char M[N+1][N+1]={ {' ', 'a', 'b',}, {'a', '0', '1',}, {'b', '0', '0',} };//来自课本P120 */ char M[N+1][N+1]={ {' ', 'o', 'a', 'n', '(', ')', 't', 'f', '#'}, {'o', '1', '2', '2', '2', '1', '2', '2', '1'}, {'a', '1', '1', '2', '2', '1', '2', '2', '1'}, {'n', '1', '1', '2', '2', '1', '2', '2', '1'}, {'(', '2', '2', '2', '2', '0', '2', '2', ' '}, {')', '1', '1', ' ', ' ', '1', ' ', ' ', '1'}, {'t', '1', '1', ' ', ' ', '1', ' ', ' ', '1'}, {'f', '1', '1', ' ', ' ', '1', ' ', ' ', '1'}, {'#', '2', '2', '2', '2', ' ', '2', '2', '0'} };//来自课本P121 void construction()//构造优先函数 { for (int i=1;i<=N;i++) { for (int j=1;j<=N;j++) { if (M[i][j]=='1' && F[i-1]<=G[j-1]) { F[i-1]=G[j-1]+1; break; } if (M[i][j]=='2' && F[i-1]>=G[j-1]) { G[j-1]=F[i-1]+1; break; } if (M[i][j]=='0' && F[i-1]!=G[j-1]) { if (F[i-1]<=G[j-1]) { F[i-1]=(F[i-1]>G[j-1]?F[i-1]:G[j-1]); } else { G[j-1]=(F[i-1]>G[j-1]?F[i-1]:G[j-1]); } break; } } } } void outputM()//输出算符优先关系表 { for (int i=0;i<=N;i++) { for (int j=0;j<=N;j++) { printf("%c ",M[i][j]); } printf("/n"); } } void outputFG()//输出优先函数f和g { printf("/n优先函数 f 的值:"); for (int i=0;i<N;i++) { printf("%d ",F[i]); } printf("/n优先函数 g 的值:"); for (int i=0;i<N;i++) { printf("%d ",G[i]); } printf("/n"); } int _tmain(int argc, _TCHAR* argv[]) { outputM(); outputFG(); for (int count=1;count<=10;count++)//最多计算的次数,未设置结束条件(即F和G收敛) { construction(); printf("/n第%d次construction之后的 f 和 g 如下:",count); outputFG(); } system("pause"); return 0; }