📄 ll1语法分析a.txt
字号:
free(p);
if (StackTop==NULL)
STACKEMPTY=true;
}
/*读栈顶标志,看是终极符还是非终极符*/
int CparseLL1::readStackflag()
{ int j;
j=StackTop->flag ;
return(j);
}
/*非终极符时*/
Cglobal::NontmlType CparseLL1::readstackN()
{
return ((*StackTop).var.Ntmlvar);
}
/*终极符*/
Cglobal::TmlType CparseLL1::readstackT()
{
return ((*StackTop).var.tmlvar);
}
/*压栈的实现过程,压入的是指向树节点的指针的地址*/
void CparseLL1::PushPA(TreeNode **t)
{
StackNodePA *p=NULL;
p=(StackNodePA *)malloc (sizeof(StackNodePA));
p->pointer= t ;
p->underNode =StackTopPA;
StackTopPA=p;
paSTACKEMPTY=false;
}
/*弹栈的实现过程*/
Cglobal::TreeNode ** CparseLL1::PopPA()
{
StackNodePA *p=NULL;
TreeNode **backpointer;
p = StackTopPA;
backpointer=p ->pointer;
StackTopPA=StackTopPA->underNode;
free(p);
if (StackTopPA==NULL)
paSTACKEMPTY=true;
return backpointer;
}
/*操作符栈的压栈实现过程,压入的是指向树节点的指针*/
void CparseLL1::PushOp(TreeNode *t)
{
StackNodeP *p=NULL;
p=(StackNodeP *)malloc (sizeof(StackNodeP));
p->pointer= t ;
p->underNode =OpStackTop;
OpStackTop=p;
OpSTACKEMPTY=FALSE;
}
/*操作符栈的弹栈实现过程*/
Cglobal::TreeNode * CparseLL1::PopOp()
{
StackNodeP *p=NULL;
TreeNode *backpointer;
p=OpStackTop;
backpointer=p->pointer;
OpStackTop=OpStackTop->underNode;
free(p);
if (OpStackTop==NULL)
OpSTACKEMPTY= TRUE;
return backpointer;
}
LexType CparseLL1::ReadOpStack()
{
TreeNode *t1;
t1=OpStackTop->pointer;
return (t1->attr.ExpAttr.op);
}
/*操作数栈的压栈实现过程,压入的是指向树节点的指针*/
void CparseLL1::PushNum(TreeNode *t)
{
StackNodeP *p=NULL;
p =(StackNodeP *)malloc (sizeof(StackNodeP));
p->pointer= t ;
p->underNode =NumStackTop;
NumStackTop=p;
NumSTACKEMPTY=false;
}
/*操作数栈的弹栈实现过程*/
Cglobal::TreeNode * CparseLL1::PopNum()
{
StackNodeP *p=NULL;
TreeNode *backpointer;
p =NumStackTop;
backpointer=p->pointer;
NumStackTop=NumStackTop->underNode;
free(p);
if (NumStackTop==NULL)
NumSTACKEMPTY=true;
return backpointer;
}
/************<语法分析功能函数> **************/
/********************************************************/
/* 函数名 CreatLL1Table */
/* 功 能 创建LL1分析表 */
/* 说 明 初始数组(表)中的每一项都为0;根据LL1文法 */
/* 给数组赋值(填表);填好后,若值为0, */
/* 表示无产生式可选,其他,为选中的产生式 */
/********************************************************/
void CparseLL1::CreatLL1Table()
{ int i,j;
/*初始化LL1表元素*/
for (i=0;i<TABLESIZE;i++)
for (j=0;j<TABLESIZE;j++)
LL1Table[i][j]=0;
LL1Table [Program][PROGRAM] = 1;
LL1Table [ProgramHead][PROGRAM] = 2;
LL1Table [ProgramName][ID] = 3;
LL1Table [DeclarePart][TYPE]= 4;
LL1Table [DeclarePart][VAR]= 4;
LL1Table [DeclarePart][PROCEDURE]= 4;
LL1Table [DeclarePart][BEGIN]= 4;
LL1Table [TypeDec][VAR]= 5;
LL1Table [TypeDec][PROCEDURE]= 5;
LL1Table [TypeDec][BEGIN]= 5;
LL1Table [TypeDec][TYPE]= 6;
LL1Table [TypeDeclaration][TYPE]= 7;
LL1Table [TypeDecList][ID]= 8;
LL1Table [TypeDecMore][VAR]= 9;
LL1Table [TypeDecMore][PROCEDURE]= 9;
LL1Table [TypeDecMore][BEGIN]= 9;
LL1Table [TypeDecMore][ID]= 10;
LL1Table [TypeId][ID]= 11;
LL1Table [TypeName][INTEGER]= 12;
LL1Table [TypeName][CHAR1]= 12;
LL1Table [TypeName][ARRAY]= 13;
LL1Table [TypeName][RECORD]= 13;
LL1Table [TypeName][ID]= 14;
LL1Table [BaseType][INTEGER]= 15;
LL1Table [BaseType][CHAR1]= 16;
LL1Table [StructureType][ARRAY]= 17;
LL1Table [StructureType][RECORD]= 18;
LL1Table [ArrayType][ARRAY]= 19;
LL1Table [Low][INTC]= 20;
LL1Table [Top][INTC]= 21;
LL1Table [RecType][RECORD]= 22;
LL1Table [FieldDecList][INTEGER]= 23;
LL1Table [FieldDecList][CHAR1]= 23;
LL1Table [FieldDecList][ARRAY]= 24;
LL1Table [FieldDecMore][END]= 25;
LL1Table [FieldDecMore][INTEGER]= 26;
LL1Table [FieldDecMore][CHAR1]= 26;
LL1Table [FieldDecMore][ARRAY]= 26;
LL1Table [IdList][ID]= 27;
LL1Table [IdMore][SEMI]= 28;
LL1Table [IdMore][COMMA]= 29;
LL1Table [VarDec][PROCEDURE]= 30;
LL1Table [VarDec][BEGIN]= 30;
LL1Table [VarDec][VAR]= 31;
LL1Table [VarDeclaration][VAR]= 32;
LL1Table [VarDecList][INTEGER]= 33;
LL1Table [VarDecList][CHAR1]= 33;
LL1Table [VarDecList][ARRAY]= 33;
LL1Table [VarDecList][RECORD]= 33;
LL1Table [VarDecList][ID]= 33;
LL1Table [VarDecMore][PROCEDURE]= 34;
LL1Table [VarDecMore][BEGIN]= 34;
LL1Table [VarDecMore][INTEGER]= 35;
LL1Table [VarDecMore][CHAR1]= 35;
LL1Table [VarDecMore][ARRAY]= 35;
LL1Table [VarDecMore][RECORD]= 35;
LL1Table [VarDecMore][ID]= 35;
LL1Table [VarIdList][ID]= 36;
LL1Table [VarIdMore][SEMI]= 37;
LL1Table [VarIdMore][COMMA]= 38;
LL1Table [ProcDec][BEGIN]= 39;
LL1Table [ProcDec][PROCEDURE]= 40;
LL1Table [ProcDeclaration][PROCEDURE]= 41;
LL1Table [ProcDecMore][BEGIN]= 42;
LL1Table [ProcDecMore][PROCEDURE]= 43;
LL1Table [ProcName][ID]= 44;
LL1Table [ParamList][RPAREN]= 45;
LL1Table [ParamList][INTEGER]= 46;
LL1Table [ParamList][CHAR1]= 46;
LL1Table [ParamList][ARRAY]= 46;
LL1Table [ParamList][RECORD]= 46;
LL1Table [ParamList][ID]= 46;
LL1Table [ParamList][VAR]= 46;
LL1Table [ParamDecList][INTEGER]= 47;
LL1Table [ParamDecList][CHAR1]= 47;
LL1Table [ParamDecList][ARRAY]= 47;
LL1Table [ParamDecList][RECORD]= 47;
LL1Table [ParamDecList][ID]= 47;
LL1Table [ParamDecList][VAR]= 47;
LL1Table [ParamMore][RPAREN]= 48;
LL1Table [ParamMore][SEMI]= 49;
LL1Table [Param][INTEGER]= 50;
LL1Table [Param][CHAR1]= 50;
LL1Table [Param][ARRAY]= 50;
LL1Table [Param][RECORD]= 50;
LL1Table [Param][ID]= 50;
LL1Table [Param][VAR]= 51;
LL1Table [FormList][ID]= 52;
LL1Table [FidMore][SEMI]= 53;
LL1Table [FidMore][RPAREN]= 53;
LL1Table [FidMore][COMMA]= 54;
LL1Table [ProcDecPart][TYPE]= 55;
LL1Table [ProcDecPart][VAR]= 55;
LL1Table [ProcDecPart][PROCEDURE]= 55;
LL1Table [ProcDecPart][BEGIN]= 55;
LL1Table [ProcBody][BEGIN]= 56;
LL1Table [ProgramBody][BEGIN]= 57;
LL1Table [StmList][ID]= 58;
LL1Table [StmList][IF]= 58;
LL1Table [StmList][WHILE]= 58;
LL1Table [StmList][RETURN]= 58;
LL1Table [StmList][READ]= 58;
LL1Table [StmList][WRITE]= 58;
LL1Table [StmMore][END]= 59;
LL1Table [StmMore][ENDWH]= 59;
LL1Table [StmMore][ELSE]= 59;
LL1Table [StmMore][FI]= 59;
LL1Table [StmMore][SEMI]= 60;
LL1Table [Stm][IF]= 61;
LL1Table [Stm][WHILE]= 62;
LL1Table [Stm][READ]= 63;
LL1Table [Stm][WRITE]= 64;
LL1Table [Stm][RETURN]= 65;
LL1Table [Stm][ID]= 66;
LL1Table [AssCall][ASSIGN]= 67;
LL1Table [AssCall][LMIDPAREN]= 67;
LL1Table [AssCall][DOT]= 67;
LL1Table [AssCall][LPAREN]= 68;
LL1Table [AssignmentRest][ASSIGN]= 69;
LL1Table [AssignmentRest][LMIDPAREN]= 69;
LL1Table [AssignmentRest][DOT]= 69;
LL1Table [ConditionalStm][IF]= 70;
LL1Table [LoopStm][WHILE]= 71;
LL1Table [InputStm][READ]= 72;
LL1Table [InVar][ID]= 73;
LL1Table [OutputStm][WRITE]= 74;
LL1Table [ReturnStm][RETURN]= 75;
LL1Table [CallStmRest][LPAREN]= 76;
LL1Table [ActParamList][RPAREN]= 77;
LL1Table [ActParamList][ID]= 78;
LL1Table [ActParamList][INTC]= 78;
LL1Table [ActParamList][LPAREN]= 78;
LL1Table [ActParamMore][RPAREN]= 79;
LL1Table [ActParamMore][COMMA]= 80;
LL1Table [RelExp][LPAREN]= 81;
LL1Table [RelExp][INTC]= 81;
LL1Table [RelExp][ID]= 81;
LL1Table [OtherRelE][LT]= 82;
LL1Table [OtherRelE][EQ]= 82;
LL1Table [Exp][LPAREN]= 83;
LL1Table [Exp][INTC]= 83;
LL1Table [Exp][ID]= 83;
LL1Table [OtherTerm][LT]= 84;
LL1Table [OtherTerm][EQ]= 84;
LL1Table [OtherTerm][THEN]= 84;
LL1Table [OtherTerm][DO]= 84;
LL1Table [OtherTerm][RPAREN]= 84;
LL1Table [OtherTerm][END]= 84;
LL1Table [OtherTerm][SEMI]= 84;
LL1Table [OtherTerm][COMMA]= 84;
LL1Table [OtherTerm][ENDWH]= 84;
LL1Table [OtherTerm][ELSE]= 84;
LL1Table [OtherTerm][FI]= 84;
LL1Table [OtherTerm][RMIDPAREN]= 84;
LL1Table [OtherTerm][PLUS]= 85;
LL1Table [OtherTerm][MINUS]= 85;
LL1Table [Term][LPAREN]= 86;
LL1Table [Term][INTC]= 86;
LL1Table [Term][ID]= 86;
LL1Table [OtherFactor][PLUS]= 87;
LL1Table [OtherFactor][MINUS]= 87;
LL1Table [OtherFactor][LT]= 87;
LL1Table [OtherFactor][EQ]= 87;
LL1Table [OtherFactor][THEN]= 87;
LL1Table [OtherFactor][ELSE]= 87;
LL1Table [OtherFactor][FI]= 87;
LL1Table [OtherFactor][DO]= 87;
LL1Table [OtherFactor][ENDWH]= 87;
LL1Table [OtherFactor][RPAREN]= 87;
LL1Table [OtherFactor][END]= 87;
LL1Table [OtherFactor][SEMI]= 87;
LL1Table [OtherFactor][COMMA]= 87;
LL1Table [OtherFactor][RMIDPAREN]= 87;
LL1Table [OtherFactor][TIMES]= 88;
LL1Table [OtherFactor][OVER]= 88;
LL1Table [Factor][LPAREN]= 89;
LL1Table [Factor][INTC]= 90;
LL1Table [Factor][ID]= 91;
LL1Table [Variable][ID]= 92;
LL1Table [VariMore][ASSIGN]= 93;
LL1Table [VariMore][TIMES]= 93;
LL1Table [VariMore][OVER]= 93;
LL1Table [VariMore][PLUS]= 93;
LL1Table [VariMore][MINUS]= 93;
LL1Table [VariMore][LT]= 93;
LL1Table [VariMore][EQ]= 93;
LL1Table [VariMore][THEN]= 93;
LL1Table [VariMore][ELSE]= 93;
LL1Table [VariMore][FI]= 93;
LL1Table [VariMore][DO]= 93;
LL1Table [VariMore][ENDWH]= 93;
LL1Table [VariMore][RPAREN]= 93;
LL1Table [VariMore][END]= 93;
LL1Table [VariMore][SEMI]= 93;
LL1Table [VariMore][COMMA]= 93;
LL1Table [VariMore][RMIDPAREN]= 93;
LL1Table [VariMore][LMIDPAREN]= 94;
LL1Table [VariMore][DOT]= 95;
LL1Table [FieldVar][ID]= 96;
LL1Table [FieldVarMore][ASSIGN]= 97;
LL1Table [FieldVarMore][TIMES]= 97;
LL1Table [FieldVarMore][OVER]= 97;
LL1Table [FieldVarMore][PLUS]= 97;
LL1Table [FieldVarMore][MINUS]= 97;
LL1Table [FieldVarMore][LT]= 97;
LL1Table [FieldVarMore][EQ]= 97;
LL1Table [FieldVarMore][THEN]= 97;
LL1Table [FieldVarMore][ELSE]= 97;
LL1Table [FieldVarMore][FI]= 97;
LL1Table [FieldVarMore][DO]= 97;
LL1Table [FieldVarMore][ENDWH]= 97;
LL1Table [FieldVarMore][RPAREN]= 97;
LL1Table [FieldVarMore][END]= 97;
LL1Table [FieldVarMore][SEMI]= 97;
LL1Table [FieldVarMore][COMMA]= 97;
LL1Table [FieldVarMore][LMIDPAREN]= 98;
LL1Table [CmpOp][LT]= 99;
LL1Table [CmpOp][EQ]= 100;
LL1Table [AddOp][PLUS]= 101;
LL1Table [AddOp][MINUS]= 102;
LL1Table [MultOp][TIMES]= 103;
LL1Table [MultOp][OVER]= 104;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -