解释器模式c语言_解释器模式的优点_解释器模式用处(4)

电脑杂谈  发布时间:2017-02-23 07:39:51  来源:网络整理
package com.interpreter;

//终结符表达式,对应0、1、2、3、4、5、6、7、8、9
public class DigitExpression implements Expression{

	public void interpreter(Context context) {
		Expression expression = new NumberExpression();//如果是数字,则直接转为number表达式
		expression.interpreter(context);
	}
	
}
这四个类就是简单的解释操作,得一提的就是其中的两次转换,这个在稍后LZ会解释一下。

下面本来该是客户端程序了,不过由于我们的例子较为复杂,客户端的代码会比较臃肿,所以LZ抽出了一个语法分析类,分担了一些客户端的任务,在标准解释器模式的类图中是没有这个类的。

各位可以把它的代码想象成在客户端里面就好,这并不影响各位理解解释器模式本身,语法分析器的代码如下。

package com.interpreter;

//语法解析器(如果按照解释器模式的设计,这些代码应该是在客户端,为了更加清晰,我们添加一个语法解析器)
public class GrammarParser {

	//语法解析
	public void parse(Context context) throws Exception{
		while (context.hasNext()) {
			Expression expression = null;
			switch (context.current()) {
				case '+':
				case '-':
					checkGrammar(context);
					expression = new OperatorExpression();
					break;
				case '0':
				case '1':
				case '2':
				case '3':
				case '4':
				case '5':
				case '6':
				case '7':
				case '8':
				case '9':
					context.mark();
					checkGrammar(context, context.current());
					context.reset();
					expression = new DigitExpression();
					break;
				default:
					throw new RuntimeException("语法错误!");//无效符号
			}
			expression.interpreter(context);
			context.next();
		}
	}
	//检查语法
	private void checkGrammar(Context context,char current){
		context.next();
		if (context.hasNext() && context.current() != '+' && context.current() != '-') {
			throw new RuntimeException("语法错误!");//第5条
		}
		try {
			Integer.valueOf(String.valueOf(current));
		} catch (Exception e) {
			throw new RuntimeException("语法错误!");//第6条
		}
	}
	//检查语法
	private void checkGrammar(Context context){
		if (context.getOperateNumbers().size() == 0) {//第4条
			throw new RuntimeException("语法错误!");
		}
		if (context.current() != '+' && context.current() != '-') {//第7条
			throw new RuntimeException("语法错误!");
		}
	}
	
}
可以看到,我们的语法分析器不仅做了简单的分析语句,从而得出相应表达式的工作,还做了一个工作,就是语法的正确性检查。


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-34001-4.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...