当前位置:首页 > 编译原理-LL(1)文法源代码(实验三)
printf(\步骤\\t分析符号栈\\t当前指示字符\\t使用产生式序号\\n\
step = 0; current = 0;
printf(\ ShowStack();
printf(\
while('#' != st[current]) {
if(100 > analyseStack[topAnalyse]) {
if(analyseStack[topAnalyse] == IndexCh(st[current])) {
Pop(); current++; step++;
printf(\ ShowStack();
printf(\出栈、后移\\n\ } else {
printf(\不匹配!\ printf(\此串不是此文法的句子!\\n\ return; } }
else /*当为非终结符时*/ {
r = analyseTable[analyseStack[topAnalyse] - 100][IndexCh(st[current])]; if(-1 != r) {
Push(r); step++;
printf(\ ShowStack();
printf(\ } else {
printf(\此串不是此文法的句子!\\n\ return;
} } }
if('#' == st[current]) {
if(0 == topAnalyse && '#' == st[current]) {
step++;
printf(\ ShowStack();
printf(\分析成功!\\n\ printf(\是给定文法的句子!\\n\ } else {
while(topAnalyse > 0) {
if(100 > analyseStack[topAnalyse]) {
printf(\此串不是此文法的句子!\\n\ return; } else {
r = analyseTable[analyseStack[topAnalyse] - 100][vtNum]; if(-1 != r) {
Push(r); /*产生式右部代替左部,指示器不移动*/ step++;
printf(\ ShowStack();
if(0 == topAnalyse && '#' == st[current]) {
printf(\分析成功!\\n\ printf(\是给定文法的句子!\\n\ }
else
printf(\ } else {
printf(\此串不是此文法的句子!\\n\ return;
} } } } } }
/*初始化栈及符号串*/ void InitStack() { int i;
/*分析栈的初始化*/
for(i = 0; i < MaxStLength; i++) st[i] = '\\0';
analyseStack[0] = -1; /*#(-1)入栈*/ analyseStack[1] = 100; /*初始符入栈*/ topAnalyse = 1; }
/*显示符号栈中内容*/ void ShowStack() { int i;
for(i = 0; i <= topAnalyse; i++) {
if(100 <= analyseStack[i])
printf(\ else {
if(-1 != analyseStack[i])
printf(\ else
printf(\ } } }
/*栈顶出栈*/ void Pop() {
topAnalyse--; }
void Push(int r) { int i;
struct pRNode *pt; Pop();
pt = P[r].rHead;
if(-1 == pt->rCursor) return;
topAnalyse += P[r].rLength; for(i = 0; i < P[r].rLength; i++) {
analyseStack[topAnalyse - i] = pt->rCursor;/*逆序入栈*/ pt = pt->next; } }
共分享92篇相关文档