summaryrefslogtreecommitdiff
path: root/src/minijava/symboltable/MMethod.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/minijava/symboltable/MMethod.java')
-rw-r--r--src/minijava/symboltable/MMethod.java71
1 files changed, 70 insertions, 1 deletions
diff --git a/src/minijava/symboltable/MMethod.java b/src/minijava/symboltable/MMethod.java
index 7f57a40..2d2dc24 100644
--- a/src/minijava/symboltable/MMethod.java
+++ b/src/minijava/symboltable/MMethod.java
@@ -1,9 +1,11 @@
package minijava.symboltable;
+import minijava.typecheck.PrintError;
+
public class MMethod extends MLocalVarType {
MVarList params;
String ret_type_name;
- MClass method_class;
+ public MClass method_class;
MVarList paramList;
public MStatementList statements;
public MExpression ret_expr;
@@ -37,6 +39,73 @@ public class MMethod extends MLocalVarType {
return null;
}
+ // 检测函数的返回类型,参数类型,局部变量类型是否为有效类型
+ public boolean validVars() {
+ if (method_class.validType(ret_type_name)==false) {
+ PrintError.print(this.line, this.column, "Return type of method "+this.name+" invalid");
+ return false;
+ }
+
+ for (int i=0; i<paramList.size(); i++) {
+ MVariable p_var = paramList.varlist.elementAt(i);
+ if (method_class.validType(p_var.typename)==false) {
+ PrintError.print(p_var.line, p_var.column, "Type "+p_var.typename+" invalid");
+ return false;
+ }
+ }
+
+ for (int i=0; i<vars.size(); i++) {
+ MVariable m_var = vars.varlist.elementAt(i);
+ if (method_class.validType(m_var.typename)==false) {
+ PrintError.print(m_var.line, m_var.column, "Type "+m_var.typename+" invalid");
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ // 检查方法自身是否复合方法覆盖条件
+ public boolean validFunc() {
+ MClass m_class = method_class;
+ while (m_class.extend_class!=null) {
+ m_class = m_class.extend_class;
+ int idx = m_class.methods.findMethod(this.name);
+ if (idx!=-1) {
+ // 找到同名方法,检测是否能覆盖
+ if (this.ret_type_name.
+ equals(m_class.methods.methods.elementAt(idx))==false) {
+ PrintError.print(line, column, "Method " +
+ this.name + " has type different from the one in its parent class");
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ // 从局部变量,参数表,类变量中查找变量
+ public MVariable findVarByName(String s) {
+ int idx;
+ idx = vars.findVar(s);
+ if (idx!=-1) {
+ return vars.varlist.elementAt(idx);
+ }
+ idx = paramList.findVar(s);
+ if (idx!=-1) {
+ return paramList.varlist.elementAt(idx);
+ }
+ idx = method_class.vars.findVar(s);
+ if (idx!=-1) {
+ return method_class.vars.varlist.elementAt(idx);
+ }
+ return null;
+ }
+
+ public void checkStatements() {
+ statements.checkStatements(this);
+ }
+
public void printMethod(int spaces) {
String ps = OutputFormat.spaces(spaces);
System.err.print(ps + this.ret_type_name + " " + this.name + "(");