📄 parseb.java
字号:
{
/* 在内存中动态申请分配单元,返回指向该单元的语法树结点类型指针t */
TreeNode t = new TreeNode();
int i;
/* 语法树节点指针t为null,未能成功分配内存单元 *
* 将出错信息及行号lineno写入列表文件listing */
if (t==null)
{
error.add(new Error(lineno,"out of memory error at line "));
isError = true;
}
/* 语法树节点指针t不是null,成功分配内存单元 */
else {
/* 初始化新语法树节点t各子节点child[i]为null */
for (i=0;i<3;i++) t.child[i] = null;
/* 初始化新语法树节点t兄弟节点sibling为null */
t.sibling = null;
/* 指定新语法树节点t成员:结点类型nodekind为语句类型DecK*/
t.nodekind = NodeKind.DecK;
/* 指定新语法树节点t成员:源代码行号lineno为全局变量lineno */
t.lineno = lineno;
t.idnum=0;
for(i=0;i<10;i++)
{
t.name[i]="\0";
t.table[i] = null;
}
}
/* 函数返回声明类型语法树节点指针t */
return t;
}
/********************************************************/
/* 函数名 newProcNode */
/* 功 能 创建函数类型语法树节点函数 */
/* 说 明 该函数为语法树创建一个新的函数类型结点 */
/* 并将语法树节点成员初始化 */
/********************************************************/
TreeNode newProcNode()
{
/* 在内存中动态申请分配单元,返回指向该单元的语法树结点类型指针t */
TreeNode t = new TreeNode();
int i;
/* 语法树节点指针t为null,未能成功分配内存单元 *
* 将出错信息及行号lineno写入列表文件listing */
if (t==null)
{
error.add(new Error(lineno,"out of memory error at line "));
isError = true;
}
/* 语法树节点指针t不是null,成功分配内存单元 */
else {
/* 初始化新语法树节点t各子节点child[i]为null */
for (i=0;i<3;i++) t.child[i] = null;
/* 初始化新语法树节点t兄弟节点sibling为null */
t.sibling = null;
/* 指定新语法树节点t成员:结点类型nodekind为语句类型ProcDecK */
t.nodekind = NodeKind.ProcDecK;
/* 指定新语法树节点t成员:源代码行号lineno为全局变量lineno */
t.lineno = lineno;
t.idnum = 0;
for(i=0;i<10;i++)
{
t.name[i]="\0";
t.table[i] = null;
}
}
/* 函数返回语句类型语法树节点指针t */
return t;
}
/********************************************************/
/* 函数名 newStmlNode */
/* 功 能 创建语句标志类型语法树节点函数 */
/* 说 明 该函数为语法树创建一个新的语句标志类型结点 */
/* 并将语法树节点成员初始化 */
/********************************************************/
TreeNode newStmlNode()
{
/* 在内存中动态申请分配单元,返回指向该单元的语法树结点类型指针t */
TreeNode t = new TreeNode();
int i;
/* 语法树节点指针t为null,未能成功分配内存单元 *
* 将出错信息及行号lineno写入列表文件listing */
if (t==null)
{
error.add(new Error(lineno,"out of memory error at line "));
isError = true;
}
/* 语法树节点指针t不是null,成功分配内存单元 */
else {
/* 初始化新语法树节点t各子节点child[i]为null */
for (i=0;i<3;i++) t.child[i] = null;
/* 初始化新语法树节点t兄弟节点sibling为null */
t.sibling = null;
/* 指定新语法树节点t成员:结点类型nodekind为语句类型StmLK */
t.nodekind = NodeKind.StmLK;
/* 指定新语法树节点t成员:源代码行号lineno为全局变量lineno */
t.lineno = lineno;
t.idnum = 0;
for(i=0;i<10;i++)
{
t.name[i]="\0";
t.table[i] = null;
}
}
/*函数返回语句类型语法树节点指针t*/
return t;
}
/********************************************************/
/* 函数名 newStmtNode */
/* 功 能 创建语句类型语法树节点函数 */
/* 说 明 该函数为语法树创建一个新的语句类型结点 */
/* 并将语法树节点成员初始化 */
/********************************************************/
TreeNode newStmtNode(StmtKind kind)
{
/* 在内存中动态申请分配单元,返回指向该单元的语法树结点类型指针t */
TreeNode t = new TreeNode();
int i;
/* 语法树节点指针t为null,未能成功分配内存单元 *
* 将出错信息及行号lineno写入列表文件listing */
if (t==null)
{
error.add(new Error(lineno,"out of memory error at line "));
isError = true;
}
/* 语法树节点指针t不是null,成功分配内存单元 */
else {
/* 初始化新语法树节点t各子节点child[i]为null */
for (i=0;i<3;i++) t.child[i] = null;
/* 初始化新语法树节点t兄弟节点sibling为null */
t.sibling = null;
/* 指定新语法树节点t成员:结点类型nodekind为语句类型StmtK */
t.nodekind = NodeKind.StmtK;
/* 指定新语法树节点t成员:语句类型kind.stmt为函数给定参数kind */
t.kind.stmt = kind;
/* 指定新语法树节点t成员:源代码行号lineno为全局变量lineno */
t.lineno = lineno;
t.idnum = 0;
for(i=0;i<10;i++)
{
t.name[i]="\0";
t.table[i] = null;
}
}
/* 函数返回语句类型语法树节点指针t */
return t;
}
/********************************************************/
/* 函数名 newExpNode */
/* 功 能 表达式类型语法树节点创建函数 */
/* 说 明 该函数为语法树创建一个新的表达式类型结点 */
/* 并将语法树节点的成员初始化 */
/********************************************************/
TreeNode newExpNode(ExpKind kind)
{
/* 内存中动态申请分配单元,返回指向该单元的语法树节点类型指针t */
TreeNode t = new TreeNode();
int i;
/* 语法树节点指针t为null,未能成功分配内存单元 *
* 将出错信息及行号lineno写入列表文件listing */
if (t==null)
{
error.add(new Error(lineno,"out of memory error at line "));
isError = true;
}
/* 语法树节点指针t不是null,内存单元已经成功分配 */
else {
/* 初始化新语法树节点t各子节点child[i]为null */
for (i=0;i<3;i++) t.child[i] = null;
/* 初始化新语法树节点t兄弟节点sibling为null(空) */
t.sibling = null;
/* 指定新语法树节点t成员: 结点类型nodekind为表达式类型ExpK */
t.nodekind = NodeKind.ExpK;
/* 指定新语法树节点t成员: 表达式类型kind.exp为函数给定参数kind */
t.kind.exp = kind;
/* 指定新语法树节点t成员: 源代码行号lineno为全局变量lineno */
t.lineno = lineno;
/* 指定新语法树节点t成员: 表达式为变量类型时的变量类型varkind *
/* 为IdV.*/
t.attr.expAttr.varkind = VarKind.IdV;
/* 指定新语法树节点t成员: 类型检查类型type为Void */
t.attr.expAttr.type = ExpType.Void;
for(i=0;i<10;i++)
{
t.name[i]="\0";
t.table[i] = null;
}
}
/* 函数返回表达式类型语法树结点指针t */
return t;
}
/***********************************************************/
/* 函数名 printTab */
/* 功 能 打印空格 */
/* 说 明 在输出文件中打印个数为参数tabnum的空格 */
/***********************************************************/
void printTab(int tabnum)
{
for(int i=0;i<tabnum;i++)
Translate.parseArea.append(" ");
}
/********************************************************/
/* 函数名 printSpaces */
/* 功 能 空格打印函数 */
/* 说 明 该函数打印指定数量空格,用于表示子树缩进 */
/********************************************************/
void printSpaces()
{ int i;
/* 按给定缩进量indentno打印空格进行缩进 *
* 其中缩进量indentno总能保持非负 */
for (i=0;i<indentno;i++)
Translate.parseArea.append(" ");
}
/******************************************************/
/* 函数名 printTree */
/* 功 能 把语法树输出,显示在listing文件中 */
/* 说 明 该函数运用了宏来定义增量减量的缩进 */
/******************************************************/
void printTree(TreeNode tree)
{ int i;
// 增量缩进宏,每次进入语法树节点都进行增量缩进 /
indentno += 4;
// 函数参数给定语法树节点指针tree非null(空) /
while (tree != null) {
// 打印行号 /
if (tree.lineno == 0)
printTab(9);
else
switch ((int) (tree.lineno / 10)) {
case 0:
Translate.parseArea.append("line:" + tree.lineno);
printTab(3);
break;
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
Translate.parseArea.append("line:" + tree.lineno);
printTab(2);
break;
default:
Translate.parseArea.append("line:" + tree.lineno);
printTab(1);
}
// 调用函数printSpaces,打印相应的空格,进行缩进 /
printSpaces();
switch (tree.nodekind) {
case ProK:
Translate.parseArea.append(" " + "Prok");
break;
case PheadK: {
Translate.parseArea.append(" " + "PheadK");
Translate.parseArea.append(" " + tree.name[0]);
}
break;
case DecK: {
Translate.parseArea.append(" " + "DecK");
if (tree.attr.procAttr.paramt == ParamType.varparamType)
Translate.parseArea.append(" " + "var param:");
if (tree.attr.procAttr.paramt == ParamType.valparamType)
Translate.parseArea.append(" " + "value param:");
switch (tree.kind.dec) {
case ArrayK: {
Translate.parseArea.append(" " + "ArrayK");
Translate.parseArea.append(" " + tree.attr.arrayAttr.up);
Translate.parseArea.append(" " + tree.attr.arrayAttr.low);
if (tree.attr.arrayAttr.childtype == DecKind.CharK)
Translate.parseArea.append(" " + "Chark");
else if (tree.attr.arrayAttr.childtype == DecKind.IntegerK)
Translate.parseArea.append(" " + "IntegerK");
}
;
break;
case CharK:
Translate.parseArea.append(" " + "CharK");
break;
case IntegerK:
Translate.parseArea.append(" " + "IntegerK");
break;
case RecordK:
Translate.parseArea.append(" " + "RecordK");
break;
case IdK:
Translate.parseArea.append(" " + "IdK");
Translate.parseArea.append(" " + tree.attr.type_name);
break;
default:
Translate.parseArea.append("isError1!");
isError = true;
}
;
if (tree.idnum >= 0)
for (i = 0; i <= (tree.idnum); i++) {
Translate.parseArea.append(" " + tree.name[i]);
}
else {
Translate.parseArea.append("wrong!no var!\n");
isError = true;
}
}
break;
case TypeK:
Translate.parseArea.append(" " + "TypeK");
break;
case VarK:
Translate.parseArea.append(" " + "VarK");
// if(tree.table[0]!=null)
// Translate.parseArea.append("
// "+tree.table[0].attrIR.More.VarAttr.off,tree.table[0].attrIR.More.VarAttr.level);
break;
case ProcDecK:
Translate.parseArea.append(" " + "ProcDecK");
Translate.parseArea.append(" " + tree.name[0]);
// if(tree.table[0]!=null)
// Translate.parseArea.append("
// "+tree.table[0].attrIR.More.ProcAttr.mOff,tree.table[0].attrIR.More.ProcAttr.nOff,tree.table[0].attrIR.More.ProcAttr.level);
break;
case StmLK:
Translate.parseArea.append(" " + "StmLk");
break;
case StmtK: {
Translate.parseArea.append(" " + "StmtK");
switch (tree.kind.stmt) {
case IfK:
Translate.parseArea.append(" " + "If");
break;
case WhileK:
Translate.parseArea.append(" " + "While");
break;
case AssignK:
Translate.parseArea.append(" " + "Assign");
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -