解释器模式

解释器模式实践

1.定义

给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。(其中语言就是我们需要解释的对象,文法就是这个语言的规律,解释器就是翻译机,通过文法来翻译语言。)

2.简单实现(解析一个算术表达式)

/**
 * 抽象的算术运算解释器
 */
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
    }

3.PackageParser的实现

用来解析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>

4.总结

1.优点
最大的优点使其灵活的扩展性,当我们想对文法规则进行扩展延伸时,只需要增加相应的非终结符解释器,并在构建抽象语法树时,使用到新增的解释器对象进行具体的解释即可,非常方便。
2.缺点
1.每个语法都要产生一个非终结符表达式,语法规则比较复杂时,就可能产生大量的类文件,为维护带来了非常多的麻烦。
2.解释器模式由于使用了大量的循环和递归,效率是个问题,特别是用于解析复杂、冗长的语法时,效率是难以忍受的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值