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

📄 jmfunctionparse.java

📁 类javaScript脚本解释器
💻 JAVA
字号:
package MultiScriptParse.Parse;

import java.util.ArrayList;
import java.util.Stack;
/**
 * <p>Title: </p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2006</p>
 * <p>Company: </p>
 * @author not attributable
 * @version 1.0
 */

class FuncReturn {

  private boolean Return = false;

  public boolean CheckSimicolon;

  public void Return() {
    Return = true;
  }

  public boolean Returned() {
    return Return;
  }

}

class FunctionElement extends NamedObj {

  private Class ReturnType = null;

  private int LineNum = 0;

  private int StartPos = 0;

  private StringBuffer FileName = new StringBuffer(50);

  private ArrayList Params = new ArrayList();

  private JMVarParse VarList;

  public FunctionElement(String toFill) {
    super(toFill);
  }

  public FunctionElement(char[] toFill, int StartPos, int length) {
    super(toFill, StartPos, length);
  }

  public Class getReturnType() {
    return ReturnType;
  }

  public void setReturnType(Class rT) {
    ReturnType = rT;
  }

  public int getLineNum() {
    return LineNum;
  }

  public void setLineNum(int LineNum) {
    this.LineNum = LineNum;
  }

  public int getStartPos() {
    return StartPos;
  }

  public void setStartPos(int StartPos) {
    this.StartPos = StartPos;
  }

  public ArrayList getParams() {
    return Params;
  }

  public void setVarList(JMVarParse vl) {
    VarList = vl;
  }

  public JMVarParse getVarList() {
    return VarList;
  }

  public void setFileName(StringBuffer fn) {
    FileName = fn;
  }

  public StringBuffer getFileName() {
    return FileName;
  }

}

public class JMFunctionParse extends JMObject {

  private NamedObjArrayList funcList = new NamedObjArrayList();

  private JMParseParamsParse ParseParamsParse;

  private JMPropParse PropParse;

  public JMFunctionParse() {
  }

  public void setPropParse(JMPropParse PropParse) {
    this.PropParse = PropParse;
  }

  public JMFunctionParse(JMParse Owner) {
    super(Owner);
  }

  public void setParseParamsParse(JMParseParamsParse ParseParamsParse) {
    this.ParseParamsParse = ParseParamsParse;
  }

  public void AddFunction(char[] toAdd)  throws JMParseException
  {
    StringBuffer key = new StringBuffer(25);
    int symbolType = 0;
    int start = JMParse.CurrPos;
    Class cc = null;

    JMParse.SkipLess33Char(toAdd);
    char ckey = toAdd[JMParse.CurrPos];
    //取出函数返回值
    while(ckey > 33) {

      if (ckey == '#'){
        JMParse.SkipRemark(toAdd);
        ckey = toAdd[++JMParse.CurrPos];
        continue;
      }

      if ( (ckey > 47) && (ckey < 58)) {

        if (symbolType == 0)
          throw new JMParseException("不正确的标志符表示法");
        key.append(ckey);
        ckey = toAdd[++JMParse.CurrPos];
        continue;
      }

      if ( (ckey == 95) || (ckey > 64 && ckey < 91) ||
          (ckey > 96 && ckey < 123)) {
        if (symbolType == 0) symbolType = 5;
        key.append(ckey);
        ckey = toAdd[++JMParse.CurrPos];
        continue;
      }

      throw new JMParseException("函数丢失返回值");
    }

    if (key.indexOf("void") == -1)
      try {
        cc = Class.forName("java.lang.Object");
      } catch (ClassNotFoundException e){
        throw new JMParseException("无效的函数返回值类型");
      }

    JMParse.SkipLess33Char(toAdd);

    //取出函数名
    symbolType = 0;
    key.delete(0, 25);
    ckey = toAdd[JMParse.CurrPos];
    while(ckey != 0) {

      if (ckey == '(') break;

      if (ckey == '#'){
        JMParse.SkipRemark(toAdd);
        ckey = toAdd[++JMParse.CurrPos];
        continue;
      }

      if ( (ckey > 47) && (ckey < 58)) {
        if (symbolType == 0)
          throw new JMParseException("不正确的标志符表示法");
        key.append(ckey);
        ckey = toAdd[++JMParse.CurrPos];
        continue;
      }

      if ( (ckey == 95) || (ckey > 64 && ckey < 91) ||
          (ckey > 96 && ckey < 123)) {
        if (symbolType == 0) symbolType = 5;
        key.append(ckey);
        ckey = toAdd[++JMParse.CurrPos];
        continue;
      }

      throw new JMParseException(new StringBuffer("遇到非法的字符 \"").
                                 append(ckey).append("\"").toString());
    }

    FunctionElement fe = new FunctionElement(key.toString());

    symbolType = 0;
    key.delete(0, 25);
    ckey = toAdd[++JMParse.CurrPos]; //跳过‘(’
    while (ckey != 0) {

      if (ckey == '#'){
        JMParse.SkipRemark(toAdd);
        ckey = toAdd[++JMParse.CurrPos];
        continue;
      }

      if (ckey < 32) {
        if (ckey == '\n')
          JMParse.CurrLine++;
        JMParse.CurrPos++;
        continue;
      }

      if (ckey == ',') {
        if (symbolType == 0)
          throw new JMParseException("多余的‘,’");
        fe.getParams().add(new String(key));
        key.delete(0, 25);
        symbolType = 0;
        JMParse.CurrPos++;
      }

      if (ckey == ')') {
        if (symbolType != 0)
          fe.getParams().add(new String(key));
        break;
      }

      if ( (ckey > 47) && (ckey < 58)) {
        if (symbolType == 0)
          throw new JMParseException("不正确的标志符表示法");
        key.append(ckey);
        ckey = toAdd[++JMParse.CurrPos];
        continue;
      }

      if ( (ckey == 95) || (ckey > 64 && ckey < 91) ||
          (ckey > 96 && ckey < 123)) {
        if (symbolType == 0) symbolType = 5;
        key.append(ckey);
        ckey = toAdd[++JMParse.CurrPos];
        continue;
      }

      throw new JMParseException("不正确的标志符表示法");

    }

    //分析变量列表
    symbolType = 0;
    key.delete(0, 25);
    ckey = toAdd[++JMParse.CurrPos]; //跳过‘)’
    JMVarParse vp = new JMVarParse(Owner);
    while(ckey != 0) {

      if (ckey == '#'){
        JMParse.SkipRemark(toAdd);
        ckey = toAdd[++JMParse.CurrPos];
        continue;
      }

      if (ckey == '{') break;

      if (ckey == ';') {
        Owner.ParseVar(key.toString(), vp);
        key.delete(0, 25);
        symbolType = 0;
        ckey = toAdd[++JMParse.CurrPos];
        continue;
      }

      if (ckey < 33) {
        if (ckey == '\n')
          JMParse.CurrLine++;
        if (symbolType != 0){
          Owner.ParseVar(key.toString(), vp);
          key.delete(0, 25);
          symbolType = 0;
          continue;
        }
        ckey = toAdd[++JMParse.CurrPos];
        continue;
      }

      if (ckey == '=') {
        if (symbolType == 0)
          throw new JMParseException(new StringBuffer("不正确的标志符表示法 ").
                                     append(key).toString());
        Owner.ParseVar(key.toString(), vp);
        key.delete(0, 25);
        symbolType = 0;
        ckey = toAdd[++JMParse.CurrPos];
        continue;
      }

      if ( (ckey > 47) && (ckey < 58)) {
        if (symbolType == 0)
          throw new JMParseException("不正确的标志符表示法");
        key.append(ckey);
        ckey = toAdd[++JMParse.CurrPos];
        continue;
      }

      if ( (ckey == 95) || (ckey > 64 && ckey < 91) ||
          (ckey > 96 && ckey < 123)) {
        if (symbolType == 0) symbolType = 5;
        key.append(ckey);
        ckey = toAdd[++JMParse.CurrPos];
        continue;
      }

      throw new JMParseException(new StringBuffer("不正确的标志符表示法 \"").
                                 append(key).append(" \"").toString());
    }

    JMParse.CurrPos++;//跳过函数开始符"{"

    JMParse.SkipLess33Char(toAdd);

    fe.setLineNum(JMParse.CurrLine);
    fe.setReturnType(cc);
    fe.setStartPos(JMParse.CurrPos);
    fe.setVarList(vp);
    fe.setFileName(new StringBuffer(JMParse.CurrFile.toString()));

    funcList.SortAddElement(fe);


    int s = 2;
    int y = 0;

    key.delete(0 ,25);
    key.append("function");


    while (toAdd[JMParse.CurrPos++] != 0) {

      if (toAdd[JMParse.CurrPos] == key.charAt(y)) {
        y++;
        if (y == 8) { //遇到字符串function;
          break;
        }
        continue;
      }

      y = 0;

      if (toAdd[JMParse.CurrPos] == '\n'){
        JMParse.CurrLine++;
        continue;
      }

      if (toAdd[JMParse.CurrPos] == '{'){
        s++;
        continue;
      }

      if (toAdd[JMParse.CurrPos] == '}') {
        s--;
        continue;
      }
    }

    if (s > 1)
      throw new JMParseException("丢失函数结束符 \"}\"");
    else if (s < 1)
      throw new JMParseException("多余的函数结束符 \"}\"");

    //退回到上一个函数结束处
    while (toAdd[--JMParse.CurrPos] != '}')
      if (toAdd[JMParse.CurrPos] == '\n')
        JMParse.CurrLine--;


  }

  public Object ExecFunction(String FuncName, char[] toExec, ArrayList Params) throws JMParseException
  {
    //函数在压栈时要记录"{"后的一个字符的位置
    FunctionElement pe = (FunctionElement) funcList.SortFindElement(FuncName);
    if (pe == null)
      throw new JMParseException(new StringBuffer("未定义的函数").append(FuncName).toString());


    ArrayList al = Params;
    if (al == null)
      al = ParseParamsParse.ParseParams(toExec);


    JMVarParse tmp = JMParse.LocalVarList; //记录局部变量的引用
    int MemoPos = JMParse.CurrPos++; //记录函数跳转的位置以便函数返回
    int MemoLine = JMParse.CurrLine;
    StringBuffer MemoSb = JMParse.CurrFile;

    JMParse.LocalVarList = pe.getVarList().getNew();

    if (al.size() != pe.getParams().size())
      throw new JMParseException(new StringBuffer("函数 ").append(FuncName).
                                 append(" 的调用参数错误").toString());

    for (int i = 0; i < al.size(); i++) {
      if (!JMParse.LocalVarList.AddVariable(pe.getParams().get(i).toString(),
                                            al.get(i)))
        throw new JMParseException(new StringBuffer("重复定义的变量 ").
                                   append(pe.getParams().get(i).toString()).
                                   toString());
    }

    JMParse.CurrPos = pe.getStartPos();
    JMParse.CurrLine = pe.getLineNum();
    JMParse.CurrFile = pe.getFileName();

    char ckey = toExec[JMParse.CurrPos];

    FuncReturn fr = new FuncReturn();
    Object oo = null;

    while(ckey != '}') {

      oo = Owner.Next(fr, null);
      if (fr.Returned()) {
        break;
      }

      Owner.SkipLess33Char(toExec);
      ckey = toExec[JMParse.CurrPos];
    }

    JMParse.LocalVarList = tmp;
    JMParse.CurrPos = MemoPos;
    JMParse.CurrLine = MemoLine;
    JMParse.CurrFile = MemoSb;

    if (!fr.Returned() && (pe.getReturnType() != null))
      throw new JMParseException(new StringBuffer("函数 ").
                                 append(pe.getName()).append(" 丢失返回值 ").
                                 toString());

    if (toExec[JMParse.CurrPos] == '.')
      oo = PropParse.ParseObject(oo, toExec);

    return oo;
  }
}

⌨️ 快捷键说明

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