📄 jmfunctionparse.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 + -