我该如何操纵这张桌子?

时间:2014-03-21 12:44:08

标签: c arrays struct

我一直在努力寻找优化代码的方法,但是有一个问题,我能想到的唯一方法就是使用老师给出的表格。我试过操纵但是我无法按照它应该的方式工作。

关于这个项目,我的小组和我必须制作一个编译器,将.s文件转换为将用于核心战的.cor文件。我负责检测命令并处理错误的语法。我的程序检测到您可以执行的所有不同命令。这就是我现在所得到的。

int     reading_file(char *pepper)
{
  char  *bffr;
  int   k;

  k = 0;
  while ((bffr = get_next_line(0)))
    {
      while (bffr[k] == '\t')
        k++;
      my_putstr(bffr);
      my_putchar('\n');
      if ((strncmp((bffr + k), "ld", my_strlen("ld"))) == 0)
        my_putstr("it works! \n");
      else if (strncmp((bffr + k), "zjmp", my_strlen("zjmp")) == 0)
        my_putstr("it works!\n");
      else if (strncmp((bffr + k), "sti", my_strlen("sti")) == 0)
        my_putstr("it works! \n");
      else if (strncmp((bffr + k), "live", my_strlen("live")) == 0)
        my_putstr("it works! \n");
      else if (strncmp((bffr + k), "st", my_strlen("st")) == 0)
        my_putstr("it works!");
          /* all of the other commands go after this */
      k = 0;
    }
}

现在,这没有任何问题,但它看起来并不像我之前所说的那样非常优化,我尝试使用由我们的老师提供的表格,它具有所需的所有信息每个命令。我理解表格的每个部分意味着什么,但我完全不知道如何操纵它。

这是表格和与之相关的结构:

结构:

struct  op_s
{
   char         *mnemonique;
   char         nbr_args;
   args_type_t  type[MAX_ARGS_NUMBER];
   char         code;
   int          nbr_cycles;
   char         *comment;
};

typedef struct op_s     op_t;

表格

#include "op.h"

op_t    op_tab[] =
  {
    {"live", 1, {T_DIR}, 1, 10, "alive"},
    {"ld", 2, {T_DIR | T_IND, T_REG}, 2, 5, "load"},
    {"st", 2, {T_REG, T_IND | T_REG}, 3, 5, "store"},
    {"add", 3, {T_REG, T_REG, T_REG}, 4, 10, "addition"},
    {"sub", 3, {T_REG, T_REG, T_REG}, 5, 10, "soustraction"},
    {"and", 3, {T_REG | T_DIR | T_IND, T_REG | T_IND | T_DIR, T_REG}, 6, 6,
     "et (and  r1, r2, r3   r1&r2 -> r3"},
    {"or", 3, {T_REG | T_IND | T_DIR, T_REG | T_IND | T_DIR, T_REG}, 7, 6,
     "ou  (or   r1, r2, r3   r1 | r2 -> r3"},
    {"xor", 3, {T_REG | T_IND | T_DIR, T_REG | T_IND | T_DIR, T_REG}, 8, 6,
     "ou (xor  r1, r2, r3   r1^r2 -> r3"},
    {"zjmp", 1, {T_DIR}, 9, 20, "jump if zero"},
    {"ldi", 3, {T_REG | T_DIR | T_IND, T_DIR | T_REG, T_REG}, 10, 25,
     "load index"},
    {"sti", 3, {T_REG, T_REG | T_DIR | T_IND, T_DIR | T_REG}, 11, 25,
     "store index"},
    {"fork", 1, {T_DIR}, 12, 800, "fork"},
    {"lld", 2, {T_DIR | T_IND, T_REG}, 13, 10, "long load"},
    {"lldi", 3, {T_REG | T_DIR | T_IND, T_DIR | T_REG, T_REG}, 14, 50,
     "long load index"},
    {"lfork", 1, {T_DIR}, 15, 1000, "long fork"},
    {"aff", 1, {T_REG}, 16, 2, "aff"},
    {0, 0, {0}, 0, 0, 0}
  };

现在,我尝试过一段时间做的事情,但它没有像预期的那样工作:

int     reading_file(char *pepper)
{
  char  *bffr;
  int   k;
  op_t  woop;

  k = 0;
  while ((bffr = get_next_line(0)))
    {
      while (bffr[k] == '\t')
        k++;
      my_putstr(bffr);
      my_putchar('\n');
      if ((strncmp((bffr + k), woop.mnemonique, my_strlen(woop.mnemonique))) == 0)
         my_putstr("it works!\n"); 

      k = 0;
    }
}

此代码将显示"它有效!"到处都是。这不是我正在寻找的东西。

简而言之,有没有办法做到这一点,而不是做一个if和else if的墙?是否可以通过操纵我给出的表来实现它?

1 个答案:

答案 0 :(得分:0)

恕我直言,有些人认为C不会将字符串视为"真正的"类型,这就是您使用else if以瀑布strcmp结束的原因。

我不确定它是否经过优化但是我想到了一个技巧:你可以(小心地)将你的字符串转换为整数(仔细检查重复项和副作用,如特殊字符\n,{ {1}},\t,...):通过这样做,您将能够通过漂亮的开关案例替换倍数\0。见post