目录
目录 1
1. 前言 1
2. 目标(example.idl) 1
3. 功能 2
4. 文件构成 2
5. flex词法文件(mooon.l) 3
6. bison语法文件(mooon.y) 5
7. service_info.h 8
8. service_info.cpp 11
9. main.cpp 13
10. Makefile 13
11. 运行示例 14
附:完整源代码包 15
1. 前言
本文不对词法和语法、以及flex和bison进行介绍,如有需要,可以阅读《RPC的实现》。本文试图用直接的方式,以最短的篇幅介绍一个最简单的IDL编译器实现。
2. 目标(example.idl)
本文介绍的IDL编译器,能够解析如下所示的IDL文件,但限于篇幅,生成C++代码部分省略掉,只介绍到对下述内容的解析,以便控制篇幅和复杂度。
下面这个表格为示例IDL文件example.idl的内容:
// Author: yijian // Date: 2015/01/20 // 运行示例:./idl_compiler example.idl request { optional aaa: int16(0, 2015); required bbb: string(0, 32); }
response { required xxx: int32; required zzz: string; } |
运行效果如下:
request ==> int16 aaa (0, 2015) string bbb (0, 32) response ==> int32 xxx (, ) string zzz (, ) |
3. 功能
request |
表示为请求 |
response |
表示为响应 |
optional |
表示字段是可选的 |
required |
表示字段必须存在 |
int16 |
支持的数据类型,还包括string、int32和int64等 |
(0, 2015) |
这个也是可选的,表示取值范围,对于整数则表示最小值和最大值,对于字符串则表示最小长度和最大长度 |
aaa |
为字段名称,其它如bbb、xxx和zzz等也是字段名称 |
4. 文件构成
文件名 |
文件说明 |
example.idl |
演示用IDL文件 |
mooon.l |
词法文件 |
mooon.y |
语法文件 |
service_info.h |
定义存储元数据的结构 |
service_info.cpp |
对service_info.h的实现 |
main.cpp |
main()函数所在文件,调用解析器,并生成目标代码(本文为简单,并没有生成目标代码,而只是在屏幕上输出) |
Makefile |
编译脚本,成功后生成编译工具idl_compiler |
5. flex词法文件(mooon.l)
定义example.idl的词法文件:
// Author: yijian // Date: 2015/01/20 %option yylineno // flex mooon.l
%{
#include "mooon.tab.h" // bison编译mooon.y时生成的文件 #include "service_info.h"
// 定义保留关键词 void reserved_keyword(const char* keyword) { yyerror("Cannot use reserved language keyword: \"%s\ |