📄 analyuyi.java
字号:
/********************************************************************/
void TypeName(TreeNode t)
{
if (t !=null)
{
if ((token.Lex.equals("INTEGER"))||(token.Lex.equals("CHAR")))
BaseType(t);
else if ((token.Lex.equals("ARRAY"))||(token.Lex.equals("RECORD")))
StructureType(t);
else if (token.Lex.equals("ID"))
{
t.kind = "IdK";
t.attr.type_name = token.Sem;
match("ID");
}
else
ReadNextToken();
}
}
/********************************************************************/
/* 函数名 BaseType */
/* 功 能 类型声明部分的处理函数 */
/* 产生式 < BaseType > ::= INTEGER | CHAR */
/* 说 明 函数根据文法产生式,调用相应的递归处理函数,生成语法树节点 */
/********************************************************************/
void BaseType(TreeNode t)
{
if (token.Lex.equals("INTEGER"))
{
match("INTEGER");
t.kind = "IntegerK";
}
else if (token.Lex.equals("CHAR"))
{
match("CHAR");
t.kind = "CharK";
}
else
ReadNextToken();
}
/********************************************************************/
/* 函数名 StructureType */
/* 功 能 类型声明部分的处理函数 */
/* 产生式 < StructureType > ::= ArrayType | RecType */
/* 说 明 函数根据文法产生式,调用相应的递归处理函数,生成语法树节点 */
/********************************************************************/
void StructureType(TreeNode t)
{
if (token.Lex.equals("ARRAY"))
{
ArrayType(t);
}
else if (token.Lex.equals("RECORD"))
{
t.kind = "RecordK";
RecType(t);
}
else
ReadNextToken();
}
/********************************************************************/
/* 函数名 ArrayType */
/* 功 能 类型声明部分的处理函数 */
/* 产生式 < ArrayType > ::= ARRAY [low..top] OF BaseType */
/* 说 明 函数根据文法产生式,调用相应的递归处理函数,生成语法树节点 */
/********************************************************************/
void ArrayType(TreeNode t)
{
t.attr.arrayAttr = new ArrayAttr();
match("ARRAY");
match("LMIDPAREN");
if (token.Lex.equals("INTC"))
t.attr.arrayAttr.low = Integer.parseInt(token.Sem);
match("INTC");
match("UNDERANGE");
if (token.Lex.equals("INTC"))
t.attr.arrayAttr.up = Integer.parseInt(token.Sem);
match("INTC");
match("RMIDPAREN");
match("OF");
BaseType(t);
t.attr.arrayAttr.childtype = t.kind;
t.kind = "ArrayK";
}
/********************************************************************/
/* 函数名 RecType */
/* 功 能 类型声明部分的处理函数 */
/* 产生式 < RecType > ::= RECORD FieldDecList END */
/* 说 明 函数根据文法产生式,调用相应的递归处理函数,生成语法树节点 */
/********************************************************************/
void RecType(TreeNode t)
{
TreeNode p = null;
match("RECORD");
p = FieldDecList();
if (p!=null)
t.child[0] = p;
else
syntaxError("a record body is requested!");
match("END");
}
/********************************************************************/
/* 函数名 FieldDecList */
/* 功 能 类型声明部分的处理函数 */
/* 产生式 < FieldDecList > ::= BaseType IdList ; FieldDecMore */
/* | ArrayType IdList; FieldDecMore */
/* 说 明 函数根据文法产生式,调用相应的递归处理函数,生成语法树节点 */
/********************************************************************/
TreeNode FieldDecList()
{
TreeNode t = newNode("DecK");
TreeNode p = null;
if (t != null)
{
if ((token.Lex.equals("INTEGER"))||(token.Lex.equals("CHAR")))
{
BaseType(t);
IdList(t);
match("SEMI");
p = FieldDecMore();
}
else if (token.Lex.equals("ARRAY"))
{
ArrayType(t);
IdList(t);
match("SEMI");
p = FieldDecMore();
}
else
{
ReadNextToken();
syntaxError("type name is expected");
}
t.sibling = p;
}
return t;
}
/********************************************************************/
/* 函数名 FieldDecMore */
/* 功 能 类型声明部分的处理函数 */
/* 产生式 < FieldDecMore > ::= ε | FieldDecList */
/* 说 明 函数根据文法产生式,调用相应的递归处理函数,生成语法树节点 */
/********************************************************************/
TreeNode FieldDecMore()
{
TreeNode t = null;
if (token.Lex.equals("INTEGER")||token.Lex.equals("CHAR")||token.Lex.equals("ARRAY"))
t = FieldDecList();
else if (token.Lex.equals("END")) {}
else
ReadNextToken();
return t;
}
/********************************************************************/
/* 函数名 IdList */
/* 功 能 类型声明部分的处理函数 */
/* 产生式 < IdList > ::= id IdMore */
/* 说 明 函数根据文法产生式,调用相应的递归处理函数,生成语法树节点 */
/********************************************************************/
void IdList(TreeNode t)
{
if (token.Lex.equals("ID"))
{
t.name[(t.idnum)] = token.Sem;
t.idnum = t.idnum + 1;
match("ID");
}
IdMore(t);
}
/********************************************************************/
/* 函数名 IdMore */
/* 功 能 类型声明部分的处理函数 */
/* 产生式 < IdMore > ::= ε | , IdList */
/* 说 明 函数根据文法产生式,调用相应的递归处理函数,生成语法树节点 */
/********************************************************************/
void IdMore(TreeNode t)
{
if (token.Lex.equals("COMMA"))
{
match("COMMA");
IdList(t);
}
else if (token.Lex.equals("SEMI")) {}
else
ReadNextToken();
}
/**************************变量声明部分******************************/
/********************************************************************/
/* 函数名 VarDec */
/* 功 能 变量声明部分的处理 */
/* 产生式 < VarDec > ::= ε | VarDeclaration */
/* 说 明 函数根据文法产生式,调用相应的递归处理函数,生成语法树节点 */
/********************************************************************/
TreeNode VarDec()
{
TreeNode t = null;
if (token.Lex.equals("VAR"))
t = VarDeclaration();
else if ((token.Lex.equals("PROCEDURE"))||(token.Lex.equals("BEGIN"))) {}
else
ReadNextToken();
return t;
}
/********************************************************************/
/* 函数名 VarDeclaration */
/* 功 能 变量声明部分的处理函数 */
/* 产生式 < VarDeclaration > ::= VAR VarDecList */
/* 说 明 函数根据文法产生式,调用相应的递归处理函数,生成语法树节点 */
/********************************************************************/
TreeNode VarDeclaration()
{
match("VAR");
TreeNode t = VarDecList();
if (t==null)
syntaxError("a var declaration is expected!");
return t;
}
/********************************************************************/
/* 函数名 VarDecList */
/* 功 能 变量声明部分的处理函数 */
/* 产生式 < VarDecList > ::= TypeName VarIdList; VarDecMore */
/* 说 明 函数根据文法产生式,调用相应的递归处理函数,生成语法树节点 */
/********************************************************************/
TreeNode VarDecList()
{
TreeNode t = newNode("DecK");
TreeNode p = null;
if (t != null)
{
TypeName(t);
VarIdList(t);
match("SEMI");
p = VarDecMore();
t.sibling = p;
}
return t;
}
/********************************************************************/
/* 函数名 VarDecMore */
/* 功 能 变量声明部分的处理函数 */
/* 产生式 < VarDecMore > ::= ε | VarDecList */
/* 说 明 函数根据文法产生式,调用相应的递归处理函数,生成语法树节点 */
/********************************************************************/
TreeNode VarDecMore()
{
TreeNode t =null;
if ((token.Lex.equals("INTEGER"))||(token.Lex.equals("CHAR")) ||(token.Lex.equals("ARRAY"))||(token.Lex.equals("RECORD")) ||(token.Lex.equals("ID")))
t = VarDecList();
else if ((token.Lex.equals("PROCEDURE"))||(token.Lex.equals("BEGIN")))
{}
else
ReadNextToken();
return t;
}
/********************************************************************/
/* 函数名 VarIdList */
/* 功 能 变量声明部分的处理函数 */
/* 产生式 < VarIdList > ::= id VarIdMore */
/* 说 明 函数根据文法产生式,调用相应的递归处理函数,生成语法树节点 */
/********************************************************************/
void VarIdList(TreeNode t)
{
if (token.Lex.equals("ID"))
{
t.name[(t.idnum)] = token.Sem;
t.idnum = t.idnum + 1;
match("ID");
}
else
{
syntaxError("a varid is expected here!");
ReadNextToken();
}
VarIdMore(t);
}
/********************************************************************/
/* 函数名 VarIdMore */
/* 功 能 变量声明部分的处理函数 */
/* 产生式 < VarIdMore > ::= ε | , VarIdList */
/* 说 明 函数根据文法产生式,调用相应的递归处理函数,生成语法树节点 */
/********************************************************************/
void VarIdMore(TreeNode t)
{
if (token.Lex.equals("COMMA"))
{
match("COMMA");
VarIdList(t);
}
else if (token.Lex.equals("SEMI")) {}
else
ReadNextToken();
}
/****************************过程声明部分****************************/
/********************************************************************/
/* 函数名 ProcDec */
/* 功 能 函数声明部分的处理 */
/* 产生式 < ProcDec > ::= ε | ProcDeclaration */
/* 说 明 函数根据文法产生式,调用相应的递归处理函数,生成语法树节点 */
/********************************************************************/
TreeNode ProcDec()
{
TreeNode t = null;
if (token.Lex.equals("PROCEDURE"))
t = ProcDeclaration();
else if (token.Lex.equals("BEGIN")) {}
else
ReadNextToken();
return t;
}
/********************************************************************/
/* 函数名 ProcDeclaration */
/* 功 能 函数声明部分的处理函数 */
/* 产生式 < ProcDeclaration > ::= PROCEDURE ProcName(ParamList); */
/* ProcDecPart */
/* ProcBody */
/* ProcDecMore *
/* 说 明 函数根据文法产生式,调用相应的递归处理函数,生成语法树节点 */
/********************************************************************/
TreeNode ProcDeclaration()
{
TreeNode t = newNode("ProcDecK");
match("PROCEDURE");
if (token.Lex.equals("ID"))
{
t.name[0] = token.Sem;
t.idnum = t.idnum+1;
match("ID");
}
match("LPAREN");
ParamList(t);
match("RPAREN");
match("SEMI");
t.child[1] = ProcDecPart();
t.child[2] = ProcBody();
t.sibling = ProcDecMore();
return t;
}
/********************************************************************/
/* 函数名 ProcDecMore */
/* 功 能 更多函数声明中处理函数 */
/* 产生式 < ProcDecMore > ::= ε | ProcDeclaration */
/* 说 明 函数根据文法产生式,调用相应的递归处理函数,生成语法树节点 */
/********************************************************************/
TreeNode ProcDecMore()
{
TreeNode t = null;
if (token.Lex.equals("PROCEDURE"))
t = ProcDeclaration();
else if (token.Lex.equals("BEGIN")) {}
else
ReadNextToken();
return t;
}
/********************************************************************/
/* 函数名 ParamList */
/* 功 能 函数声明中参数声明部分的处理函数 */
/* 产生式 < ParamList > ::= ε | ParamDecList */
/* 说 明 函数根据文法产生式,调用相应的递归处理函数,生成语法树节点 */
/********************************************************************/
void ParamList(TreeNode t)
{
TreeNode p = null;
if ((token.Lex.equals("INTEGER"))||(token.Lex.equals("CHAR"))|| (token.Lex.equals("ARRAY"))||(token.Lex.equals("RECORD"))|| (token.Lex.equals("ID"))||(token.Lex.equals("VAR")))
{
p = ParamDecList();
t.child[0] = p;
}
else if (token.Lex.equals("RPAREN")) {}
else
ReadNextToken();
}
/********************************************************************/
/* 函数名 ParamDecList */
/* 功 能 函数声明中参数声明部分的处理函数 */
/* 产生式 < ParamDecList > ::= Param ParamMore */
/* 说 明 函数根据文法产生式,调用相应的递归处理函数,生成语法树节点 */
/********************************************************************/
TreeNode ParamDecList()
{
TreeNode t = Param();
TreeNode p = ParamMore();
if (p!=null)
t.sibling = p;
return t
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -