⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 typechecker.java

📁 java实现的一个pascal编译器
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
          err.report(7, ident.getLine(), ident.getPos());
        }
        else {
          err.report(23, ident.getLine(), ident.getPos());
        }
      }
      else if (monitor_call) {
        if (!monitor_table.containsKey(key)) {
          err.report(34, ident.getLine(), ident.getPos());
        }
        else {
          entity = monitor_table.get(key);
          if (entity instanceof Procedure) {
            if (((Procedure) entity).isPrivate()) {
              err.report(51, ident.getLine(),ident.getPos());
            }
            else if (((Procedure) entity).raisesException() && !try_statement) {
              err.report(37, ident.getLine(), ident.getPos());
            }
          }
          else {
            err.report(15, ident.getLine(), ident.getPos());
          }
        }
      }
      else {    
        entity = global_table.get(key);
        if (entity instanceof Variable) {
          err.report(7, ident.getLine(), ident.getPos());
        }
        else if (!(entity instanceof Procedure) && !(entity instanceof Function)) {
          err.report(23, ident.getLine(), ident.getPos());
        }
        else if (entity instanceof Procedure) {
          if (((Procedure) entity).raisesException() && !try_statement) {
            err.report(37, ident.getLine(), ident.getPos());
          }
        }
        else if (entity instanceof Function) {
          if (((Function) entity).raisesException() && !try_statement) {
            err.report(37, ident.getLine(), ident.getPos());
          }
        }
      }
    }
    else if (previous_entity == MONITOR) {
      if (monitor_table.containsKey(key)) {
        entity = monitor_table.get(key);
        if (entity instanceof Variable) {
          err.report(7, ident.getLine(), ident.getPos());
        }
        else if (!(entity instanceof Procedure)) {
          err.report(45, ident.getLine(), ident.getPos());
        }
      }
      else {
        entity = global_table.get(key);
        if (entity instanceof Variable) {
          err.report(7, ident.getLine(), ident.getPos());
        }
        else if (!(entity instanceof Procedure) && !(entity instanceof Function)) {
          err.report(23, ident.getLine(), ident.getPos());
        }
        else if (entity instanceof Procedure) {
          if (((Procedure) entity).raisesException() && !try_statement) {
            err.report(37, ident.getLine(), ident.getPos());
          }
        }
        else if (entity instanceof Function) {
          if (((Function) entity).raisesException() && !try_statement) {
            err.report(37, ident.getLine(), ident.getPos());
          }
        }

      }
    }
    else {
      if (local_table.containsKey(key)) {
        entity = local_table.get(key);
        if (entity instanceof Variable) {
          err.report(7, ident.getLine(), ident.getPos());
        }
        else {
          err.report(23, ident.getLine(), ident.getPos());
        }
      }
      else {
        entity = global_table.get(key);
        if (entity instanceof Variable) {
          err.report(7, ident.getLine(), ident.getPos());
        }
        else if (!(entity instanceof Procedure) && !(entity instanceof Function)) {
          err.report(23, ident.getLine(), ident.getPos());
        }
        else if (entity instanceof Procedure) {
          if (((Procedure) entity).raisesException() && !try_statement) {
            err.report(37, ident.getLine(), ident.getPos());
          }
        }
        else if (entity instanceof Function) {
          if (((Function) entity).raisesException() && !try_statement) {
            err.report(37, ident.getLine(), ident.getPos());
          }
        }
      }
    }
    if (exp_list.size() > 0) {
      err.report(24, ident.getLine(), ident.getPos());
    }
  }

  /**
   * sets procedure_call to true.
   */
  public void inAArgumentsProcedureCall(AArgumentsProcedureCall node) {
    if (!exp_list.isEmpty()) {
      exp_list.removeAllElements();
    }
    procedure_call = true;
  }

  /** 
   * @see TypeChecker.outAIdentifierProcedureCall
   */
  public void outAArgumentsProcedureCall(AArgumentsProcedureCall node) {
    TIdentifier ident = node.getIdentifier();
    String key = ident.getText().toUpperCase();
    Object entity = null;
    if (program) {
       entity = global_table.get(key);
       if (entity instanceof Variable) {
         err.report(7, ident.getLine(), ident.getPos());
       }
       else if (!(entity instanceof Procedure) && !(entity instanceof Function)) {
         err.report(23, ident.getLine(), ident.getPos());
       }
       else if (entity instanceof Procedure) {
         if (((Procedure) entity).raisesException() && !try_statement) {
           err.report(37, ident.getLine(), ident.getPos());
         }
       }
       else if (entity instanceof Function) {
         if (((Function) entity).raisesException() && !try_statement) {
           err.report(37, ident.getLine(), ident.getPos());
         }
       }
    }
    else if (monitor) {
      if (monitor_table.containsKey(key)) {
        entity = monitor_table.get(key);
        if (entity instanceof Variable) {
          err.report(7, ident.getLine(), ident.getPos());
        }
        else if (!(entity instanceof Procedure)) {
          err.report(45, ident.getLine(), ident.getPos());
        }
        else {
          if (((Procedure) entity).raisesException() && !try_statement) {
            err.report(37, ident.getLine(), ident.getPos());
          }
        }
      }
      else {
        entity = global_table.get(key);
        if (entity instanceof Variable) {
          err.report(7, ident.getLine(), ident.getPos());
        }
        else if (!(entity instanceof Procedure) && !(entity instanceof Function)) {
          err.report(23, ident.getLine(), ident.getPos());
        }
        else if (entity instanceof Procedure) {
          if (((Procedure) entity).raisesException() && !try_statement) {
            err.report(37, ident.getLine(), ident.getPos());
          }
        }
        else if (entity instanceof Function) {
          if (((Function) entity).raisesException() && !try_statement) {
            err.report(37, ident.getLine(), ident.getPos());
          }
        }
      }
    }
    else if (process) {
      if (local_table.containsKey(key)) {
        entity = local_table.get(key);
        if (entity instanceof Variable) {
          err.report(7, ident.getLine(), ident.getPos());      
        }
        else {
          err.report(23, ident.getLine(), ident.getPos());
        }
      }
      else if (monitor_call) {
        if (!monitor_table.containsKey(key)) {
          err.report(34, ident.getLine(), ident.getPos());
        }
        else {
          entity = monitor_table.get(key);
          if (entity instanceof Procedure) {
            if (((Procedure) entity).isPrivate()) {
              err.report(51, ident.getLine(),ident.getPos());
            }

            if (((Procedure) entity).raisesException() && !try_statement) {
              err.report(37, ident.getLine(), ident.getPos());
            }
          }
          else {
            err.report(15, ident.getLine(), ident.getPos());
          }
        }
      }
      else {    
        entity = global_table.get(key);
        if (entity instanceof Variable) {
          err.report(7, ident.getLine(), ident.getPos());
        }
        else if (!(entity instanceof Procedure) && !(entity instanceof Function)) {
          err.report(23, ident.getLine(), ident.getPos());
        }
        else if (entity instanceof Procedure) {
          if (((Procedure) entity).raisesException() && !try_statement) {
            err.report(37, ident.getLine(), ident.getPos());
          }
        }
        else if (entity instanceof Function) {
          if (((Function) entity).raisesException() && !try_statement) {
            err.report(37, ident.getLine(), ident.getPos());
          }
        }
      }
    }
    else if (previous_entity == MONITOR) {
      if (monitor_table.containsKey(key)) {
        entity = monitor_table.get(key);
        if (entity instanceof Variable) {
          err.report(7, ident.getLine(), ident.getPos());
        }
        else if (!(entity instanceof Procedure)) {
          err.report(45, ident.getLine(), ident.getPos());
        }
        else if (((Procedure) entity).raisesException() && !try_statement) {
          err.report(37, ident.getLine(), ident.getPos());
        }
      }
      else {
        entity = global_table.get(key);
        if (entity instanceof Variable) {
          err.report(7, ident.getLine(), ident.getPos());
        }
        else if (!(entity instanceof Procedure) && !(entity instanceof Function)) {
          err.report(23, ident.getLine(), ident.getPos());
        }
        else if (entity instanceof Procedure) {
          if (((Procedure) entity).raisesException() && !try_statement) {
            err.report(37, ident.getLine(), ident.getPos());
          }
        }
        else if (entity instanceof Function) {
          if (((Function) entity).raisesException() && !try_statement) {
            err.report(37, ident.getLine(), ident.getPos());
          }
        }
      }
    }
    else {
      if (local_table.containsKey(key)) {
        entity = local_table.get(key);
        if (entity instanceof Variable) {
          err.report(7, ident.getLine(), ident.getPos());
        }
        else {
          err.report(23, ident.getLine(), ident.getPos());
        }
      }
      else {
        entity = global_table.get(key);
        if (entity instanceof Variable) {
          err.report(7, ident.getLine(), ident.getPos());
        }
        else if (!(entity instanceof Procedure) && !(entity instanceof Function)) {
          err.report(23, ident.getLine(), ident.getPos());
        }
        else if (entity instanceof Procedure) {
          if (((Procedure) entity).raisesException() && !try_statement) {
            err.report(37, ident.getLine(), ident.getPos());
          }
        }
        else if (entity instanceof Function) {
          if (((Function) entity).raisesException() && !try_statement) {
            err.report(37, ident.getLine(), ident.getPos());
          }
        }
      }
    }

    if (entity instanceof Procedure) {
      arguments = ((Procedure) entity).getArguments();
    }
    else {
      arguments = ((Function) entity).getArguments();
    }
  
    if ((arguments == null) || (arguments.size() != exp_list.size())) {
      err.report(24, ident.getLine(), ident.getPos());
    }
    Enumeration exp = exp_list.elements();
    Type t1, t2;
    for (Enumeration e = arguments.elements(); e.hasMoreElements();) {
      t1 = (Type) e.nextElement();
      t2 = (Type) exp.nextElement();
      if ((t1 instanceof ARRAY) || (t2 instanceof ARRAY)) {
        err.report(25, ident.getLine(), ident.getPos());
      } 
      else if (t1 != t2) {
        err.report(10, ident.getLine(), ident.getPos());
      }
    }
  }
  
  /**
   * reports an error if the identifier is not declared in
   * the global declaration part and it is not a channel variable.
   */
  public void outAChannelVariable(AChannelVariable node) {
    TIdentifier ident = node.getIdentifier();
    String key = ident.getText().toUpperCase();
  
    if (!global_table.containsKey(key)) {
      err.report(38, ident.getLine(), ident.getPos());
    }
    else if (!(global_table.get(key) instanceof Variable) &&
             !(((Variable) global_table.get(key)).getType() instanceof CHANNEL)) {
      err.report(38, ident.getLine(), ident.getPos());
    }
  }

  /**
   * sets channel_operations to true
   */
  public void inASendStatement(ASendStatement node) {
    channel_operations = true;
  }

  /**
   * if the identifier is not of the same type as the channel,
   * an error is reported.
   */
  public void outASendStatement(ASendStatement node) {
    TIdentifier ident = ((AChannelVariable) node.getChannelVariable()).getIdentifier();   
    String key = ident.getText().toUpperCase();
    
    if (!process) {
      err.report(44, node.getSend().getLine(), node.getSend().getPos());
    }
    Type type_ = ((CHANNEL) ((Variable) global_table.get(key)).getType()).getType();
    if (type_ != type) {
      err.report(10, node.getSend().getLine(), node.getSend().getPos());
    }
    channel_operations = false;
  }

  /**
   * sets channel_operations to true.
   */
  public void inAReceiveStatement(AReceiveStatement node) {
    channel_operations = true;
  }

  /**
   * @see TypeChecker.outASendStatement
   */
  public void outAReceiveStatement(AReceiveStatement node) {
    TIdentifier ident1 = ((AChannelVariable)node.getChannelVariable()).getIdentifier();   
    TIdentifier ident2 = node.getIdentifier();
    String key1 = ident1.getText().toUpperCase();
    String key2 = ident2.getText().toUpperCase();
    Type type1, type2 = null;

    if (!process) {
      err.report(44, node.getReceive().getLine(), node.getReceive().getPos());
    }

    if (local_table.containsKey(key2)) {
      Object entity = local_table.get(key2);
      if (!(entity instanceof Variable)) {
        err.report(43, ident2.getLine(), ident2.getPos());
      }
      else {
        type2 = ((Variable) entity).getType();
      }
    }
    else { 
      if (!(global_table.get(key2) instanceof Variable)) {
        err.report(43, ident2.getLine(), ident2.getPos());
      }
      else {
        type2 = ((Variable) global_table.get(key2)).getType();
      }
    }

    type1 = ((CHANNEL) ((Variable) global_table.get(key1)).getType()).getType();
    if (type1 != type2) {
      err.report(10, node.getReceive().getLine(), node.getReceive().getPos());
    }
    channel_operations = false;
  }
  /**
   * sets monitor call to true
   */
  public void inAMonitorCallStatement(AMonitorCallStatement node) {
    monitor_call = true;
  }

  /**
   * checks if the identifier is a monitor, and reports an error
   * if it is not.
   */
  public void outAMonitorCallStatement(AMonitorCallStatement node) {
    TIdentifier ident = node.getIdentifier();
    String key = ident.getText().toUpperCase();
   
    if (!process) {
      err.report(44, ident.getLine(), ident.getPos());
    }

    if (!global_table.containsKey(key) ||
        !(global_table.get(key) instanceof Monitor)) {
      err.report(46, ident.getLine(), ident.getPos());

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -