前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >解释器模式

解释器模式

作者头像
提莫队长
发布2019-02-21 13:40:58
7830
发布2019-02-21 13:40:58
举报
文章被收录于专栏:刘晓杰刘晓杰

1.定义

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

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

代码语言:javascript
复制
/**
 * 抽象的算术运算解释器
 */
public abstract class AlgriExpression {
    public abstract int interpret();
}
代码语言:javascript
复制
/**
 * 运算符解释器,定义为abstract是为了实现不同的运算符操作
 */
public abstract class OperatorExpression extends AlgriExpression {
    protected AlgriExpression expression1, expression2;

    public OperatorExpression(AlgriExpression expression1,
            AlgriExpression expression2) {
        this.expression1 = expression1;
        this.expression2 = expression2;
    }

}
代码语言:javascript
复制
/**
 * 加法运算
 */
public class AddExpression extends OperatorExpression {

    public AddExpression(AlgriExpression expression1,
            AlgriExpression expression2) {
        super(expression1, expression2);
    }

    @Override
    public int interpret() {
        return expression1.interpret() + expression2.interpret();
    }

}
代码语言:javascript
复制
/**
 * 计算器类。这里只能用于实现加法运算。当然也可以通过继承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();
    }

}
代码语言:javascript
复制
    public static void main(String[] args) {
        Calculator calculator = new Calculator("1 + 2 + 3");
        System.out.println(calculator.calculate());
//输出为6
    }

3.PackageParser的实现

用来解析AndroidManifest的

代码语言:javascript
复制
<?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.解释器模式由于使用了大量的循环和递归,效率是个问题,特别是用于解析复杂、冗长的语法时,效率是难以忍受的。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017年03月11日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.定义
  • 2.简单实现(解析一个算术表达式)
  • 3.PackageParser的实现
  • 4.总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档