实现小型语言

为了使我们的应用程序变得更加方便维护和易修改及灵活性。不用在修改一个配置就要对整个系统或部分组件进行重新编译,我们可以为我们的系统设计或使用一种小型语言。可以简单到终端用户也可以自己改变程序的业务逻辑等,使应用更加靠近他们的领域工作。

在简单的情况下,小型语言可以采用面向行的、易于解析的格式。还可以使用更正式的语法、实现更为复杂的语言。一旦你确定你你的小型语言的语法,你需要为它编写解析器与生成器,生成器是可选项。C/C++程序员可以使用yacc, Java程序员可以选用javaCC。如果你的小型语言足够简单,你可以自己编写自己的解析生成器。

小型语言可分类为数据语言、命令语言、独立语言、嵌入式语言。

书的中练习5 (P48):










我们想实现一种小型语言,用于控制一种简单的绘图包。这种语言由单字母命令组成。有些命令后跟单个数字。例如,下面的输入将会绘制出一个矩形:
P2 # select pen2
D # pen down
W2 # draw west 2cm
N1 # then north 1
E2 # then east 2
S1 # then back south
U #pen up
请实现解析这种语言的代码。它应该被设计成能简单地增加命令。

解答5:










































因为我们想要使该语言可扩展,我们将以表驱动的方式实现解析器。表中的每一项都含有命令字母、表明是否需要参数的标志、以及处理该命令的全程的名称。
typedef struct {
 char cmd;            /* the command letter */
 int hasArg;          /* does it take an argument */
 void (*func)(int,int); /* routine to call */
} Command;
static Command cmds[] = {
 {‘P', ARG,    doSelectPen    },
 {‘U', NO_ARG, doPenUp        },
 {‘D', NO_ARG, doPenDown      },
 {‘N', ARG,    doPenDir       },
 {‘E', ARG,    doPenDir       },
 {‘S', ARG,    doPenDir       },
 {‘W', ARG,    doPenDir       },
};

主程序相当简单:读取一行输入,查找命令,如果需要就获取参数,然后调用处理器。
while(fgets(buff, sizeof(buff),stdin)) {
 Command *cmd = findCommand(*buff);
 if(cmd) {
  int arg = 0;
  if (cmd->hasArg && !getArg(buff+1, &arg)) {
   fprintf(stderr, "'%c' needs an argument\n", *buff);
   cotinue;
  }
  cmd->func(*buff.arg);
 }
}

查找命令的函数对表进行纯属搜索,返回匹配项或NULL.
Command *findCommand(int cmd) [
 int i;
 for (i = 0; i<ARRAY_SIZE(cmds); i++) {
   if(cmds[i].cmd == cmd)
    return cmds + i;
   }
   fprintf(stderr, "Unknowsn command '%c'\n", cmd);
   return 0;
}

最后,使用 sscanf 读取参数值参数相当简单。
int getArg(const char *buff, int *result) {
 return sscanf(buff, "%d", result) == 1;
}

《程序员修炼之道--从小工到专家》之“实现小型语言”一节读后感

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值