实现小型语言

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

在简单的情况下,小型语言可以采用面向行的、易于解析的格式。还可以使用更正式的语法、实现更为复杂的语言。一旦你确定你你的小型语言的语法,你需要为它编写解析器与生成器,生成器是可选项。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
    评论
实现小型数据库可以通过以下步骤来进行: 1. 设计数据模型:确定数据库中需要存储的数据类型和数据结构,例如表格、行和列等。 2. 创建数据库:根据设计的数据模型,使用编程语言(如C)创建一个数据库文件,用于存储数据。 3. 实现数据存储功能:编写代码实现数据的插入、查询、更新和删除等操作。可以使用数据结构(如数组、链表等)来存储数据,并使用文件读写操作将数据写入数据库文件。 4. 设计索引结构:为了提高查询效率,可以为数据库添加索引结构。通过索引,可以快速定位到特定的数据行,而不需要遍历整个数据库文件。 5. 实现索引功能:编写代码实现索引的创建和维护,确保索引能够随着数据的插入和删除而更新。 6. 添加数据完整性约束:为了保证数据的完整性和一致性,可以在数据库中添加数据约束,例如主键、唯一约束、非空约束等。 7. 完善数据库功能:除了基本的增删改查操作,可以根据实际需求添加其他功能,例如事务处理、备份与恢复、权限管理等。 8. 测试与调试:编写测试用例,对数据库进行全面的测试和调试,确保数据库的稳定性和正确性。 9. 文档撰写:编写数据库的使用手册和开发文档,方便其他开发人员使用和维护数据库。 总结:通过以上步骤,我们可以使用C语言实现一个小型数据库,具备基本的存储、查询和索引等功能。这样的数据库可以满足一些简单的数据管理需求,但相对于成熟的商业数据库系统而言,功能较为有限。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值