From 07c5fd6cb477f7a561aad6128d93d4dab5d7e8cc Mon Sep 17 00:00:00 2001 From: Iru Cai Date: Thu, 9 Oct 2014 14:59:42 +0800 Subject: dealing with method params --- src/minijava/symboltable/MMethod.java | 14 ++++++++++++-- src/minijava/visitor/BuildSymbolTableVisitor.java | 13 ++++++++++--- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/minijava/symboltable/MMethod.java b/src/minijava/symboltable/MMethod.java index f4b58fa..ea2a363 100644 --- a/src/minijava/symboltable/MMethod.java +++ b/src/minijava/symboltable/MMethod.java @@ -6,9 +6,10 @@ public class MMethod extends MLocalVarType { MClass method_class; MVarList paramList; - public MMethod(String m_name, int m_type, int m_column) { - super(m_type, m_column); + public MMethod(String m_name, String ret_type, int m_line, int m_column) { + super(m_line, m_column); this.name = m_name; + this.ret_type_name = ret_type; ret_type_name = null; paramList = new MVarList(); } @@ -24,4 +25,13 @@ public class MMethod extends MLocalVarType { vars.insertVar(var); return null; } + + public String addParam(MVariable var) { + String var_name = var.getName(); + if (paramList.findVar(var_name)!=-1) { + return "Parameter variable double declaration: " + var_name; + } + paramList.insertVar(var); + return null; + } } diff --git a/src/minijava/visitor/BuildSymbolTableVisitor.java b/src/minijava/visitor/BuildSymbolTableVisitor.java index a3b6fe5..ecc1a06 100644 --- a/src/minijava/visitor/BuildSymbolTableVisitor.java +++ b/src/minijava/visitor/BuildSymbolTableVisitor.java @@ -259,7 +259,7 @@ public class BuildSymbolTableVisitor extends GJDepthFirst { MClass m_class = (MClass)argu; String ret_type = n.f1.accept(this, argu).getName(); String method_name = n.f2.accept(this, argu).getName(); - MMethod m_method = new MMethod(method_name, n.f2.f0.beginLine, n.f2.f0.beginColumn); + MMethod m_method = new MMethod(method_name, ret_type, n.f2.f0.beginLine, n.f2.f0.beginColumn); // 将定义的方法插入类中,如果出错则打印错误信息 String _err = m_class.insertMethod(m_method); @@ -298,8 +298,15 @@ public class BuildSymbolTableVisitor extends GJDepthFirst { */ public MType visit(FormalParameter n, MType argu) { MType _ret=null; - n.f0.accept(this, argu); - n.f1.accept(this, argu); + MMethod m_method = (MMethod)argu; + String p_type = n.f0.accept(this, argu).getName(); + String p_name = n.f1.accept(this, argu).getName(); + MVariable param = new MVariable(p_name, p_type, n.f1.f0.beginLine, n.f1.f0.beginColumn); + // 插入方法的参数表 + String _err = m_method.addParam(param); + if (_err!=null) { + PrintError.print(n.f1.f0.beginLine, n.f1.f0.beginColumn, _err); + } return _ret; } -- cgit v1.2.3