欢迎来到天天文库
浏览记录
ID:41848884
大小:315.78 KB
页数:74页
时间:2019-09-03
《lex一个词法分析器的生成器_翻译版[实践]》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Lex-词法分析器生成器(M.E.Lesk,E.Schmidt著,中文翻译)Lex-词法分析器生成器M.E.Lesk与E.SchmidtBellLaboratoriesMurrayHill,NewJersey07974翻译:寒蝉退士译者声明:译者对译文不做任何担保,译者对译文不拥有任何权利并且不负担任何责任和义务。原文:http://cm.bell-labs.com/7thEdMan/vol2/lex摘要Lex帮助书写其控制流由在输入流中的正则表达式的实例来导向的程序。它适合于编辑器脚本类型的变换,和为解析例程做准备工作而分解输入。Lex源码是正则表达式和相应的程序片段的表格。
2、Lex把这个表格变换成读取输入流.复制它到输出流.并把输入划分到匹配给定表达式的字符串中的一个程序。随着每个这种字符串被识别出来,相应的程序片段就被执行。表达式通过用Lex生成的确定有限自动机来识别。用户书写的程序片段按照对应的正则表达式在输入流中出现的次序来执行。用Lex写成的词法分析程序接受有歧义的规定,并在每个输入点上选择最长的匹配可能。如果需要,在输入上进行实质的超前查看(lookahead),但输入流会被回退(backup)到当前划分的结束处,所以用户有操纵它的普遍自由。Lex可以生成用C语言或Ratfor语言写的分析器,Ratfor可以自动的转换成可移植的Fortr
3、an0它可以在PDP-11UNIX、HoneywellGC0S和IBMOS系统上得到。本手册只讨论在UNIX系统上的生成C语言的分析器,这是在UNIX第7版中唯一支持的Lex形式。设计Lex时简化了与编译器的编译系统Yacc的交接。July21,1975真的不掉线吗??.????????????目录真的不掉线吗??.????????????真的不掉线吗??、????????????■2.Lex源码.3.Lex正则表达式■4.Lex动作.5.歧义源规则■6.Lex源定义■9.例子•10.左上下文敏感.11.字符集.12.源格式总结.13.告诫和缺陷•14.致谢1.介绍Lex是设计
4、用于字符输入流的词法处理的一个程序生成器。它接受高级的.面向问题的对字符串匹配的规定,并生成识别正则表达式的通用语言写的一个程序。正则表达式在用户给Lex的源规定中指定。Lex写出的代码识别在输入流中的这些表达式,并把输入流划分到匹配这些表达式的字符串中。在字符串间的分界上执行用户提供的程序片段。Lex源文件对正则表达式关联上程序片段。随着每个表达式出现在给Lex写出的程序的输入中,相应的程序片段就被执行。用户提供超出表达式所需要的额外代码来完成他的任务,可能包括用其他生成器写出的代码。生成的识别表达式的程序采用用户的程序片段所采用的通用编程语言。因此,提供了高级表达式语言来写
5、要被匹配的字符串表达式,而用户写动作的自由不受侵犯。这避免了强制希望使用字符串操纵语言做输入分析的用户、去使用同样的并且经常不适合字符串处理的语言来书写处理程序。Lex不是完整的语言,而是体现了可增加到叫做“宿主语言”的不同编程语言中的新语言特征的一个生成器。正如同通用语言可以生成在不同计算机硬件上运行的代码,Lex可以写出不同宿主语言的代码。宿主语言被用于Lex生成的输出代码和用户增加的程序片段。还为不同的宿主语言提供兼容的运行时间库。这使真的不掉线吗??、????????????Lex适应不同的环境和不同的用户。每个应用都可以被定向到适合这个任务的硬件和宿主语言、用户背景和
6、本地实现性质的各种组合上。目前唯一支持的宿主语言是C,尽管过去曾经支持过Fortran(Ratfor⑵形式)。Lex自身存在于UNIX.GC0S和OS/370;但Lex生成的代码可以采用于存在适当的编译器的任何地方。Lex把用户的表达式和动作(在本文中叫做源码)转换成宿主通用语言;生成的程序叫做yylex。yylex程序将识别在流(在本文中叫做输入)中的表达式,并在检测到的时候执行给每个表达式的动作。参见图1。++源码-〉
7、Lex
8、->yylex++输入->IyylexI一〉输出Lex概述图1作为一个平凡的例子,考虑从输入中删除所有行结束处的空白或tab的程序。%%就是所需要的
9、。这个程序包含标记规则开始的一个%%分界符和一个规则。这个规则包含匹配在行结束处之前的空白或tab(按照C语言约定写为t)字符的一个或多个实例的一个正则表达式。方括号指示由空白和tab构成的字符类;同于QED,+指示“一或多个”;而$指示“行结束”。没有指定动作,所以Lex生成的程序(yylex)将忽略这些字符。所有其他东西都被复制。要扌巴任何余下的空白或tab的字符串改变为一个单一的空白,可增加另一个规则:%%[t]+$;[t]+printf(Hn);为这个源码生成的有限自动机将立刻
此文档下载收益归作者所有