基本上就是必须把元素和句子,都要是为符号。所以需要一个他们的抽象类。就可以出来解释器模式了。为什么元素和句子要一个通用意图?因为解释器的句子,可能就是某个句子的符号。 整个代码就是树结构。任何一个点都是一个树。
个人感觉,基本不会自己独立去实现这个模式,java,c#都是一种更高级语言,如果非要开启解释模式,那么肯定可以找到某一领域的库,或者干脆换个专用的语言就好了。.
//感觉解释器模式的难点在于设计解释器和匹配规则上,而不在于解释器模式。
//所以想了一个死板的规则,测试某个字符串是否是 0~9数字的四则运算,比较好操作
//文法: <expression> ::= <num><operate><num>
//<num> ::= [0~9]
//<operate> ::= +-*/
//v1.在做解释器文法这种模式之前,还是做一个更直观的非文法的版本,来看看到底区别在哪里。
//很明显,第一版的问题,在于规则 if(isNum(obj1)&&isOperate(obj2)&&isNum(obj3)) hardcode在判断逻辑中,不符合开闭原则
//v2.第二版,已经符合开闭原则,但是看了下解释器模式,还是根本上不是一个东西。解释器的目的不是符合开闭原则,开闭原则只是它的必须要满足的条件。
//解释器的模式是固定的,用来解释一整套语法规则。 终结符和非终结符都视为一个可判断的符号。所以 必须增加一个终结符和非终结符通用的抽象类。
//这样。抽象符号类,终结符号类,非终结符号类。 context(我们会设立的一个处理类).就构成了典型的解释器模式。
//个人感觉,基本不会自己独立去实现这个模式,java,c#都是一种更高级语言,如果非要开启解释模式,那么肯定可以找到某一领域的库,或者干脆换个专用的语言就好了。
//而简单的解释,用if else .类,方法。就可以。不需要一个解释器模式.
public class Interpreter
{
public void Run()
{
String expression1="2+9";
String expression2="2=9";
String expression3="a-2";
CheckExpression checkExpression=new CheckExpression();
boolean res1= checkExpression.check(expression1);
boolean res2= checkExpression.check(expression2);
boolean res3= checkExpression.check(expression3);
LSComponentsHelper.LS_Log.Log_INFO(res1+"."+res2+"."+res3+".");
}
public void Run2()
{
String expression1="2+9";
String expression2="2=9";
String expression3="a-2";
CheckExpression2 checkExpression=new CheckExpression2();
boolean res1= checkExpression.check(expression1);
boolean res2= checkExpression.check(expression2);
boolean res3= checkExpression.check(expression3);
LSComponentsHelper.LS_Log.Log_INFO(res1+"."+res2+"."+res3+".");
}
public boolean isNum(String obj)
{
boolean res=false;
try
{
Integer.parseInt(obj);
res=true;
} catch (NumberFormatException e)
{
e.printStackTrace();
}
return res;
}
public boolean isOperate(String objstr)
{
boolean res=false;
if(objstr.equals("+")||objstr.equals("-")||objstr.equals("*")||objstr.equals("/"))
{
res=true;
}
return res;
}
//region non-interreter ,regular is with in the check logic. we need kick it out .
public class CheckExpression
{
public boolean check(String expression)
{
boolean res=false;
//num ope num
String obj1=expression.substring(0,1);
String obj2=expression.substring(1,2);
String obj3=expression.substring(2,3);
if(isNum(obj1)&&isOperate(obj2)&&isNum(obj3))
{
res=true;
}
return res;
}
}
//endregion
//region 符合开闭原则,并把元素的判断和整个表达式的判断,都抽象为一个符号,也就是终结符号和非终结符号,也就是可判断正确与否的符号。
//concext class ,很多时候都喜欢叫做context ,对于中文来说,可能会理解为一个处理类。
public class CheckExpression2
{
public IRegulation mIRegulation=new SimpleCaculateRegulation();
public boolean check(String expression)
{
boolean res=false;
if(mIRegulation.Check(expression))
{
res=true;
}
return res;
}
}
//Expression 抽象表达式
public interface IRegulation
{
public Boolean Check(String expression);
}
//非终结符表达式。也就是句子。不是某个不可拆分的符号。
public class SimpleCaculateRegulation implements IRegulation
{
@Override
public Boolean Check(String expression)
{
boolean res=false;
String obj1=expression.substring(0,1);
String obj2=expression.substring(1,2);
String obj3=expression.substring(2,3);
NumRegulation numRegulation=new NumRegulation();
OperateRegulation operateRegulation=new OperateRegulation();
if(numRegulation.Check(obj1)&&operateRegulation.Check(obj2)&&numRegulation.Check(obj3))
{
res=true;
}
return res;
}
}
//终结符表达式,数字
public class NumRegulation implements IRegulation
{
public Boolean Check(String obj)
{
boolean res = false;
try
{
Integer.parseInt(obj);
res = true;
} catch (NumberFormatException e)
{
e.printStackTrace();
}
return res;
}
}
//终结符表达式,符号
public class OperateRegulation implements IRegulation
{
public Boolean Check(String objstr)
{
boolean res = false;
if (objstr.equals("+") || objstr.equals("-") || objstr.equals("*") || objstr.equals("/"))
{
res = true;
}
return res;
}
}
//endregion
}