编译原理-LL(1)文法源代码(实验三) 联系客服

发布时间 : 星期五 文章编译原理-LL(1)文法源代码(实验三)更新完毕开始阅读bf2cc3195122aaea998fcc22bcd126fff6055d30

int analyseTable[MaxVnNum + 1][MaxVtNum + 1 + 1];

int analyseStack[MaxStackDepth + 1]; /*分析栈*/ int topAnalyse; /*分析栈顶*/

void Init();/*初始化*/ int IndexCh(char ch);

void InputVt(); /*输入终结符*/ void InputVn();/*输入非终结符*/

void ShowChArray(char* collect, int num);/*输出Vn或Vt的内容*/ void InputP();/*产生式输入*/

bool CheckP(char * st);/*判断产生式正确性*/ void First(int U);

void AddFirst(int U, int nCh); /*加入first集*/ bool HaveEmpty(int nVn);

void Follow(int V);/*计算follow集*/ void AddFollow(int V, int nCh, int kind);

void ShowCollect(struct collectNode **collect);/*输出first或follow集*/ void FirstFollow();/*计算first和follow*/ void CreateAT();/*构造预测分析表*/ void ShowAT();/*输出分析表*/ void Identify(char *st); void InitStack(); void ShowStack(); void Pop();

void Push(int r);

void main(void) {

char todo,ch;

Init();

InputVn(); InputVt(); InputP();

getchar();

FirstFollow();

printf(\所得first集为:\ ShowCollect(first);

printf(\所得follow集为:\ ShowCollect(follow);

CreateAT(); ShowAT();

todo = 'y';

while('y' == todo) {

printf(\是否继续进行句型分析?(y / n):\ todo = getchar();

while('y' != todo && 'n' != todo) {

printf(\ todo = getchar(); }

if('y' == todo) { int i;

InitStack();

printf(\请输入符号串(以#结束) : \ ch = getchar(); i = 0;

while('#' != ch && i < MaxStLength) {

if(' ' != ch && '\\n' != ch) {

st[i++] = ch; }

ch = getchar(); }

if('#' == ch && i < MaxStLength) {

st[i] = ch; Identify(st); } else

printf(\输入出错!\\n\ } }

getchar(); }

void Init() {

int i,j;

vnNum = 0; vtNum = 0; PNum = 0;

for(i = 0; i <= MaxVnNum; i++) Vn[i] = '\\0';

for(i = 0; i <= MaxVtNum; i++) Vt[i] = '\\0';

for(i = 0; i < MaxRuleNum; i++) {

P[i].lCursor = NULL; P[i].rHead = NULL; P[i].rLength = 0; }

PNum = 0;

for(i = 0; i <= MaxPLength; i++) buffer[i] = '\\0';

for(i = 0; i < MaxVnNum; i++) {

first[i] = NULL; follow[i] = NULL; }

for(i = 0; i <= MaxVnNum; i++) {

for(j = 0; j <= MaxVnNum + 1; j++) analyseTable[i][j] = -1; } }

int IndexCh(char ch) {

int n;

n = 0; /*is Vn?*/

while(ch != Vn[n] && '\\0' != Vn[n]) n++;

if('\\0' != Vn[n]) return 100 + n; n = 0; /*is Vt?*/

while(ch != Vt[n] && '\\0' != Vt[n]) n++;

if('\\0' != Vt[n]) return n; return -1; }

/*输出Vn或Vt的内容*/

void ShowChArray(char* collect) {

int k = 0;

while('\\0' != collect[k]) {

printf(\ }

printf(\}

/*输入非终结符*/ void InputVn() {

int inErr = 1; int n,k; char ch; while(inErr) {

printf(\请输入所有的非终结符,注意:\

printf(\请将开始符放在第一位,并以#号结束:\\n\ ch = ' '; n = 0;

/*初始化数组*/

while(n < MaxVnNum) {

Vn[n++] = '\\0'; } n = 0;

while(('#' != ch) && (n < MaxVnNum)) {

if(' ' != ch && '\\n' != ch && -1 == IndexCh(ch)) {

Vn[n++] = ch; vnNum++; }

ch = getchar(); }

Vn[n] = '#'; /*以“#”标志结束用于判断长度是否合法*/ k = n; if('#' != ch) {

if( '#' != (ch = getchar())) {

while('#' != (ch = getchar()))