summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIru Cai <mytbk920423@gmail.com>2014-10-09 14:59:42 +0800
committerIru Cai <mytbk920423@gmail.com>2014-10-09 14:59:42 +0800
commit07c5fd6cb477f7a561aad6128d93d4dab5d7e8cc (patch)
treeeb02cdadce5ebbe234716228f19dd4ee875ab630
parent72b3d46d08190d672a0ac5eae3a2e1e022662a6b (diff)
downloadminijava-07c5fd6cb477f7a561aad6128d93d4dab5d7e8cc.tar.xz
dealing with method params
-rw-r--r--src/minijava/symboltable/MMethod.java14
-rw-r--r--src/minijava/visitor/BuildSymbolTableVisitor.java13
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<MType, MType> {
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<MType, MType> {
*/
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;
}