给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。(其中语言就是我们需要解释的对象,文法就是这个语言的规律,解释器就是翻译机,通过文法来翻译语言。)
/**
* 抽象的算术运算解释器
*/
public abstract class AlgriExpression {
public abstract int interpret();
}
/**
* 运算符解释器,定义为abstract是为了实现不同的运算符操作
*/
public abstract class OperatorExpression extends AlgriExpression {
protected AlgriExpression expression1, expression2;
public OperatorExpression(AlgriExpression expression1,
AlgriExpression expression2) {
this.expression1 = expression1;
this.expression2 = expression2;
}
}
/**
* 加法运算
*/
public class AddExpression extends OperatorExpression {
public AddExpression(AlgriExpression expression1,
AlgriExpression expression2) {
super(expression1, expression2);
}
@Override
public int interpret() {
return expression1.interpret() + expression2.interpret();
}
}
/**
* 计算器类。这里只能用于实现加法运算。当然也可以通过继承OperatorExpression来实现新的运算方法
*/
public class Calculator {
private Stack<AlgriExpression> mExpStack = new Stack<AlgriExpression>();
public Calculator(String expression) {
AlgriExpression exp1, exp2;
String[] element = expression.split(" ");
for(int i = 0; i < element.length; i++){
switch (element[i].charAt(0)) {
case '+':
exp1 = mExpStack.pop();
exp2 = new NumExpression(Integer.parseInt(element[++i]));
mExpStack.push(new AddExpression(exp1, exp2));
break;
default:
mExpStack.push(new NumExpression(Integer.parseInt(element[i])));
break;
}
}
}
public int calculate() {
return mExpStack.pop().interpret();
}
}
public static void main(String[] args) {
Calculator calculator = new Calculator("1 + 2 + 3");
System.out.println(calculator.calculate());
//输出为6
}
用来解析AndroidManifest的
<?xml version="1.0" encoding="utf-8"?>
//**********parsePackage
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.company.test">
//**********parseUsesPermission(有permission的话)
//**********parseApplication
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
//**********parseActivity
//**********parseServic等等,如果有的话
</application>
</manifest>
1.优点 最大的优点使其灵活的扩展性,当我们想对文法规则进行扩展延伸时,只需要增加相应的非终结符解释器,并在构建抽象语法树时,使用到新增的解释器对象进行具体的解释即可,非常方便。 2.缺点 1.每个语法都要产生一个非终结符表达式,语法规则比较复杂时,就可能产生大量的类文件,为维护带来了非常多的麻烦。 2.解释器模式由于使用了大量的循环和递归,效率是个问题,特别是用于解析复杂、冗长的语法时,效率是难以忍受的。