Ejemplo n.º 1
0
 private bool _TryParseDistance(string[] argsText, out AbstractCommand cmd)
 {
     // здесь может некорректный формат команды
     cmd = new BadCommand(this.currCmdText);
     if (argsText.Length != 4)
         return false;
     // на каждую точку по две координаты
     Point[] points = new Point[argsText.Length / 2];
     for (int i = 0; i < points.Length; ++i)
         if (!_TryParsePoint(argsText[2 * i], argsText[2 * i + 1], ref points[i]))
             return false;
     cmd = new DistanceCommand(points[0], points[1]);
     return true;
 }
Ejemplo n.º 2
0
 private bool _TryParseTriangle(CommandKind cmdKind, string[] argsText, out AbstractCommand cmd)
 {
     // здесь может некорректный формат команды
     cmd = new BadCommand(this.currCmdText);
     // команда работы с треугольником принимает лидо длины строн (3 аргумента), 
     // либо координаты вершин (6 аргументов)
     if (argsText.Length != 3 && argsText.Length != 6) 
         return false;
     TriangleCommand trnglCmd = null;
     // создаём конкретную команду
     switch (cmdKind)
     { 
         case CommandKind.TRIANGLE_AREA:
             trnglCmd = new TriangleAreaCommand();
             break;
         case CommandKind.TRIANGLE_PERIM:
             trnglCmd = new TrianglePerimCommand();
             break;
         case CommandKind.TRIANGLE_IS_RIGHT:
             trnglCmd = new TriangleIsRightCommand();
             break;
         case CommandKind.TRIANGLE_IS_EQUIL:
             trnglCmd = new TriangleIsRightCommand();
             break;
         default:
             Debug.Assert(false, "_TryParseTriangle must be called only for triangle commands");
             break;
     }
     // инициализируем данными треугольника
     if (argsText.Length == 3)
     {
         double[] sides;
         if (!_TryParseTriangleSides(argsText, out sides))
             return false;
         trnglCmd.Init(sides);
     }
     else
     {
         Debug.Assert(argsText.Length == 6, "This case only for 6 args-coordinates");
         Point[] vertices;
         if (!_TryParseTriangleVertices(argsText, out vertices))
             return false;
         trnglCmd.Init(vertices);
     }
     cmd = trnglCmd;
     return true;
 }
Ejemplo n.º 3
0
 public bool Parse(string cmdText, out AbstractCommand cmd)
 {
     Debug.Assert(cmdText == PrepareCommand(cmdText),
         "Parse method must be called after preparing of command");
     currCmdText = cmdText;
     if (cmdText == "quit")
     {
         cmd = new QuitCommand();
         return true;
     }
     else if (cmdText == "help")
     {
         cmd = new HelpCommand();
         return true;
     }
     // разбиваем всю команду на составляющие элементы
     string[] allParts = cmdText.Split(new char[] { DELIM }, StringSplitOptions.RemoveEmptyEntries);
     Debug.Assert(allParts.Length > 0, "Empty command must not be here");
     // по умолчанию результат -- неизвестная команда
     cmd = new UnknownCommand(cmdText);
     // название команды
     string cmdName = allParts[0];
     CommandKind cmdType;
     // команда может быть неизвестна
     if (!_TryParseCommand(cmdName, out cmdType))
         return false;
     Debug.Assert(cmdType != CommandKind.UNDEFINED,
         "CommandKind.UNDEFINED must be cought by _TryParseCommand (it should returns false)");
     // оставшиеся кусочки команды
     string[] args = allParts.Skip(1).ToArray();
     switch (cmdType)
     {
         case CommandKind.DISTANCE:
             return _TryParseDistance(args, out cmd);
         // остались только команды треугольника
         default:
             return _TryParseTriangle(cmdType, args, out cmd);
     }
 }