📄 语法分析ll1b.txt
字号:
{ TreeNode *t=PopOp();
TreeNode *Rnum=PopNum();
TreeNode *Lnum=PopNum();
t->child[1]=Rnum;
t->child[0]=Lnum;
PushNum(t);
sTop=ReadOpStack();
}
PushOp(currentP);
}
void CparseLL1::process89()
{
Push(2,RPAREN);
Push(1,Exp);
Push(2,LPAREN);
TreeNode *t=newExpNode(OpK);
t->attr.ExpAttr.op = currentToken.Lex; /*把左括号也压入栈中*/
PushOp(t);
expflag++;
}
void CparseLL1::process90()
{
Push(2,INTC);
TreeNode *t=newExpNode(ConstK);
t->attr.ExpAttr.val = atoi(currentToken.Sem);
/*常数节点入操作数栈*/
PushNum(t);
}
void CparseLL1::process91()
{
Push(1,Variable);
}
void CparseLL1::process92()
{
Push(1,VariMore);
Push(2,ID);
currentP=newExpNode(VariK);
strcpy( currentP->name[0] , currentToken.Sem );
currentP->idnum++;
/*变量节点入操作数栈*/
PushNum(currentP);
}
void CparseLL1::process93()
{
/*标识符变量*/
currentP->attr.ExpAttr.varkind=IdV;
}
void CparseLL1::process94()
{
Push(2, RMIDPAREN);
Push(1, Exp);
Push(2, LMIDPAREN);
/*数组成员变量*/
currentP->attr.ExpAttr.varkind=ArrayMembV;
PushPA(¤tP->child[0]);
/*要进入表达式处理,初始化操作符栈*/
//操作符栈的栈底存入一个特殊的操作符作为标志
TreeNode *t=newExpNode(OpK);
t->attr.ExpAttr.op = END ;
PushOp(t);
/*要进入数组下标表达式处理,在函数CparseLL1::process84处理中,要
操作语法树栈,故将标志getExpResult2设置为真值*/
getExpResult2 = TRUE;
}
void CparseLL1::process95()
{
Push(1, FieldVar);
Push(2, DOT);
/*域成员变量*/
currentP->attr.ExpAttr.varkind=FieldMembV;
PushPA(¤tP->child[0]);
}
void CparseLL1::process96()
{
Push(1,FieldVarMore);
Push(2,ID);
/*纪录域的成员*/
currentP=newExpNode(VariK);
strcpy( currentP->name[0] , currentToken.Sem );
currentP->idnum++;
TreeNode **t=PopPA( );
(*t)=currentP;
}
void CparseLL1::process97()
{
/*域成员是标识符变量*/
currentP->attr.ExpAttr.varkind=IdV;
}
void CparseLL1::process98()
{
Push(2,RMIDPAREN);
Push(1,Exp);
Push(2,LMIDPAREN);
/*域成员是数组变量*/
currentP->attr.ExpAttr.varkind=ArrayMembV;
/*指向数组成员表达式*/
PushPA(¤tP->child[0]);
//操作符栈的栈底存入一个特殊的操作符作为标志
TreeNode *t=newExpNode(OpK);
t->attr.ExpAttr.op = END ;
PushOp(t);
/*要进入数组下标表达式处理,在函数CparseLL1::process84处理中,要
操作语法树栈,故将标志getExpResult2设置为真值*/
getExpResult2 = TRUE;
}
void CparseLL1::process99()
{
Push(2,LT);
}
void CparseLL1::process100()
{
Push(2,EQ);
}
void CparseLL1::process101()
{
Push(2,PLUS);
}
void CparseLL1::process102()
{
Push(2,MINUS);
}
void CparseLL1::process103()
{
Push(2,TIMES);
}
void CparseLL1::process104()
{
Push(2,OVER);
}
/****************************************************/
/* 函数名 predict */
/* 功 能 选择产生式函数 */
/* 说 明 */
/****************************************************/
void CparseLL1::predict(int num)
{ switch( num )
{ case 1: CparseLL1::process1(); break;
case 2: CparseLL1::process2(); break;
case 3: CparseLL1::process3(); break;
case 4: CparseLL1::process4(); break;
case 5: CparseLL1::process5(); break;
case 6: CparseLL1::process6(); break;
case 7: CparseLL1::process7(); break;
case 8: CparseLL1::process8(); break;
case 9: CparseLL1::process9(); break;
case 10: CparseLL1::process10(); break;
case 11: CparseLL1::process11(); break;
case 12: CparseLL1::process12(); break;
case 13: CparseLL1::process13(); break;
case 14: CparseLL1::process14(); break;
case 15: CparseLL1::process15(); break;
case 16: CparseLL1::process16(); break;
case 17: CparseLL1::process17(); break;
case 18: CparseLL1::process18(); break;
case 19: CparseLL1::process19(); break;
case 20: CparseLL1::process20(); break;
case 21: CparseLL1::process21(); break;
case 22: CparseLL1::process22(); break;
case 23: CparseLL1::process23(); break;
case 24: CparseLL1::process24(); break;
case 25: CparseLL1::process25(); break;
case 26: CparseLL1::process26(); break;
case 27: CparseLL1::process27(); break;
case 28: CparseLL1::process28(); break;
case 29: CparseLL1::process29(); break;
case 30: CparseLL1::process30(); break;
case 31: CparseLL1::process31(); break;
case 32: CparseLL1::process32(); break;
case 33: CparseLL1::process33(); break;
case 34: CparseLL1::process34(); break;
case 35: CparseLL1::process35(); break;
case 36: CparseLL1::process36(); break;
case 37: CparseLL1::process37(); break;
case 38: CparseLL1::process38(); break;
case 39: CparseLL1::process39(); break;
case 40: CparseLL1::process40(); break;
case 41: CparseLL1::process41(); break;
case 42: CparseLL1::process42(); break;
case 43: CparseLL1::process43(); break;
case 44: CparseLL1::process44(); break;
case 45: CparseLL1::process45(); break;
case 46: CparseLL1::process46(); break;
case 47: CparseLL1::process47(); break;
case 48: CparseLL1::process48(); break;
case 49: CparseLL1::process49(); break;
case 50: CparseLL1::process50(); break;
case 51: CparseLL1::process51(); break;
case 52: CparseLL1::process52(); break;
case 53: CparseLL1::process53(); break;
case 54: CparseLL1::process54(); break;
case 55: CparseLL1::process55(); break;
case 56: CparseLL1::process56(); break;
case 57: CparseLL1::process57(); break;
case 58: CparseLL1::process58(); break;
case 59: CparseLL1::process59(); break;
case 60: CparseLL1::process60(); break;
case 61: CparseLL1::process61(); break;
case 62: CparseLL1::process62(); break;
case 63: CparseLL1::process63(); break;
case 64: CparseLL1::process64(); break;
case 65: CparseLL1::process65(); break;
case 66: CparseLL1::process66(); break;
case 67: CparseLL1::process67(); break;
case 68: CparseLL1::process68(); break;
case 69: CparseLL1::process69(); break;
case 70: CparseLL1::process70(); break;
case 71: CparseLL1::process71(); break;
case 72: CparseLL1::process72(); break;
case 73: CparseLL1::process73(); break;
case 74: CparseLL1::process74(); break;
case 75: CparseLL1::process75(); break;
case 76: CparseLL1::process76(); break;
case 77: CparseLL1::process77(); break;
case 78: CparseLL1::process78(); break;
case 79: CparseLL1::process79(); break;
case 80: CparseLL1::process80(); break;
case 81: CparseLL1::process81(); break;
case 82: CparseLL1::process82(); break;
case 83: CparseLL1::process83(); break;
case 84: CparseLL1::process84(); break;
case 85: CparseLL1::process85(); break;
case 86: CparseLL1::process86(); break;
case 87: CparseLL1::process87(); break;
case 88: CparseLL1::process88(); break;
case 89: CparseLL1::process89(); break;
case 90: CparseLL1::process90(); break;
case 91: CparseLL1::process91(); break;
case 92: CparseLL1::process92(); break;
case 93: CparseLL1::process93(); break;
case 94: CparseLL1::process94(); break;
case 95: CparseLL1::process95(); break;
case 96: CparseLL1::process96(); break;
case 97: CparseLL1::process97(); break;
case 98: CparseLL1::process98(); break;
case 99: CparseLL1::process99(); break;
case 100: CparseLL1::process100(); break;
case 101: CparseLL1::process101(); break;
case 102: CparseLL1::process102(); break;
case 103: CparseLL1::process103(); break;
case 104: CparseLL1::process104(); break;
case 0:
default: {
syntaxError("unexpected token ->");
fprintf(listing," %s",currentToken.Sem);
}
}
}
/****************************************************/
/* 函数名 parseLL1 */
/* 功 能 LL1语法分析主函数 */
/* 说 明 */
/****************************************************/
Cglobal::TreeNode * CparseLL1::parseLL1()
{
/*************从构造函数拷贝,每次调用都要初始化*******************/
//用于读token文件:
fpnum=0; //用于gettoken函数
/*纪录当前语法树节点*/
currentP=NULL;
/*为保存类型需要的临时变量*/
temp=NULL;
/*保存当前指针,以便修改后,将其恢复*/
saveP = NULL;
/*纪录表达式中,未匹配的左括号数目*/
expflag = 0;
/*判断简单表达式处理结束,整个表达式是否处理结束标识*/
/*当是条件表达式时,取假值,简单表达式时,取真值*/
/*用于函数preocess84*/
getExpResult = TRUE;
/*仅用于数组变量,故初始化为假,遇到数组变量时,将其
改变为真,以便在函数CparseLL1::process84中,即算术表达式结束时,
从语法树栈中弹出相应指针,将数组下标表达式的结构链入
节点中*/
getExpResult2 = FALSE;
/*符号栈顶指针*/
StackTop=NULL;
/*栈空标志*/
STACKEMPTY=TRUE;
/*语法树栈顶指针*/
StackTopPA=NULL;
/*栈空标志*/
paSTACKEMPTY=TRUE;
/*操作符栈的栈顶指针*/
OpStackTop=NULL;
/*操作符栈空标志*/
OpSTACKEMPTY = TRUE;
/*操作数栈的栈顶指针*/
NumStackTop=NULL;
/*操作数栈空标志*/
NumSTACKEMPTY = TRUE;
/********************************************************/
NontmlType stacktopN;
TmlType stacktopT;
/*语法树的根节点*/
TreeNode *rootPointer=NULL;
int pnum=0; //纪录选中的产生式编号
//初始化行号为0
lineno = 0;
//初始化:错误标志为假
Error = FALSE;
CreatLL1Table();
STACKEMPTY = TRUE;
/*指向整个语法树根节点的指针,由它得到语法树*/
rootPointer = newRootNode();
/*从这里开始进行语法分析和语法树的生成*/
PushPA ( &(rootPointer->child[2]));
PushPA ( &(rootPointer->child[1]));
PushPA ( &(rootPointer->child[0]));
Push(1,Program);
/*取一个token */
gettoken(¤tToken);
lineno=currentToken.lineshow;
//当有语法错误时,不再继续进行下面的检查:
while (!(STACKEMPTY)&&!(Error))
{
if ( readStackflag() == 2) /*检测终极符是否匹配*/
{
stacktopT=readstackT();
if (stacktopT==currentToken.Lex)
{
//跟踪LL(1)语法分析:
//AfxGetApp()->m_pMainWnd->MessageBox("match!");
//AfxGetApp()->m_pMainWnd->MessageBox(currentToken.Sem);
Pop();
gettoken(¤tToken);
lineno=currentToken.lineshow;
}
else
{ syntaxError("unexpected token -> ");
fprintf(listing," %s",currentToken.Sem);
fprintf(listing," ");
//AfxGetApp()->m_pMainWnd->MessageBox("not match!");
}
}
else { /*根据非终极符和栈中符号进行预测*/
stacktopN=readstackN();
pnum= LL1Table[stacktopN][currentToken.Lex];
char * str='\0';
//跟踪LL1语法分析:
//AfxGetApp()->m_pMainWnd->MessageBox("选择产生式!");
Pop();
predict(pnum);
}
}
if ((!Error)&&(currentToken.Lex != ENDFILE1))
syntaxError("Code ends before file \n");
return rootPointer;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -