用java创建一个表达式计算器和脚本解释器

如何用Python编写一个Lisp解释器 作者 |Peter Norvig译者 | Tianyu编辑 | Freesia出品 | Python大本营(ID: pythonnews)本文有两个目的:一是展示如何实... 阅读详情

一个简单的表达式计算,有时候我们要在程序中对某些自定义的公式进行计算。

如定制化的一些条件,如根据某个变量来决定界面元素的颜色

我们只要对这个类稍微扩展即可,例如我们重载getObjValue方法,

然后定义一个变量池,就可以实现对诸如 calculateExp("50-Qty*((1+2)*3)+2")的计算。

getObjValue()中实现对于Qty可以从变量池获得数据。

更多的扩展可以参照后面的类,可以做一个自己的脚本语言解释器。

        Polynomial dt =new Polynomial();
            long begin =System.currentTimeMillis();
            VariableFactory vf = new VariableFactory();
            vf.setVariable("A","Select * from mis_rwe where a=");
            vf.setVariable("B","150");
            vf.setVariable("conf ","'5'");
            dt.setDataFactory(vf);
            dt.calcuPolyn("set A=IIF(obj(b)=150:add(obj(a)+obj(conf),str(\" order by desc\")),:空)");//strExp
            dt.calcuPolyn("set A=str('新的变量值:')+obj(a)");//strExp
            System.out.println(vf.getVariable("a"));
            dt.calcuPolyn("set B=100");//strExp
            dt.calcuPolyn("set A=IIF(obj(b)=100:str('(变更B变量后)')+obj(a),:空)");//strExp
            System.out.println(vf.getVariable("a"));
            dt.calcuPolyn("set A=replace(Obj(A),变更B变量后,str('替换函数操作后'))");//strExp
            System.out.println(vf.getVariable("a"));
            dt.calcuPolyn("set A=replace(\"测试 test\" + ' W J G ', test, newstr)");//strExp
            System.out.println(vf.getVariable("a"));
            for(int i=0; i<10;i++)
                dt.calcuPolyn("set B=obj(b)+'100'");
            System.out.println("B="+vf.getVariable("b"));
            System.out.println("运行时间:"+(System.currentTimeMillis()-begin) +"毫秒");

 

/*--------------------------------------------------
1.实现表达式的计算;
2.实现简单的加、减、乘、除、括号运算。
3.例:calculateExp("50-10*((1+2)*3)+2")=-38
----------------------------------------------------*/

import java.util.Vector;
import java.util.Hashtable;
import java.util.Stack;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import com.jgwang.IDataFactory;

public class CalculatorA
{
    protected IDataFactory varFactory;  //当前语句的变量库
    protected Hashtable localVarFact;

    protected static Vector funct;
    protected static Hashtable pri;
    protected static String NOSOFunction="No so Function";

    public static FastHashMap buildedStates;

    static 
    {
        funct=new Vector();
        funct.addElement("+");
        funct.addElement("-");
        funct.addElement("*");
        funct.addElement("/");
        funct.addElement("(");
        funct.addElement(")");
        pri=new Hashtable();
        pri.put("+","1");
        pri.put("-","1");
        pri.put("*","2");
        pri.put("/","2");
        pri.put("(","10");
        pri.put(")","0");
        buildedStates = new FastHashMap();
    }

    public CalculatorA()
    {
        varFactory = new VariableFactory();
    }

    public void setDataFactory(IDataFactory v)
    {
        this.varFactory = v;
    }

    public void setVariable(String param, String v)
    {
        if(this.varFactory==null)
            varFactory = new VariableFactory();
        varFactory.setVariable(param, v);
    }

/*------------------------分析表达式---------------------------*/
    public Vector analyseExp(String strExp)  
    {
        boolean isStrBegin = false;
        try
        {
            Vector strObjs = new Vector();
            Vector obj = new Vector();
            byte[] bExps = strExp.getBytes();
            byte[] bExps1={'+'};
            char qmark='\'';
            if (strExp == null) 
                return null;
            int isFunct = 0;
            for(int i=0; i < bExps.length; i++)
            {
                int cPr=0;
                bExps1[0]=bExps[i];
                if((char)bExps1[0]=='"' || (char)bExps1[0]=='\'')
                {
                    if(!isStrBegin) qmark = (char)bExps1[0];
                    obj.addElement(new Byte(bExps1[0]));
                    if(qmark == (char)bExps1[0])
                        isStrBegin = !isStrBegin;
                    continue;
                }
                else if(isStrBegin)
                {
                    obj.addElement(new Byte(bExps1[0]));
                    continue;
                }            
                if((char)bExps1[0]==' ') continue;
                if (funct.indexOf(new String(bExps1))>=0)
                {

                    if('('==(char)bExps1[0] && obj.size()>0)
                    {
                        obj.addElement(new Byte(bExps1[0]));
                        isFunct ++;
                        continue;
                    }
                    else if(')'==(char)bExps1[0] && isFunct>0) 
                    {
                        obj.addElement(new Byte(bExps1[0]));
                        isFunct --;
                        continue;
                    }

                    if(isFunct==0)
                    {
                        if(obj.size()>0)
                        {
                            byte[] strObjBA= new byte[obj.size()];
                            for(int k=0; k<strObjBA.length ;k++)
                                strObjBA[k]=((Byte)obj.elementAt(k)).byteValue();
                            strObjs.addElement( new String(strObjBA));
                        }
                        if(obj.size()==0    && '-'==(char)bExps1[0])
                              strObjs.addElement("0");
                        strObjs.addElement(new String(bExps1));
                        obj.clear();
                    }
                    else
                        obj.addElement(new Byte(bExps1[0]));
                }
                else 
                {
                    obj.addElement(new Byte(bExps1[0]));
                }
            }
            if(obj.size()>0)
            {
                byte[] strObjBA= new byte[obj.size()];
                for(int k=0; k<strObjBA.length ;k++)
                    strObjBA[k]=((Byte)obj.elementAt(k)).byteValue();
                strObjs.addElement( new String(strObjBA));
            }
            return strObjs;
        }
        catch(Exception e)
        {
            return null;
        }
    }

/*------------------------计算表达式的值---------------------------*/
    public String calculateExp(String strExp)    throws Exception
    {
        /*Vector strObjs = (Vector)buildedStates.get(strExp);
        System.out.println(strObjs!=null?strObjs.toString():"");
        if(strObjs==null)
        {
            strObjs = analyseExp(strExp);
            //if(strObjs.size()>0)
                buildedStates.put(strExp,analyseExp(strExp));
        }
        else if(strObjs.size()==1)
            return getObjValue((String)strObjs.elementAt(0));*/
        Vector strObjs = analyseExp(strExp);
        Stack  cacuObj = new Stack();
        Stack  cacuFunc = new Stack();
        String strObj = "";
        String value="";
        int pr=0;
        if(strObjs.size()==1)
        {
            strObj = (String)strObjs.elementAt(0);
            if(strObj.startsWith("\"") || strObj.startsWith("'"))
                strObj = getString(strObj);
            return caculateValue(strObj,null,null);
        }
        for(int i=0; i<strObjs.size() ;i++)
        {
            strObj=(String)strObjs.elementAt(i);
            if(strObj.startsWith("\"") || strObj.startsWith("'"))
                strObj = getString(strObj);

            if(funct.indexOf(strObj)>=0)
            {
                int cPr=Integer.parseInt((String)pri.get(strObj));
                if(cPr>pr) {
                    cacuFunc.push(strObj);
                    if(cPr==10) pr=-1;  else pr=cPr;
                    continue;
                }
                if(strObj.equals(")"))
                {
                    if(pr==-1) cacuFunc.pop();
                    String f=(String)cacuFunc.pop();
                    while(!f.equals("(")) 
                    {
                        value=caculateValue((String)cacuObj.pop(),(String)cacuObj.pop(),f);
                        cacuObj.push(value);
                        f=(String)cacuFunc.pop();
                    }
                    if(cacuFunc.size()>0)
                        pr=Integer.parseInt((String)pri.get((String)cacuFunc.elementAt(cacuFunc.size()-1)));
                    else
                        pr=-1;
                    if(pr==10) pr=-1;
                }
                else 
                {
                    while(cPr<=pr) 
                    {
                        if(cacuFunc.size()>0 && cacuObj.size()>1)
                        {
                            value=caculateValue((String)cacuObj.pop(),(String)cacuObj.pop(),(String)cacuFunc.pop());
                            cacuObj.push(value);
                            if(cacuFunc.size()>0)
                                pr=Integer.parseInt((String)pri.get((String)cacuFunc.elementAt(cacuFunc.size()-1)));
                            else
                                pr=-1;
                        }
                        else
                            pr=-1;
                        if(pr==10) pr=-1;
                    }                        
                    cacuFunc.push(strObj);
                    pr=cPr;
                }
            }
            else
            {
                cacuObj.push(strObj);
            }    
            
            if(i==strObjs.size()-1)
            {
                while(cacuFunc.size()>0 && cacuObj.size()>1) 
                {
                    value=caculateValue((String)cacuObj.pop(),(String)cacuObj.pop(),(String)cacuFunc.pop());
                    cacuObj.push(value);
                }            
            }
        }
        return value;
    }

/*------------------------计算操作符---------------------------*/
    public String caculateValue(String strObj1,String strObj2,String cacuFunc)  throws Exception
    {
        try
        {

            if(strObj1.indexOf("(")>0)
                strObj1 = calcuFunction(strObj1);
            strObj1 = getObjValue(strObj1);
            if((strObj2==null)||(cacuFunc==null))
                    return strObj1;
            if(strObj2.indexOf("(")>0)
                strObj2 = calcuFunction(strObj2);
            strObj2 = getObjValue(strObj2);
                
            return cacuValue(strObj1,strObj2,cacuFunc);
        }
        catch(Exception e)
        {
            throw e;
        }
    }

    public String cacuValue(String strObj1,String strObj2,String cacuFunc)  throws Exception
    {
        double value=0;
        try
        {
            //System.out.println(strObj2+cacuFunc+strObj1);
            if(cacuFunc.equals("+") &&(!isNumber(strObj2) || !isNumber(strObj1)))
                    return strObj2+ strObj1;
            if(strObj1.length()==0)
                strObj1 = "0";
            if(strObj2.length()==0)
                strObj2 = "0";
            if(cacuFunc.equals("+") )
                value=Double.valueOf(strObj2).doubleValue()+Double.valueOf(strObj1).doubleValue();
            else if(cacuFunc.equals("-")) 
                value=Double.valueOf(strObj2).doubleValue()-Double.valueOf(strObj1).doubleValue();
            else if(cacuFunc.equals("*")) 
                value=Double.valueOf(strObj2).doubleValue()*Double.valueOf(strObj1).doubleValue();
            else if(cacuFunc.equals("/")) 
            {
                if(Double.valueOf(strObj1).doubleValue()!=0)
                    value=Double.valueOf(strObj2).doubleValue()/Double.valueOf(strObj1).doubleValue();
                else value=0;
            }
            return String.valueOf(value);
        }
        catch(Exception e)
        {
            //System.out.print(e);
            throw e;
        }
    }

    public static boolean isNumber(String arg) 
    {
         Pattern p=null; //正则表达式
         Matcher m=null; //操作的字符串
         p = Pattern.compile("\\-?\\d*\\.?\\d*[Ee]?\\d{0,3}");
         m = p.matcher(arg);
         return m.matches();
    }
    
    protected String getObjValue(String obj)
    {
        return obj;
    }
/*------------------------计算函数---------------------------*/
    public String calcuFunction(String functStatement) throws Exception
    {
        if(functStatement.toLowerCase().startsWith("str("))
        {
            String rv =  functStatement.substring(4,functStatement.lastIndexOf(")"));
            return rv.replaceFirst("['\"]","").replaceAll("['\"]$","");
        }
        String functName = functStatement.substring(0,functStatement.indexOf("("));
        String statement = functStatement.substring(functStatement.indexOf("(")+1,functStatement.length()-1);
        String[] args = split(functName,statement, ',');
        for (int i=0; i<args.length; i++)
        {
            args[i] = calculateExp(args[i]);
        }
        String v = calcuFunctValue(functName, args);
        return v;
    }

    protected String[] split(String functName, String v, char splitChar)
    {
        if(functName.equalsIgnoreCase("str"))
            return new String[]{v};
        StringBuffer objStr = new StringBuffer("");
        int isFunct = 0;
        for(int i=0; i < v.length(); i++)
        {
            if(v.charAt(i)=='(')
                isFunct ++;
            if(v.charAt(i)==')')
                isFunct --;
            if(v.charAt(i)==splitChar && isFunct==0)
                objStr.append("&"+splitChar+"&");
            else
                objStr.append(v.charAt(i));
        }    
        return new String(objStr).split("&"+splitChar+"&");
    }
    
    public String calcuFunctValue(String functName, String[] args) throws Exception
    {
        //functName = functName.toUpperCase();
        if(functName.equalsIgnoreCase("str"))
        {
            return args[0];
        }
        else if(functName.equalsIgnoreCase("obj"))
        {
            return  varFactory.getVariable(args[0]);
        }
        return extFunct(functName,args);
    }

    protected String extFunct(String functName, String[] args) throws Exception
    {
        throw new Exception("No so Function! " + functName);
    }

    public static String getString(String str)
    {
        return  str.replaceFirst("['\"]","").replaceAll("['\"]$","");
    }

    public static void main(String argc[])
    {
        try{
            CalculatorA dt =new CalculatorA();
            String strExp=argc[0];//"(25+(10*10)-100)+(5-4)";
            System.out.println(strExp+"="+dt.calculateExp(strExp));
        }
        catch(Exception e)
        {
            e.printStackTrace(System.out);
        }
    }
}
 

提供一个参考的方法,虽然原始,可以做一个自己的脚本语言解释器。

=========================================
//import java.util.*;
import com.jgwang.ITable;
import javax.servlet.http.HttpServletRequest;
import com.jgwang.ISysParamPool;
import com.jgwang.sys.Sys;
import com.jgwang.util.SysDate;
import com.jgwang.IPolynomial;

public class Polynomial  extends CalculatorA implements IPolynomial
{
    protected ITable table;
    protected ISysParamPool sys;
    protected HttpServletRequest request;

    public Polynomial()
    {
        super();
    }
    
    public void setTable(ITable table)
    {
        this.table = table;
    }

    public void setSys(ISysParamPool sys)
    {
        this.sys = sys;
    }

    public void setRequest(HttpServletRequest request)
    {
        this.request = request;
    }

    public String transStateValueExt(String state) throws Exception
    {
        return transStateValue( state);
    }
    public String transStateValue(String state) throws Exception
    {
        if(state==null || state.length()==0)
            return "";
        //公式计算项目
        while(state.indexOf("${")>=0 && state.indexOf("}")>=0)
        {
            String formula = "";
            formula = state.substring(state.indexOf("${")+2,state.indexOf("}"));
            String rv = calcuPolyn(formula);
            state = state.substring(0,state.indexOf("${")) + rv 
                + state.substring(state.indexOf("}")+1);
        }
        return state;
    }

    /*     sample: IIF(FV(Status)=1:red , : )   IIF(bool:value,bool:value,:defaultValue)
        字符串的几种表示方法 "string", 'string', str('string'), str("string"), str(无空格字符串),直接书写的无空格字符串
        对于没有引号的字符串,系统会自动将空格去掉。对于长字符串,最好采用变量,然后在多项式中用obj(var)引用。
        判断语句等于采用“=”号,对于赋值语句采用SQL语言格式的 set var=value;方式(LISP语言采用setq var=value;)。
        对于对象操作,一律必须使用obj(object id)方式定义。
    */
    public String calcuPolyn(String state) throws Exception
    {
        if(state.startsWith("set "))
        {
            String var = state.substring(4,state.indexOf("="));
            String value = state.substring(state.indexOf("=")+1);
            value =calcuPolyn(value);
            varFactory.setVariable(var, value);
            return value;
        }
        else if(state.startsWith("IIF"))
        {
            state = state.substring(4,state.lastIndexOf(")"));
            String[] args = split("IIF",state,',');
            for(int i=0; i<args.length; i++)
            {
                String[] st = split("IIF",args[i],':');
                if(stateAnalye(st[0]))
                    return calculateExp(st[1]);
            }
            return "";
        }
        return calculateExp(state);
    }

    protected String extFunct(String functName, String[] args) throws Exception
    {
        if(functName.equalsIgnoreCase("FV"))
        {
            if(table==null)
                return args[0];
            return table.getValue(args[0]);
        }
        else if(functName.equalsIgnoreCase("Rqstobj"))
        {
            String v = request.getParameter(args[0]);
            return v==null?"":Sys.toLocalStr(v);
        }
        else if(functName.equalsIgnoreCase("sysobj"))
        {
            String v = sys.getParam(args[0]);
            return v==null?"":v;
        }
        else if(functName.equalsIgnoreCase("systime"))
        {
            return SysDate.getToday(args[0]);
        }
        else if(functName.equalsIgnoreCase("ord"))
        {
            String seq = args[0];
            String fmt = args[1];
            if(fmt.length()<seq.length())
                return seq;
            if(fmt.endsWith("d"))
                return fmt.substring(0,fmt.length() - seq.length()) + seq;
            else
                return seq + fmt.substring(seq.length());
        }
        else if(functName.equalsIgnoreCase("replace"))
        {
            return args[0].replaceAll(args[1],args[2]);
        }
        else if(functName.equalsIgnoreCase("ADD"))
        {
            if(args.length<2)
                return args[0];
            return args[0]+args[1];
        }
        else if(functName.equalsIgnoreCase("MAX"))
        {
            double value = Double.valueOf(args[0] ).doubleValue();
            for (int i=1; i<args.length; i++)
            {
                if(value<Double.valueOf(args[i] ).doubleValue()-0.0001)
                    value = Double.valueOf(args[i] ).doubleValue();
            }
            return  String.valueOf(value);
        }
        else if(functName.equalsIgnoreCase("SMAX"))
        {
            String arg = args[0];
            for (int i=1; i<args.length; i++)
            {
                if(args[i].compareTo(arg)>0)
                    arg = args[i];
            }
            return  arg;
        }
        else if(functName.equalsIgnoreCase("Decimal"))
        {
            return args[0];
        }
        return "ERROR:"+functName;
    }

    protected boolean stateAnalye(String state)  throws Exception
    {
        if(state.length()==0)
            return true;
        String funct = "=";
        String[] states ;
        if(state.indexOf(">=")>=0)
        {
            states = state.split(">=");
            funct = ">=";
        }
        else if(state.indexOf("!=")>=0)
        {
            states = state.split("!=");
            funct = "!=";
        }
        else if(state.indexOf("<=")>=0)
        {
            states = state.split("<=");
            funct = "<=";
        }
        else
        {
            states = state.split("[>=<]");
            if(state.indexOf(">")>=0) funct = ">";
            if(state.indexOf("<")>=0) funct = "<";
        }
        if(states.length<2)
            return false;
        return compareState(states[0], states[1], funct);
    }

    protected boolean compareState(String obj1, String obj2, String funct)  throws Exception
    {
        obj1 = calculateExp(obj1);
        obj2 = calculateExp(obj2);
        if(!isNumber(obj1) || !isNumber(obj2))
        {
            int rv = obj1.compareTo(obj2);
            if(funct.equals("!=")) return rv!=0;
            if(rv==0) return funct.indexOf("=")>=0;
            if(rv<0) return funct.indexOf("<")>=0;
            if(rv>0) return funct.indexOf(">")>=0;
            return false;
        }
        else
        {
            if(obj1.length()==0) obj1 = "0";
            if(obj2.length()==0) obj2 = "0";
            double value1=Double.valueOf(obj1).doubleValue();
            double value2=Double.valueOf(obj2).doubleValue();
            if(funct.equals("=")) return Math.abs(value1-value2) < 0.001;
            if(funct.equals(">=")) return value1-value2 >= -0.001;
            if(funct.equals("<=")) return value1-value2 <= 0.001;
            if(funct.equals(">")) return value1-value2 > 0.001;
            if(funct.equals("<")) return value1-value2 < -0.001;
            return false;
        }
    }

    protected String getObjValue(String obj)
    {
        obj = super.getObjValue(obj);
        return obj;
    }

    public static void main(String argc[])
    {
        try{
            Polynomial dt =new Polynomial();
            long begin =System.currentTimeMillis();
            VariableFactory vf = new VariableFactory();
            vf.setVariable("A","Select * from mis_rwe where a=");
            vf.setVariable("B","150");
            vf.setVariable("conf ","'5'");
            dt.setDataFactory(vf);
            dt.calcuPolyn("set A=IIF(obj(b)=150:add(obj(a)+obj(conf),str(\" order by desc\")),:空)");//strExp
            dt.calcuPolyn("set A=str('新的变量值:')+obj(a)");//strExp
            System.out.println(vf.getVariable("a"));
            dt.calcuPolyn("set B=100");//strExp
            dt.calcuPolyn("set A=IIF(obj(b)=100:str('(变更B变量后)')+obj(a),:空)");//strExp
            System.out.println(vf.getVariable("a"));
            dt.calcuPolyn("set A=replace(Obj(A),变更B变量后,str('替换函数操作后'))");//strExp
            System.out.println(vf.getVariable("a"));
            dt.calcuPolyn("set A=replace(\"测试 test\" + ' W J G ', test, newstr)");//strExp
            System.out.println(vf.getVariable("a"));
            for(int i=0; i<10;i++)
                dt.calcuPolyn("set B=obj(b)+'100'");
            System.out.println("B="+vf.getVariable("b"));
            System.out.println("运行时间:"+(System.currentTimeMillis()-begin) +"毫秒");

        }
        catch(Exception e)
        {
            e.printStackTrace(System.out);
        }
    }
}
 

大话设计模式之爱你一万年:第二十三章 行为模式:解释器模式:在也不用担心工资计算错误了:2.解释器模式之简单计算器 我们有有这么简单的表达式: String statement = "1 - 2 + 3 - 4 + 5"; 这个表达式结果是多少呢?这里我们就可以使用到解释器进行处理。 一、常规之计算器1.0 我们先来个简单的,就是两位数的加减法,比如:1 + 2。 1.1 分析 比如我们有一个表达式: String statement = "1 + 2 "; 这里+号之间有一个很大的空格,这里主要是为了之后编码方便,进行分割而已。 ... 阅读详情

相关推荐

飞控芯片的隐形战场:传感器冗余与实时OS的可靠性革命

本文深入探讨飞控芯片在工业级无人机中的可靠性设计,聚焦传感器冗余架构与实时操作系统(RTOS)的容错机制。通过多IMU备份、自适应加权融合算法及NuttX、ChibiOS等RTOS的故障隔离技术,确保系统在极端环境下毫秒级自愈。文章还涵盖开源生态如PX4的跨平台移植及RISC-V架构的应用,为高可靠性飞控系统提供关键技术参考。

z5a6b的博客 877

Java数学运算工具类

package com.clinicalresearch.core.utils; import com.clinicalresearch.core.dto.NearDto; import com.google.common.collect.LinkedListMultimap; import com.google.common.collect.Multimap; import org.apache.commons.lang.StringUtils; import java.math.BigDecimal

u010797364的博客 932

智能座舱架构与芯片 - (3) 硬件篇 上

在了解智能座舱的基本架构之后,我们有必要针对智能座舱域的硬件平台,软件平台,SOC等进行逐一介绍。从它们的整体结构中去认识最新的智能座舱组成部件,以及主要功能等。如上图,是中央计算-区域控制架构下的智能座舱硬件平台框架图,其中,智能座舱控制器CDC挂载在以太网交换机上,与其他车控域VDC,自驾域ADC,网联设备5G+V2X等通过以太网实现数据交互。而智能座舱域的外部硬件设备还包含有连接子系统音频子系统摄像头子系统显示子系统存储子系统功能安全子系统等。

joanna_xiao的博客 2397

Java设计模式:解释器模式

解释器模式是一种设计模式,用于解析和执行特定语法的表达式。适用于简单表达式和语言的场景,如数学表达式、查询语言和规则引擎。然而,对于更复杂的表达式和语言,解释器模式可能会导致性能问题和难以维护的代码结构。在这种情况下,可以考虑使用其他解析技术,如解析器生成器、编译技术、树遍历和优化以及解析器组合器。在实际项目中,根据需求和场景选择合适的解析技术和方法至关重要。

来自上海的这位朋友 960

原形网络(Prototypical Networks)基于PyTorch的实现

我在Jay2coomzz的基础上修改了数据处理方式和evaluation_model()方法,作为初学者若有不当之处恳请大家批评指正,原文链接如下: https://blog.youkuaiyun.com/weixin_38471579/article/details/102631018 数据集和源码链接将放到评论区 文章目录1 数据集一个简单的数据集介绍数据集处理2 搭建网络CNNProtonets 1 数据集 一个简单的数据集介绍 Omniglot数据集一共包含1623 类手写体,每一类中包含20 个样本。其中.

weixin_43872532的博客 6636

Plot3d 网格数据格式

PLOT3D是一个计算机图形程序,旨在可视化计算流体力学的网格和解决方案。PLOT3D文件可以是ASCII, 也可是Fortran unformatted 或 C binary形式。PLOT3D文件分为网格文件(XYZ 文件), 空气动力学结果文件 (Q 文件)和通用结果文件(函数文件 + 函数名称文件)。网格文件中可加入所谓的IBlank参数。

weixin_62592231的博客 3720

Java递归调用—实现自定义四则运算表达式解析/计算

递归的思想,一个大型的复杂的问题,层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程。递归过程中,一定有一个结束条件,当满足这个条件之后,程序就返回,不再继续递归调用。使用递归思想解析一个复杂的表达式,最后解析为最简单的式子。

leaderFLY的博客 2012

【excel+vba】一表拆多表+不同收件人附带不同附件

快捷处理:拆分多个不同表 给不同人发送不同内容且附带附件

weixin_42779327的博客 2968

计算器——Java实现

计算器——Java实现,里面包含了一些关于Java图形化界面的实现,以及中缀表达式实现的逻辑思想,数据结构栈的基本实现

gjbss的博客 3478

20、啁啾脉冲光纤放大器:原理、设计与仿真

本文详细介绍了啁啾脉冲光纤放大器(FCPA)的原理、设计与仿真过程。内容涵盖CPA技术的基本原理、光纤基CPA系统的组成、Tm掺杂光纤放大器的工作机制、全光纤脉冲展宽器的设计以及仿真分析。通过MATLAB仿真展示了脉冲在光纤中的展宽与放大过程,并讨论了如何优化系统以减少非线性失真、控制峰值功率并提高整体性能。文章还总结了系统优化的关键策略,并展望了未来的发展方向。

v4w5x6的博客 318

【OpenClaw从入门到精通】第04篇:Web/TUI/钉钉全打通!OpenClaw多端交互实测指南(2026避坑版)

本文详解OpenClaw三大交互方式(Web控制台、TUI终端、钉钉集成),解决新手多端操作难题。Web控制台适合可视化深度配置,TUI终端满足服务器高效运维,钉钉集成实现移动办公协同。提供2026实测配置步骤、代码示例及避坑指南,涵盖设备配对、终端命令优化、聊天机器人回调验证等核心场景,助用户快速掌握"随时召唤AI助理"的全链路方案。 关键词 OpenClaw、多端交互、Web控制台、TUI终端、钉钉集成、AI助理、实操指南 核心亮点 全链路打通:覆盖Web/TIM/IM三端配置

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 3543

用Java制作简单的计算器

就是往左边判断是(sb.charAt(j)=='*'||sb.charAt(j)=='/'||sb.charAt(j)=='%'||sb.charAt(j)=='B'||sb.charAt(j)=='+'||sb.charAt(j)=='-'),而右边判断是(sb.charAt(j)=='*'||sb.charAt(j)=='/'||sb.charAt(j)=='%'||sb.charAt(j)=='B'||sb.charAt(j)=='+'||sb.charAt(j)=='-'||按钮,和自己本身框架。

充满焦虑的大学生 1万+

2023年全国职业院校技能大赛网络系统管理赛项模块A:网络构建(样题4)-网络部分解析-附详细代码

2023年全国职业院校技能大赛网络系统管理赛项模块A:网络构建(样题4)-网络部分解析-附详细代码

bfq05234214的博客 441

C++ 设计模式之解释器模式

解释器模式(Interpreter Pattern)是⼀种行为型设计模式,它定义了⼀个语⾔的⽂法,并且建⽴⼀个【解释器】来解释该语⾔中的句子。

K1_uestc的博客 2463

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

解释器模式

文章目录解释器模式1. 介绍优点:缺点:注意:2. 例子3. 总结 解释器模式 1. 介绍 解释器模式(Interpreter Pattern)是一种行为型模式。给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 简单理解:例如给定一个表达式 a+b,让后设置 a 为1,b 为2,计算 a + b 的值。可以定义一个值解释器,它用来解释变量 a 和变量 b 的值,定义一个加法解释器,它用来解释 a + b ,即先通过值表达式解释变量 a 和变量 b 的值,然.

maplecsd的博客 3376

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

解释器模式的理解和实践

解释器模式提供了一种灵活且可扩展的方式来解析和解释语言的语法或表达式。尽管它在某些场景下非常有用,但由于其复杂性和性能问题,并不适合所有情况。在构建解释器模式时,需要仔细考虑语法规则的复杂性和系统的性能需求。通过本文,我们了解了解释器模式的基本工作原理,并通过一个简单的表达式计算器示例进行了实践。希望这些内容能帮助你更好地理解和应用解释器模式。如果你在实际项目中遇到了需要解析和解释复杂语法或表达式的需求,不妨考虑一下解释器模式,它可能会为你的项目带来意想不到的好处。

huaqianzkh的专栏 1111

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

java设计模式深度解析与实践:解释器模式

解释器模式定义了一种将语言或表达式表示为对象的机制。这些对象能够解析和执行该语言的语句。它通过将每个语句或表达式映射到一个对应的解释器对象来实现这一点。解释器对象通过组合和嵌套,可以处理复杂的表达式结构。通过以上的介绍和代码示例,我们已经对解释器模式有了一个较为全面的了解。解释器模式通过将语言的语句表示为对象,并通过这些对象的解释操作来执行相应的逻辑,提供了一种强大而灵活的方式来处理自定义语言和表达式。在实际开发中,解释器模式可以帮助我们设计出易于维护和扩展的代码结构。

panqiangqiangqiang的博客 739

java编程之解释器模式

摘要:解释器模式是一种行为型设计模式,用于定义文法规则并解释特定语言的表达式。核心思想是将语言中的元素(终结符/非终结符)转化为对象结构,通过递归解释实现语义解析。典型应用包括SQL解析、数学表达式计算(如"3+5*2")和规则引擎。该模式通过Expression接口、TerminalExpression(如数字)和NonTerminalExpression(如加减法)构建类结构,优点是扩展性强,但存在类膨胀问题。文中以四则运算为例演示实现过程,并指出该模式适合简单语法场景,复杂语法建议

superfreeman的专栏 1007

java 表达式解释器_Java设计模式之从[计算器]分析解释器(Interpreter)模式

解释器模式是一种广泛运用于编译器的设计模式。它的意图是给定一个语言,定义它的文法的一种表示,并定义一个解释器来解释语言中的句子。本篇的内容和“游戏”无关,是从编译原理的角度来对这个模式进行解释,因为它几乎只出现在编译器中。下面简单介绍一下编译原理中的文法定义。文法定义可以理解为用类似正则表达式来定义一个文法,它由终结符、非终结符组成。简单来说,终结符是指的具体的符号,非终结符是指的具有递归性质的某...

weixin_39831170的博客 247

从零开始学习Java设计模式 | 行为型模式篇:解释器模式

在本讲,我们来学习一下行为型模式里面的最后一个设计模式,即解释器模式。总算是将这23种设计模式干完了,奥里给! 概述 在学习解释器模式之前,我们先来看下下面这张图。 可以看到,这就是一个计算器,大家平时用的应该也是比较多的,当我们输入了1+2+3+4-5之后,它就会给我们出一个结果5。现在我们想要设计一个软件,类似于这样的一个计算器,用来进行加减计算。 各位来思考一下,我们应该如何来设计这样一个软件呢?可能大家的第一想法就是写个工具类不就得了,然后在该工具类中提供对应的加法和减法的工具方法,就像下面这段代

李阿昀的博客 1768

解释器模式,表达式求值的终极利器!

解释器模式(Interpreter Pattern)是一种行为型设计模式,它定义了一种语言的文法表示,并提供一个解释器来处理这种语言中的句子。

ly853602的博客 1127

【Java设计模式】解释器模式

解释器设计模式用于为一种语言定义语法表示,并提供一个解释器来处理这种语法。该模式在需要解释和执行特定规则或语法的场景中非常有用,例如算术表达式或脚本语言。

道长的博客 1574

Java设计模式之从[计算器]分析解释器(Interpreter)模式

解释器模式是一种广泛运用于编译器的设计模式。它的意图是给定一个语言,定义它的文法的一种表示,并定义一个解释器来解释语言中的句子。   本篇的内容和“游戏”无关,是从编译原理的角度来对这个模式进行解释,因为它几乎只出现在编译器中。   下面简单介绍一下编译原理中的文法定义。文法定义可以理解为用类似正则表达式来定义一个文法,它由终结符、非终结符组成。简单来说,终结符是指的具体的符号,非终结符是指的

于益偲 2722

Java设计模式【解释器模式】-行为型

解释器模式(Interpreter Pattern)是一种行为型设计模式,它为某种语言定义其文法的一种表示,并定义一个解释器,使用该解释器来解释语言中的句子。通俗来说,解释器模式用于解析和处理一种特定的语言或表达式,使其能够被转换为计算机能够理解的形式。解释器模式通常用来构建简单的语言解释器或表达式求值引擎,例如计算器、命令解析器等。解释器模式是一种用于解释和执行特定语言或表达式的设计模式。它适用于语法相对简单且变化不大的场景,如数学表达式求值、简单命令解析等。

lianyinghhh的博客 2227

设计模式之解释器模式

解释器设计模式(Interpreter Pattern)是一种行为型设计模式,主要用于解释执行某些特定的语言或表达式。通过定义一系列规则,解释器模式能够分析并执行这些规则,使得代码能理解并处理自定义的语法规则或语言。解释器模式广泛应用于文本解析、规则引擎、编程语言开发等领域。// 抽象表达式接口解释器设计模式在解析和执行特定语言或规则的领域内发挥了重要作用,特别适用于解析数学表达式、构建规则引擎、实现脚本解析等场景。

道可道非常道 1171

【设计模式】Java设计模式 - 解释器模式

解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。

qq_43843951的博客 729
上一篇: 获取java类的属性和方法信息
下一篇: Delphi7中 自己创建HashTable
wjgit
博客等级 码龄18年 12粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值