加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

分析Perl的Lex和Yacc部分

发布时间:2020-12-15 23:58:49 所属栏目:大数据 来源:网络整理
导读:所有话言的核心都是相同的.都是基于巴氏范式的两个变种. LEXYACC是一种实现,一般用BNF.这块我还没搞太清,以前还有点印象真有些忘了. 还有向种,ANTLR,DFA.不管了. 就是说,所有的语言,到今天为止,本质都是其于相同的理论,就是乔姆斯基和他的文法。 今天,我想看

所有话言的核心都是相同的.都是基于巴氏范式的两个变种.

LEX&YACC是一种实现,一般用BNF.这块我还没搞太清,以前还有点印象真有些忘了.

还有向种,ANTLR,DFA.不管了.


就是说,所有的语言,到今天为止,本质都是其于相同的理论,就是乔姆斯基和他的文法。


今天,我想看看PERL 语言的内核是什么样子吧。


先进入perl原码目录,找:

*.l;*.y;*.lex;*.yacc;*.sym;*.g


win7的查找,到现在我还没学会.我是在XP下工作.


找到perly.y.


有点怪:lex哪去了?就是超人里的那个坏仁LEX?哪去了,虽说理论上,可以没有lex分析,但那样yacc日子会很难过.


所以,十有八有一定有lex.


忘了说,lex和yacc的关系,

这么说吧,lex只读一个个的asc码,而YACC只认TOKEN,

所以,组成token的任务,由lex完成。但TOKEY的定义,则是由YACC来完成。


我说得够精简吗?不象很多文章,写了一大摊。


举个示例吧,比如说,你在YACC(对了,yacc的意思是yer another language language),定义了一门语言,它识别两个单词(术语:token)

那么你定义好两个token: HELLO WORLD

要注意,在yacc中,这叫token,你简单想象成,HELLO=0 WORLD =1,就对了。


但这个0和1谁给他它呢,这就得lex上场了。一般来说,lex和正则表达式,是密不可分的。lex要想完成yacc交给他的任务,没有正则表达式就瞎米了。


比如说吧,现在的流是" hello world"

lex一个字母一个字母地亲苦地找,状态机在o这个位,lex根据自己定义的正则表达式发现:找到了一个TOKEN,=HELLO,然后lex 就把这个0发给YACC.

总之吧,脏活累过,都在不上道的lex这。要不怎么叫lex呢。


现在问题来了,只有高雅的YACC是完成任务的。

而见鬼的lex,没起个好找的名字,NND。


很好办,通过我上面的分析,你肯定知道,TOKEN在YACC中定义,LEX生成。那么打个TOKEN必能找到。

不错。


就选 这个TOKEN: DOLSHARP

找到一个token.c

哈,OK了。


看看这家伙怎么描述自己的吧:


/*    toke.c
 *
 *    Copyright (C) 1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,*    2001,2002,2003,2004,2005,2006,2007,2008 by Larry Wall and others
 *
 *    You may distribute under the terms of either the GNU General Public
 *    License or the Artistic License,as specified in the README file.
 *
 */

/*
 *  'It all comes from here,the stench and the peril.'    --Frodo
 *
 *     [p.719 of _The Lord of the Rings_,IV/ix: "Shelob's Lair"]
 */

/*
 * This file is the lexer for Perl.  It's closely linked to the
 * parser,perly.y.
 *
 * The main routine is yylex(),which returns the next token.
 */

/*
=head1 Lexer interface

This is the lower layer of the Perl parser,managing characters and tokens.

=for apidoc AmU|yy_parser *|PL_parser

Pointer to a structure encapsulating the state of the parsing operation
currently in progress.  The pointer can be locally changed to perform
a nested parse without interfering with the state of an outer parse.
Individual members of C<PL_parser> have their own documentation.

=cut
*/

#include "EXTERN.h"
#define PERL_IN_TOKE_C
#include "perl.h"
#include "dquote_static.c"

#define new_constant(a,b,c,d,e,f,g)	
	S_new_constant(aTHX_ a,STR_WITH_LEN(c),g)

#define pl_yylval	(PL_parser->yylval)



他自己说,他和YACC很紧密,这不是废话吗。

但是,还没找到是谁生成的这个文件。

那么,是手写的?


我了个去,不由倒吸一口凉气。老外有这么牛吗?


下班了,下次有空再分析了。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读