千家信息网

如何进行thriftpy+ply的源码分析

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,如何进行thriftpy+ply的源码分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。thrift 使用ply做编译和
千家信息网最后更新 2026年11月02日如何进行thriftpy+ply的源码分析

如何进行thriftpy+ply的源码分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

thrift 使用ply做编译和解析器,ply是编译原理入门比较方便的源码,代码量少,且python文本就是代码,解析方便

ex把每个扫面出来的单词叫统统叫做token,token可以有很多类。对比自然语言的话,英语中的每个单词都是token,token有很多类,比如non(名词)就是一个类token,apple就是属于这个类型的一个具体token。对于某个编程语言来说,token的个数是很有限的,不像英语这种自然语言中有几十万个单词。

lex工具会帮我们生成一个yylex函数,yacc通过调用这个函数来得知拿到的token是什么类型的,但是token的类型是在yacc中定义的。

lex的输入文件一般会被命名成 .l文件,通过lex XX.l 我们得到输出的文件是lex.yy.c

yacc是什么呢?

刚才说完lex了,那么yacc呢,教科书上把yacc做的工作叫做syntactic analysis。这次我们翻译没有直译做句法分析,而是叫语法分析,这个翻译能好一点,意思也基本上比较清楚。
其实我们最开始学习英语的时候老师都会告诉我们英语其实就是"单词+语法",这个观点放到编程语言中很合适,lex提取了单词,那么是剩下的部分就是如何表达语法。那么yacc做的事情就是这一部分(实际应该说是BNF来做的)。

yacc会帮我们生成一个yyparse函数,这个函数会不断调用上面的yylex函数来得到token的类型。

yacc的输入文件一般会被命名成 .y文件,通过yacc -d XX.y我们得到的输出文件是y.tab.h y.tab.c,前者包含了lex需要的token类型定义,需要被include进 .l文件中

lex和yacc的输入文件格式

Definition section
%%
Rules section

%%
C code section

.l和.y的文件格式都是分成三段,用%%来分割,三个section的含义是:

  • Definition Section

这块可以放C语言的各种各种include,define等声明语句,但是要用%{ %}括起来。

如果是.l文件,可以放预定义的正则表达式:minus "-" 还要放token的定义,方法是:代号 正则表达式。然后到了,Rules Section就可以通过{符号} 来引用正则表达式

如果是.y文件,可以放token的定义,如:%token INTEGER PLUS ,这里的定一个的每个token都可以在y.tab.h中看到

  • Rules section

.l文件在这里放置的rules就是每个正则表达式要对应的动作,一般是返回一个token

.y文件在这里放置的rules就是满足一个语法描述时要执行的动作

不论是.l文件还是.y文件这里的动作都是用{}扩起来的,用C语言来描述,这些代码可以做你任何想要做的事情

  • C code Section

main函数,yyerror函数等的定义

lex和yacc能帮我们做什么?

一句话:解释执行自定义语言。有几点要注意:

  1. 自定义语言的要做的事情必须可以能通过C语言来实现。其实任何计算机能做的事情都可以用C语言来实现,lex和yacc存在的意义在于简化语言,让使用者能够以一种用比较简单的语言来实现复杂的操作。比如:对于数据库的查询肯定有现成的库可以来完成,但是使用起来比较麻烦,要自己写成语调用API,编译才行。如果我们想实自定义一个简单的语言(比如SQL)来实现操作,这个时候就可以用lex和yacc。

  2. lex和yacc 做的事情只是:用C语言来实现另外一种语言。所以,他没办法实现C语言自己,但是可以实现java、python等。当然你可以通过Antlr来实现C语言的解析和执行,如果你这么做的话,C语言程序首先是通过java来执行,然后java又变成了本地语言(C语言)来执行,谁叫我们的操作系统都是C语言实现的呢。

使用lex和yacc我们要做那几件事情?

  1. 定义各种token类型。他们在.y中定义,这些token既会被lex使用到,也会被.y文件中的BNF使用到。

  2. 写词汇分析代码。这部分代码在.l文件(就是lex的输入文件)中。这块的定义方式是:正则表达式-->对应操作。如果和yacc一起来使用的话,对应的操作通常是返回一个token类型,这个token的类型要在yacc中提前定义好。

  3. 写BNF。这些东西定义了语言的规约方式。

关于BNF

是一种context-free grammars,请参考:http://en.wikipedia.org/wiki/Backus%E2%80%93Naur_Form 摘录:

::= __expression__

  1. is a nonterminal

  2. __expression__ consists of one or more sequences of symbols

  3. more sequences are separated by the vertical bar, '|'

  4. Symbols that never appear on a left side are terminals. On the other hand

  5. symbols that appear on a left side are non-terminals and are always enclosed between the pair <>.

在yacc中定义的方式其实是:

: __expression__ {operation}

| __expression__ {operation}

operation 是 满足语法时要执行的C语言代码,这里的C语言代码可以使用一些变量,他们是:$$ $1 $2等等。$$代表规约的结果,就是表达式__expression__的值,$1代表的是前面 __expression__ 中出现的各个word。举个例子:

expr2:
expr3 { $$ == $1; }
| expr2 PLUS expr3 { $$ = plus($1, $3); }
| expr2 MINUS expr3 { $$ = minus($1, $3); }

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

语言 文件 就是 类型 代码 函数 事情 表达式 单词 正则 语法 分析 英语 输入 动作 方式 编译 源码 清楚 代表 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网加科技 博彦科技互联网金融 互联网科技卖菜 互联网科技作文 丰台科技园 互联网 科技类的互联网平台 央行互联网金融科技公司 岳阳华臻互联网科技有限公司 开一家科技互联网公司需要多少钱 华夏恒生互联网科技013171 中天科技中国工业互联网 昆明中奇联合互联网科技 互联网时代科技型公司的机会 江苏互联网智能科技产品出厂价 陕西九四连强互联网科技有限公司 艺电能源互联网科技有限公司招聘 西安左小互联网科技有限公司 互联网科技和医药行业 科技互联网公司两年变化 互联网企业和网络科技有限公司 科技企业和互联网企业 阿大互联网科技有限公司 杭州壁岐互联网科技有限公司 广州市恰铎互联网科技有限公司 开一家科技互联网公司需要多少钱 允成互联网科技有限公司融资 中和天地互联网科技有限公司 互联网企业科技类企业如何做账 神州科技互联网有限公司 绵阳真晨互联网科技有限公司
0