using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
namespace InterpretSample
{
class Program
{
static void Main(string[] args)
{
interpretHandle handle = new interpretHandle();
handle.handle("down run 10 and up move 100");
Console.WriteLine(handle.Output());
Console.Read();
}
}
abstract class AbstructInterpret
{
public abstract string Interpret();
}
class AndNode : AbstructInterpret
{
private AbstructInterpret right, left;
public AndNode(AbstructInterpret left, AbstructInterpret right)
{
this.right = right;
this.left = left;
}
public override string Interpret()
{
return left.Interpret() + "再" + right.Interpret();
}
}
class SentenceInterpret : AbstructInterpret
{
private AbstructInterpret direction, action, distance;
public SentenceInterpret(AbstructInterpret direction, AbstructInterpret action, AbstructInterpret distance)
{
this.direction = direction;
this.action = action;
this.distance = distance;
}
public override string Interpret()
{
return direction.Interpret() + action.Interpret() + distance.Interpret();
}
}
class Direction : AbstructInterpret
{
string direction;
public Direction(string direction)
{
this.direction = direction;
}
public override string Interpret()
{
if (direction.Equals("up")) return "向上";
else if (direction.Equals("down")) return "向下";
else return "无效命令";
}
}
class ActionInterpret : AbstructInterpret
{
string action;
public ActionInterpret(string action)
{
this.action = action;
}
public override string Interpret()
{
if (action.Equals("move")) return "移动";
else if (action.Equals("run")) return "快速移动";
else return "无效命令";
}
}
class DistanceInterpret : AbstructInterpret
{
string distance;
public DistanceInterpret(string distance)
{
this.distance = distance;
}
public override string Interpret()
{
return distance;
}
}
class interpretHandle
{
private AbstructInterpret node;
public void handle(string instruction)
{
AbstructInterpret left, right, direction, action, distance;
Stack stack = new Stack();
string[] words = instruction.Split(' ');
for (int i=0;i<words.Length;i++)
{
if(words[i].Equals("and"))
{
left = (AbstructInterpret)stack.Pop();
direction = new DistanceInterpret(words[++i]);
action = new ActionInterpret(words[++i]);
distance = new DistanceInterpret(words[++i]);
right = new SentenceInterpret(direction, action, distance);
stack.Push(new AndNode(left, right));
}
else
{
direction = new DistanceInterpret(words[i]);
action = new ActionInterpret(words[++i]);
distance = new DistanceInterpret(words[++i]);
left = new SentenceInterpret(direction, action, distance);
stack.Push(left);
}
}
this.node = (AbstructInterpret)stack.Pop();
}
public string Output()
{
return node.Interpret();
}
}
}
注意点:
1 分隔符(‘ ’)单引号中有空格
2 注意stack的用法栈对象