📄 parseb.java
字号:
case ReadK:
Translate.parseArea.append(" " + "Read");
Translate.parseArea.append(" " + tree.name[0]);
// if(tree.table[0]!=null)
// Translate.parseArea.append( "
// "+tree.table[0].attrIR.More.VarAttr.off,tree.table[0].attrIR.More.VarAttr.level);
break;
case WriteK:
Translate.parseArea.append(" " + "Write");
break;
case CallK:
Translate.parseArea.append(" " + "Call");
Translate.parseArea.append(" " + tree.name[0]);
break;
case ReturnK:
Translate.parseArea.append(" " + "Return");
break;
default:
Translate.parseArea.append("isError2!");
isError = true;
}
}
;
break;
case ExpK: {
Translate.parseArea.append(" " + "ExpK");
switch (tree.kind.exp) {
case OpK: {
Translate.parseArea.append(" " + "Op");
switch (tree.attr.expAttr.op) {
case EQ:
Translate.parseArea.append(" " + "=");
break;
case LT:
Translate.parseArea.append(" " + "<");
break;
case PLUS:
Translate.parseArea.append(" " + "+");
break;
case MINUS:
Translate.parseArea.append(" " + "-");
break;
case TIMES:
Translate.parseArea.append(" " + " ");
break;
case OVER:
Translate.parseArea.append(" " + "/");
break;
default:
Translate.parseArea.append("isError3!");
isError = true;
}
if (tree.attr.expAttr.varkind == VarKind.ArrayMembV) {
Translate.parseArea.append(" ArrayMember ");
Translate.parseArea.append(" " + tree.name[0]);
}
}
;
break;
case ConstK:
Translate.parseArea.append(" " + "Const");
switch (tree.attr.expAttr.varkind) {
case IdV:
Translate.parseArea.append(" Id ");
Translate.parseArea.append(" " + tree.name[0]);
break;
case FieldMembV:
Translate.parseArea.append(" FieldMember ");
Translate.parseArea.append(" " + tree.name[0]);
break;
case ArrayMembV:
Translate.parseArea.append(" ArrayMember ");
Translate.parseArea.append(" " + tree.name[0]);
break;
default:
Translate.parseArea.append("var type isError!");
isError = true;
}
Translate.parseArea.append(" " + tree.attr.expAttr.val);
break;
case VariK:
Translate.parseArea.append(" " + "Vari");
switch (tree.attr.expAttr.varkind) {
case IdV:
Translate.parseArea.append(" Id ");
Translate.parseArea.append(" " + tree.name[0]);
break;
case FieldMembV:
Translate.parseArea.append(" FieldMember ");
Translate.parseArea.append(" " + tree.name[0]);
break;
case ArrayMembV:
Translate.parseArea.append(" ArrayMember ");
Translate.parseArea.append(" " + tree.name[0]);
break;
default:
Translate.parseArea.append("var type isError!");
isError = true;
}
// if(tree.table[0]!=null)
// Translate.parseArea.append("
// "+tree.table[0].attrIR.More.VarAttr.off,tree.table[0].attrIR.More.VarAttr.level);
break;
default:
Translate.parseArea.append("isError4!");
isError = true;
}
}
;
break;
default:
Translate.parseArea.append("isError5!");
isError = true;
}
Translate.parseArea.append("\n");
// 对语法树结点tree的各子结点递归调用printTree过程
// 缩进写入列表文件listing /
for (i = 0; i < 3; i++)
printTree(tree.child[i]);
// 对语法树结点tree的兄弟节点递归调用printTree过程
// 缩进写入列表文件listing /
tree = tree.sibling;
}
// 减量缩进宏,每次退出语法树节点时减量缩进 /
indentno -= 4;
}
/********************************************************
*********以下是LL1语法分析方法所用到的栈操作************
********************************************************/
/*用链表实现栈操作,栈中存放的是终极符和非终极符,上面的两个枚举
类型*/
void Push(int i,int j)
{ StackNode p;
p=new StackNode();
if (i==1)
p.ntmlvar=nontmlType[j];
else if (i==2)
p.tmlvar=lexType[j];
p.flag=i;
p.underNode=stackTop;
stackTop=p;
STACKEMPTY=false;
}
void Pop()
{ StackNode p;
p=stackTop;
stackTop=stackTop.underNode;
p=null;
if (stackTop==null)
STACKEMPTY=true;
}
/*读栈顶标志,看是终极符还是非终极符*/
int readStackflag()
{ int j;
j=stackTop.flag ;
return(j);
}
/*非终极符时*/
NontmlType readstackN()
{
return ((stackTop).ntmlvar);
}
/*终极符*/
LexType readstackT()
{
return ((stackTop).tmlvar);
}
/*压栈的实现过程,压入的是指向树节点的指针的地址*/
void PushPA(TreeNode t)
{
StackNodePA p=null;
p=new StackNodePA();
p.pointer= t ;
p.underNode =stackTopPA;
stackTopPA=p;
paSTACKEMPTY=false;
}
/*弹栈的实现过程*/
TreeNode PopPA()
{
StackNodePA p=null;
TreeNode backpointer;
p = stackTopPA;
backpointer=p .pointer;
stackTopPA=stackTopPA.underNode;
p=null;
if (stackTopPA==null)
paSTACKEMPTY=true;
return backpointer;
}
/*操作符栈的压栈实现过程,压入的是指向树节点的指针*/
void PushOp(TreeNode t)
{
StackNodeP p=null;
p=new StackNodeP();
p.pointer= t ;
p.underNode =OpStackTop;
OpStackTop=p;
OpSTACKEMPTY=false;
}
/*操作符栈的弹栈实现过程*/
TreeNode PopOp()
{
StackNodeP p=null;
TreeNode backpointer;
p=OpStackTop;
backpointer=p.pointer;
OpStackTop=OpStackTop.underNode;
p=null;
if (OpStackTop==null)
OpSTACKEMPTY= true;
return backpointer;
}
LexType ReadOpStack()
{
TreeNode t1;
t1=OpStackTop.pointer;
return (t1.attr.expAttr.op);
}
/*操作数栈的压栈实现过程,压入的是指向树节点的指针*/
void PushNum(TreeNode t)
{
StackNodeP p=null;
p =new StackNodeP();
p.pointer= t ;
p.underNode =NumStackTop;
NumStackTop=p;
NumSTACKEMPTY=false;
}
/*操作数栈的弹栈实现过程*/
TreeNode PopNum()
{
StackNodeP p=null;
TreeNode backpointer;
p =NumStackTop;
backpointer=p.pointer;
NumStackTop=NumStackTop.underNode;
p=null;
if (NumStackTop==null)
NumSTACKEMPTY=true;
return backpointer;
}
/************<语法分析功能函数> **************/
/********************************************************/
/* 函数名 CreatLL1Table */
/* 功 能 创建LL1分析表 */
/* 说 明 初始数组(表)中的每一项都为0;根据LL1文法 */
/* 给数组赋值(填表);填好后,若值为0, */
/* 表示无产生式可选,其他,为选中的产生式 */
/********************************************************/
void CreatLL1Table()
{ int i,j;
/*初始化LL1表元素*/
for (i=0;i<104;i++)
for (j=0;j<104;j++)
LL1Table[i][j]=0;
LL1Table [NontmlType.Program.ordinal()][LexType.PROGRAM.ordinal()]=1;
LL1Table [NontmlType.ProgramHead.ordinal()][LexType.PROGRAM.ordinal()] = 2;
LL1Table [NontmlType.ProgramName.ordinal()][LexType.ID.ordinal()] = 3;
LL1Table [NontmlType.DeclarePart.ordinal()][LexType.TYPE.ordinal()]= 4;
LL1Table [NontmlType.DeclarePart.ordinal()][LexType.VAR.ordinal()]= 4;
LL1Table [NontmlType.DeclarePart.ordinal()][LexType.PROCEDURE.ordinal()]= 4;
LL1Table [NontmlType.DeclarePart.ordinal()][LexType.BEGIN.ordinal()]= 4;
LL1Table [NontmlType.TypeDec.ordinal()][LexType.VAR.ordinal()]= 5;
LL1Table [NontmlType.TypeDec.ordinal()][LexType.PROCEDURE.ordinal()]= 5;
LL1Table [NontmlType.TypeDec.ordinal()][LexType.BEGIN.ordinal()]= 5;
LL1Table [NontmlType.TypeDec.ordinal()][LexType.TYPE.ordinal()]= 6;
LL1Table [NontmlType.TypeDeclaration.ordinal()][LexType.TYPE.ordinal()]= 7;
LL1Table [NontmlType.TypeDecList.ordinal()][LexType.ID.ordinal()]= 8;
LL1Table [NontmlType.TypeDecMore.ordinal()][LexType.VAR.ordinal()]= 9;
LL1Table [NontmlType.TypeDecMore.ordinal()][LexType.PROCEDURE.ordinal()]= 9;
LL1Table [NontmlType.TypeDecMore.ordinal()][LexType.BEGIN.ordinal()]= 9;
LL1Table [NontmlType.TypeDecMore.ordinal()][LexType.ID.ordinal()]= 10;
LL1Table [NontmlType.TypeId.ordinal()][LexType.ID.ordinal()]= 11;
LL1Table [NontmlType.TypeName.ordinal()][LexType.INTEGER.ordinal()]= 12;
LL1Table [NontmlType.TypeName.ordinal()][LexType.CHAR.ordinal()]= 12;
LL1Table [NontmlType.TypeName.ordinal()][LexType.ARRAY.ordinal()]= 13;
LL1Table [NontmlType.TypeName.ordinal()][LexType.RECORD.ordinal()]= 13;
LL1Table [NontmlType.TypeName.ordinal()][LexType.ID.ordinal()]= 14;
LL1Table [NontmlType.BaseType.ordinal()][LexType.INTEGER.ordinal()]= 15;
LL1Table [NontmlType.BaseType.ordinal()][LexType.CHAR.ordinal()]= 16;
LL1Table [NontmlType.StructureType.ordinal()][LexType.ARRAY.ordinal()]= 17;
LL1Table [NontmlType.StructureType.ordinal()][LexType.RECORD.ordinal()]= 18;
LL1Table [NontmlType.ArrayType.ordinal()][LexType.ARRAY.ordinal()]= 19;
LL1Table [NontmlType.Low.ordinal()][LexType.INTC.ordinal()]= 20;
LL1Table [NontmlType.Top.ordinal()][LexType.INTC.ordinal()]= 21;
LL1Table [NontmlType.RecType.ordinal()][LexType.RECORD.ordinal()]= 22;
LL1Table [NontmlType.FieldDecList.ordinal()][LexType.INTEGER.ordinal()]= 23;
LL1Table [NontmlType.FieldDecList.ordinal()][LexType.CHAR.ordinal()]= 23;
LL1Table [NontmlType.FieldDecList.ordinal()][LexType.ARRAY.ordinal()]= 24;
LL1Table [NontmlType.FieldDecMore.ordinal()][LexType.END.ordinal()]= 25;
LL1Table [NontmlType.FieldDecMore.ordinal()][LexType.INTEGER.ordinal()]= 26;
LL1Table [NontmlType.FieldDecMore.ordinal()][LexType.CHAR.ordinal()]= 26;
LL1Table [NontmlType.FieldDecMore.ordinal()][LexType.ARRAY.ordinal()]= 26;
LL1Table [NontmlType.IdList.ordinal()][LexType.ID.ordinal()]= 27;
LL1Table [NontmlType.IdMore.ordinal()][LexType.SEMI.ordinal()]= 28;
LL1Table [NontmlType.IdMore.ordinal()][LexType.COMMA.ordinal()]= 29;
LL1Table [NontmlType.VarDec.ordinal()][LexType.PROCEDURE.ordinal()]= 30;
LL1Table [NontmlType.VarDec.ordinal()][LexType.BEGIN.ordinal()]= 30;
LL1Table [NontmlType.VarDec.ordinal()][LexType.VAR.ordinal()]= 31;
LL1Table [NontmlType.VarDeclaration.ordinal()][LexType.VAR.ordinal()]= 32;
LL1Table [NontmlType.VarDecList.ordinal()][LexType.INTEGER.ordinal()]= 33;
LL1Table [NontmlType.VarDecList.ordinal()][LexType.CHAR.ordinal()]= 33;
LL1Table [NontmlType.VarDecList.ordinal()][LexType.ARRAY.ordinal()]= 33;
LL1Table [NontmlType.VarDecList.ordinal()][LexType.RECORD.ordinal()]= 33;
LL1Table [NontmlType.VarDecList.ordinal()][LexType.ID.ordinal()]= 33;
LL1Table [NontmlType.VarDecMore.ordinal()][LexType.PROCEDURE.ordinal()]= 34;
LL1Table [NontmlType.VarDecMore.ordinal()][LexType.BEGIN.ordinal()]= 34;
LL1Table [NontmlType.VarDecMore.ordinal()][LexType.INTEGER.ordinal()]= 35;
LL1Table [NontmlType.VarDecMore.ordinal()][LexType.CHAR.ordinal()]= 35;
LL1Table [NontmlType.VarDecMore.ordinal()][LexType.ARRAY.ordinal()]= 35;
LL1Table [NontmlType.VarDecMore.ordinal()][LexType.RECORD.ordinal()]= 35;
LL1Table [NontmlType.VarDecMore.ordinal()][LexType.ID.ordinal()]= 35;
LL1Table [NontmlType.VarIdList.ordinal()][LexType.ID.ordinal()]= 36;
LL1Table [NontmlType.VarIdMore.ordinal()][LexType.SEMI.ordinal()]= 37;
LL1Table [NontmlType.VarIdMore.ordinal()][LexType.COMMA.ordinal()]= 38;
LL1Table [NontmlType.ProcDec.ordinal()][LexType.BEGIN.ordinal()]= 39;
LL1Table [NontmlType.ProcDec.ordinal()][LexType.PROCEDURE.ordinal()]= 40;
LL1Table [NontmlType.ProcDeclaration.ordinal()][LexType.PROCEDURE.ordinal()]= 41;
LL1Table [NontmlType.ProcDecMore.ordinal()][LexType.BEGIN.ordinal()]= 42;
LL1Table [NontmlType.ProcDecMore.ordinal()][LexType.PROCEDURE.ordinal()]= 43;
LL1Table [NontmlType.ProcName.ordinal()][LexType.ID.ordinal()]= 44;
LL1Table [NontmlType.ParamList.ordinal()][LexType.RPAREN.ordinal()]= 45;
LL1Table [NontmlType.ParamList.ordinal()][LexType.INTEGER.ordinal()]= 46;
LL1Table [NontmlType.ParamList.ordinal()][LexType.CHAR.ordinal()]= 46;
LL1Table [NontmlType.ParamList.ordinal()][LexType.ARRAY.ordinal()]= 46;
LL1Table [NontmlType.ParamList.ordinal()][LexType.RECORD.ordinal()]= 46;
LL1Table [NontmlType.ParamList.ordinal()][LexType.ID.ordinal()]= 46;
LL1Table [NontmlType.ParamList.ordinal()][LexType.VAR.ordinal()]= 46;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -