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

📄 sp_function.java

📁 JAVA编程实现用于处理表达式的简单编译器
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
import  java.util.*;

/**
 * 内部函数处理类 
 *
 * @author  林玉东.烟台
 * @version 1.0 11/01 2003 
 */
public class SP_Function  implements SP_Const
{
	//
	private SP_Parser  parser;
	private SP_SimpleParseUI impl; 

	//
	public SP_Function(SP_Parser  parser,SP_SimpleParseUI impl)
	{
		this.parser=parser;
		this.impl=impl;
	}

	/**************/
	//内部函数分类 :数学/日期/字符串
	private static String[] funcs={
		"acos","asin","atan","cos","sin","tan",
		"exp","log","pow","abs","round","sqrt",
		"trim","substring","equals",
		"getUnixSeconds","getDateSeconds","getNowDate","getNowTime","getSomeDate","getSomeTime",
		"getYear","getMonth","getDay","getHour","getMinute","getSecond",
		"getTimerDate","getDate","getTime","getSDate"
	};
	private static HashMap systemFunctions=new HashMap(50); //元素个数的1.5倍
	static{
		for(int i=0;i<funcs.length;i++)
			systemFunctions.put(funcs[i],funcs[i]);
	}
	static public boolean isSysFunction(String name)
	{
		return systemFunctions.containsKey(name);
	}

	/**************/
	public void proFunction(String fname,SP_RunUnit src)
			throws Exception
	{
		SP_Scanner scanner=parser.getScanner();
		scanner.readOneWord();
		if(scanner.curWordType!=WT_LPAREN)
			throw new Exception("缺少( !");
		//
		if(fname.equals("acos")){
			parser.proMathExpression1(src);
			src.value1=(float)Math.acos(src.value1);
			src.type=WT_FloatConst;
		}
		else if(fname.equals("asin")){
			parser.proMathExpression1(src);
			src.value1=(float)Math.asin(src.value1);
			src.type=WT_FloatConst;
		}
		else if(fname.equals("atan")){
			parser.proMathExpression1(src);
			src.value1=(float)Math.atan(src.value1);
			src.type=WT_FloatConst;
		}
		else if(fname.equals("cos")){
			parser.proMathExpression1(src);
			src.value1=(float)Math.cos(src.value1);
			src.type=WT_FloatConst;
		}
		else if(fname.equals("sin")){
			parser.proMathExpression1(src);
			src.value1=(float)Math.sin(src.value1);
			src.type=WT_FloatConst;
		}
		else if(fname.equals("tan")){
			parser.proMathExpression1(src);
			src.value1=(float)Math.tan(src.value1);
			src.type=WT_FloatConst;
		}
		else if(fname.equals("exp")){
			parser.proMathExpression1(src);
			src.value1=(float)Math.exp(src.value1);
		}
		else if(fname.equals("log")){
			parser.proMathExpression1(src);
			src.value1=(float)Math.log(src.value1);
		}
		else if(fname.equals("pow")){
			parser.proMathExpression1(src);
			scanner.readOneWord();
			if(scanner.curWordType!=WT_COMMA)
				throw new Exception("缺少, !");
			SP_RunUnit targ=new SP_RunUnit();
			parser.proMathExpression1(targ);
			src.value1=(float)Math.pow(src.value1,(int)targ.value1);
		}
		else if(fname.equals("abs")){
			parser.proMathExpression1(src);
			src.value1=(float)Math.abs(src.value1);
		}
		else if(fname.equals("round")){
			parser.proMathExpression1(src);
			src.value1=(float)Math.round(src.value1);
		}
		else if(fname.equals("sqrt")){
			parser.proMathExpression1(src);
			src.value1=(float)Math.sqrt(src.value1);
		}
		else if(fname.equals("trim")){
			parser.proMathExpression1(src);
			src.set(src.value2.trim(),WT_StringConst);
		}
		else if(fname.equals("equals")){
			SP_RunUnit str1=new SP_RunUnit();
			parser.proMathExpression1(str1);
			scanner.readOneWord();
			if(scanner.curWordType!=WT_COMMA)
				throw new Exception("缺少, !");
			SP_RunUnit str2=new SP_RunUnit();
			parser.proMathExpression1(str2);
			src.value1=str1.value2.equals(str2.value2)?1:0;
		}
		else if(fname.equals("substring")){
			SP_RunUnit str=new SP_RunUnit();
			parser.proMathExpression1(str);
			scanner.readOneWord();
			if(scanner.curWordType!=WT_COMMA)
				throw new Exception("缺少, !");
			SP_RunUnit ind1=new SP_RunUnit();
			parser.proMathExpression1(ind1);
			scanner.readOneWord();
			if(scanner.curWordType!=WT_COMMA)
				throw new Exception("缺少, !");
			SP_RunUnit ind2=new SP_RunUnit();
			parser.proMathExpression1(ind2);
			//
			String val=str.value2.substring((int)ind1.value1,(int)ind2.value1);
			src.set(val,WT_StringConst);
		}
		else if(fname.equalsIgnoreCase("getUnixSeconds")){
			//
			parser.proMathExpression1(src);
			Calendar  date = Calendar.getInstance(); 
			int y=date.get(Calendar.YEAR);
			int m=date.get(Calendar.MONTH);
			int d=date.get(Calendar.DAY_OF_MONTH);
			date.set(y,m,d,0,0,0);
			date.setTime(new Date(date.getTime().getTime()+(long)(src.value1)*24*3600*1000));
			src.set(String.valueOf(date.getTime().getTime()/1000),WT_StringConst);
		}
		else if(fname.equalsIgnoreCase("getDateSeconds")){
			SP_RunUnit year=new SP_RunUnit();
			parser.proMathExpression1(year);
			scanner.readOneWord();
			if(scanner.curWordType!=WT_COMMA)
				throw new Exception("缺少, !");
			SP_RunUnit mon=new SP_RunUnit();
			parser.proMathExpression1(mon);
			scanner.readOneWord();
			if(scanner.curWordType!=WT_COMMA)
				throw new Exception("缺少, !");
			SP_RunUnit day=new SP_RunUnit();
			parser.proMathExpression1(day);
			scanner.readOneWord();
			if(scanner.curWordType!=WT_COMMA)
				throw new Exception("缺少, !");
			SP_RunUnit hour=new SP_RunUnit();
			parser.proMathExpression1(hour);
			scanner.readOneWord();
			if(scanner.curWordType!=WT_COMMA)
				throw new Exception("缺少, !");
			SP_RunUnit min=new SP_RunUnit();
			parser.proMathExpression1(min);
			scanner.readOneWord();
			if(scanner.curWordType!=WT_COMMA)
				throw new Exception("缺少, !");
			SP_RunUnit sec=new SP_RunUnit();
			parser.proMathExpression1(sec);

			Calendar  date = Calendar.getInstance(); 
			date.set((int)year.value1,(int)mon.value1-1,(int)day.value1,(int)hour.value1,(int)min.value1,(int)sec.value1);
			src.set(String.valueOf(date.getTime().getTime()/1000),WT_IntegerConst);
		}
		else if(fname.equalsIgnoreCase("getNowDate")){
			scanner.readOneWord();
			if(scanner.curWordType!=WT_StringConst)
				throw new Exception("缺少日期类型!");
			Calendar  date = Calendar.getInstance(); 
			int dd=0;
			if(scanner.curWordValue.equals("year"))
				dd=date.get(date.YEAR);
			else if(scanner.curWordValue.equals("mon"))
				dd=date.get(date.MONTH)+1;
			else if(scanner.curWordValue.equals("day"))
				dd=date.get(date.DAY_OF_MONTH);
			else
				throw new Exception("不识别的日期类型!");
			src.set(String.valueOf(dd),WT_IntegerConst);
		}
		else if(fname.equalsIgnoreCase("getNowTime")){
			scanner.readOneWord();
			if(scanner.curWordType!=WT_StringConst)
				throw new Exception("缺少时间类型!");
			Calendar  date = Calendar.getInstance(); 
			int dd=0;
			if(scanner.curWordValue.equals("hour"))
				dd=date.get(date.HOUR_OF_DAY);
			else if(scanner.curWordValue.equals("min"))
				dd=date.get(date.MINUTE);
			else if(scanner.curWordValue.equals("second"))
				dd=date.get(date.SECOND);
			else
				throw new Exception("不识别的时间类型!");
			src.set(String.valueOf(dd),WT_IntegerConst);
		}
		else if(fname.equalsIgnoreCase("getSomeDate")){
			SP_RunUnit seconds=new SP_RunUnit();
			parser.proMathExpression1(seconds);
			scanner.readOneWord();
			if(scanner.curWordType!=WT_COMMA)
				throw new Exception("缺少, !");
			scanner.readOneWord();
			if(scanner.curWordType!=WT_StringConst)
				throw new Exception("缺少日期类型!");
			//
			Calendar  date = Calendar.getInstance(); 
			date.setTime(new Date((long)(seconds.value1)*1000));
			int y=date.get(Calendar.YEAR);
			int m=date.get(Calendar.MONTH)+1;
			int d=date.get(Calendar.DAY_OF_MONTH);
			/*
			int h=date.get(Calendar.HOUR);
			int m=date.get(Calendar.MINUTE);
			int s=date.get(Calendar.SECOND);

			int dd=0; 
			String dates=null;
			if(scanner.curWordValue.equals("year"))
				dd=year;
			else if(scanner.curWordValue.equals("mon"))
				dd=mon;

⌨️ 快捷键说明

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