软件设计十七
实验17:解释器模式(选作)
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、理解解释器模式的动机,掌握该模式的结构;
2、能够利用解释器模式解决实际问题。
|
|
|
|
[实验任务一]:解释器模式
某机器人控制程序包含一些简单的英文指令,其文法规则如下:
expression ::= direction action distance | composite
composite ::= expression and expression
direction ::= ‘up’ | ‘down’ | ‘left’ | ‘right’
action ::= ‘move’ | ‘run’
distance ::= an integer //一个整数值
如输入:up move 5,则输出“向上移动5个单位”;输入:down run 10 and left move 20,则输出“向下移动10个单位再向左移动20个单位”。
实验要求:
1. 提交类图;
2. 提交源代码;
import java.util.ArrayList;
import java.util.List;
// 抽象表达式接口
interface Expression {
String interpret();
}
// 方向表达式
class DirectionExpression implements Expression {
private String direction;
public DirectionExpression(String direction) {
this.direction = direction;
}
@Override
public String interpret() {
switch (direction) {
case "up":
return "向上";
case "down":
return "向下";
case "left":
return "向左";
case "right":
return "向右";
default:
throw new IllegalArgumentException("无效的方向: " + direction);
}
}
}
// 动作表达式
class ActionExpression implements Expression {
private String action;
public ActionExpression(String action) {
this.action = action;
}
@Override
public String interpret() {
switch (action) {
case "move":
return "移动";
case "run":
return "奔跑";
default:
throw new IllegalArgumentException("无效的动作: " + action);
}
}
}
// 距离表达式
class DistanceExpression implements Expression {
private int distance;
public DistanceExpression(int distance) {
this.distance = distance;
}
@Override
public String interpret() {
return distance + "个单位";
}
}
// 组合表达式
class CompositeExpression implements Expression {
private Expression firstExpression;
private Expression secondExpression;
public CompositeExpression(Expression firstExpression, Expression secondExpression) {
this.firstExpression = firstExpression;
this.secondExpression = secondExpression;
}
@Override
public String interpret() {
return firstExpression.interpret() + "再" + secondExpression.interpret();
}
}
// 上下文类,解析指令字符串
class InterpreterContext {
private String[] tokens;
private int currentIndex = 0;
public InterpreterContext(String input) {
this.tokens = input.split(" ");
}
public boolean hasNext() {
return currentIndex < tokens.length;
}
public String nextToken() {
return tokens[currentIndex++];
}
}
// 客户端解析器
class InterpreterClient {
public static Expression parse(String input) {
InterpreterContext context = new InterpreterContext(input);
return parseExpression(context);
}
private static Expression parseExpression(InterpreterContext context) {
if (!context.hasNext()) {
return null;
}
String direction = context.nextToken();
String action = context.nextToken();
int distance = Integer.parseInt(context.nextToken());
Expression expression = new CompositeSingleExpression(
new DirectionExpression(direction),
new ActionExpression(action),
new DistanceExpression(distance)
);
if (context.hasNext()) {
String next = context.nextToken();
if ("and".equals(next)) {
Expression secondExpression = parseExpression(context);
return new CompositeExpression(expression, secondExpression);
}
}
return expression;
}
}
// 单个动作组合表达式
class CompositeSingleExpression implements Expression {
private DirectionExpression direction;
private ActionExpression action;
private DistanceExpression distance;
public CompositeSingleExpression(DirectionExpression direction, ActionExpression action, DistanceExpression distance) {
this.direction = direction;
this.action = action;
this.distance = distance;
}
@Override
public String interpret() {
return direction.interpret() + action.interpret() + distance.interpret();
}
}
// 测试类
public class RobotInterpreter {
public static void main(String[] args) {
String input1 = "up move 5";
String input2 = "down run 10 and left move 20";
Expression expression1 = InterpreterClient.parse(input1);
System.out.println(expression1.interpret()); // 输出: 向上移动5个单位
Expression expression2 = InterpreterClient.parse(input2);
System.out.println(expression2.interpret()); // 输出: 向下移动10个单位再向左移动20个单位
}
}
3. 运行结果
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
2023-11-19 vue中使用element中的表单展示数据
2023-11-19 mysql语句小提示之select * 和select 变量 ----------之间的区别