IDL编译器实现入门

本文介绍了如何实现一个简单的IDL编译器,该编译器能够解析特定的IDL文件,并通过flex和bison来处理词法和语法。文章详细讲解了从词法文件mooon.l、语法文件mooon.y,到service_info.h、service_info.cpp和main.cpp的实现过程,以及Makefile用于编译生成IDL编译器的脚本。
摘要由CSDN通过智能技术生成
img_e25d4fb2f8de1caf41a735ec53088516.pngIDL编译器实现入门.pdf

目录

目录 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.       前言

本文不对词法和语法、以及flexbison进行介绍,如有需要,可以阅读《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\

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值