版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Lex–一个词法分析器的(全文Lex–M.E.Lesk和E.S贝尔MurrayHill,NewJersey翻译:Lex用于编写一些程序,这些程序能够通过正则表达式识别输入流中的控制流。它能很好的适Lex源文件是一个由正则表达式和相应程序片断构成的表格。表格被转换成程序,该程序被识别后,相应的程序片断被执行。表达式的识别由Lex生成的有限状态自动机执行。输入流Lex写就的词法分析器接受二义性的说明书,在每一个输入点上选择最长的可能匹配。如果必Lex可以生成C或者Ratfor的分析器,Ratfor是一种可以被自动转换为Fortran的语言。在PDP-11UNIX、HoneywellGCOS和IBMOS系统上都可以使用Lex。然而,这个使用手册只讨论了UNIX系统上用C语言生成解析器的方法,它只适用于UNIXVersion7下的Lex形式。对于那些希望联合使用编译器的程序,Lex的设计使其很容易与Yacc一起使用。Lex–M.E.Lesk和E.S贝尔MurrayHill,NewJersey介绍 Lex动作 使用Lex和 实例 字符集 感谢 Lex是一个程序,它被设计用来对输入字符流进行词法处理。它接受一种高级的、面向过用户输入的代码说明书给入。Lex识别这些表达式,并且将输入流分成一些匹配这些表达式的字符串。在这些字符串的分界处,用户提供的程序片段被执行。Lex代码文件将正则表达式和程序片断关联。对每一条输入到由Lex生成程序的表达式,相应的代码片段被执行。是不合适的。Lex不是完整的语言,但是是一个新语言的,它可以插入到各种不同的被代码,Lex可以生成不同的宿主语言。宿主语言用于Lex生成输出代码,也用于用户插入程序片断。这使得Lex适用于不同的环境和不同的使用者。每一个应用程序可以是硬件、适用于该任务的宿主语言、用户背景和局部接口属性的直接结合。现在,Lex唯一支持的宿主语言是CFortran(Ratfor[2])在过去也被支持。Lex自身存在于UNIX、GCOS和OS/370上;但是Lex生成的代码可以在任何适当的编译器上使用。Lex将用户输入的表达式和动作actions(在这篇文章中被称作源代码)转换为宿主语言;生成1。图[式,用来匹配一个或多个、仅出现在行尾字符串中的空格或者制表符(C语言传统,显式QED中一样表示“行尾”。没有提供具体的动作,所以Lex生成的程序(yylex)会忽略这些字 [[\t]+printf("Lex可以被独自用于简单的转换,或者在词法层面上用于分析和统计。Lex也可以在语法分析器的中用于词法分析阶段;将Lex和Yacc[3]结合使用是极其方便的。Lex仅识别正则表达式;Yacc编写的语法分析器可以接受一大类上下文无关文法,但是需要一个底层的分析器识别输入记号。因此结合使用Lex和Yacc是合适的。当用于语法分析器的预处理程序时,Lex用于分割输入流,而语法分析器将结果赋予结构。这种情况下的流程图如2所示(比如一个编译器的前半部分)。程序的其他部分,由其他生成或者手写,可以被方便的插入由Lex产生的程序中。图Yaccyylex是Yacc用于接收语法分析器结果的名字,所以使用Lex中的名字可Lex由源文件中的正则表达式产生确定的有穷状态自动机[4]。为了节省空间,这个自动机是被解释,而不是被编译得到的。结果仍是高速分析器。特别的,Lex程序识别和分割输入流的时间与输入的长度成正比。Lex中规则的数量和复杂度对于执行速度来说是无关的,除非规则中因此也就是Lex生成程序的大小。在由Lex生成的程序中,用户的片断(每一条正则表达式匹配后的动作)像switch中的case一般的Lex{user而definitions和usersubroutines经常被忽略。第二个%%是可选择的,但是第一个必须存在rules的开始。因此最简单的Lex程序是(没有definitions和rules),这个程序输入将不加修改地到输出integerprintf("foundkeywordinteger,找到后输出“foundkeywordINT”。在这个例子中,主程序为C语言并且用Cprintf打印字符串。用第一个出现的空白符或者制表符作为表达式的结束标记。如果action仅仅是一条简单的C表达式,那么它可以直接写在这一行的 这些规则是不够强大的,比如pertroleum应该变为gaseum;一种处理它的方法将在下文中予正则表达式的定义与QED[5]很相似。一个正则表达式用于识别一组匹配的字符串。它包括文本"\[]ˆ−?.*+|()$/{}%<用者可以避免上面的操作符,并且这样做对于以后扩展Lex长度是安全的。。一些标准的带有\的C转义字符也会被识别:\n是换行符,\t是制表符,\b是回退符。想引入\,使用\\。因为换行符在表达式中是不合法的,所以\n必须被使用;而制表符和回退符告。(例如,[0-z]ASCII中表示的字符要多于在EBCDIC中)。如果想在字符类中使用-作为.a0个a;而表示1个或者的a实例。例如(ab|ab|(ab|上下文有关。Lex可以识别少量的soigo^$。如^(^相矛$等价。左线性文法在Lex中由开始状态10节中阐述。如果一条规则只在Lex自动解释器处于开始状态x时被执行,则该规则应该有使用尖括号的前缀最后,初始的%是特别的,它用于分隔Lex当一条上述表达式匹配以后,Lex将执行相应的动作。本节介绍Lex中编写动作的一些特点。注意,Lex中存在一个从输入到输出直接拷贝的默认动作。在遇到所有不匹配的字符串时,这个默认动作自动执行。另外,如果Lex用户希望截获所有输入而没有输出,那么必须提供能够匹配所有字符的规则。当在Yacc中使用Lex时,这是一种常见情形。我们可以认为action是忽略输入是最简单的事情之一,这仅仅需要使用一条C空语句;["yytext的字符数组中。因此,打印匹配的名字,可以使用规则印字符串”(%表示数据转换,s表示字符串类型)yytext中的字符。所以这条语句ECHO书写:有时,获得匹配字符串的结束位置是方便的;因此Lexyyleng来计算已经[a−zA−Z]+{words++;chars+=获得。有时,一个Lex动作可能需要处理当规则没有能够正确识别时的字符宽度。两个例程用nyytext中保留的剩余字符数。先前已经匹配if(yytext[yyleng−1]==¢\\¢)...normaluser}得右面的字符串”def被追加到后面。注意,标志字符串结束的引号应该在代码“normal=-printf("Operator(=-)...actionfor=-}它会打印一条信息,返回操作符后的字符到输入流中。另外,它也可以将其处理为a”。如=-printf("Operator(=-)...actionfor=-}=-=-/[ˆ另外,Lex允许直接使用I/O一;input0以表示文件结束;unputinput之间的关系必须保留,否则Lex不能完成向前搜索的操作。Lex在不需要的时候不会向前搜索,但是每一个以+*?$结尾的、或者含参阅下文中有关Lex使用的字符集的讨论。默认的Lex100个字符作为备用限制。另一个用户可以重定义的Lexyywrap()Lex遇到文件结束符时被调用。如果yywrap0。这样Lex才可以继续运行。yywrap1。这个例程对于在程序末尾打印表格、yywrapinput(),一个只包含空的文件是不能够被处理Lex可以处理二义性的说明书。当超过一个表达式可以同时匹配当前输入时,Lex做出如下选integerkeywordaction[a−z]+identifieractionintegersidentifier因为[a-z]+8个字符而integer7integer7个字符,那么将使用关键字规identifier进行解释。’first’quotedstringhere,‘second’’first’quotedstringhere,‘second’’is*请注意,Lex通常用于将输入流分隔开,而不是查找所有满足表达式的匹配。这意味着每一个Lex规则可能是he\n 有时候,用户希望这种选择。动作REJECT表示“进行下一次选择。”它使得当当前规则被shehe个数:she{s++;REJECT;}he{h++;\n he中的REJECT动作;另外,知道哪些输入字符同时在两个类中是不必要a[bc]+{...;a[cd]+{...;43accd2通常,当Lex的目的不是分隔输入流而是查找输入中的所有项目的实例时,REJECT是有用thethhe。假设一个叫做diagram的二维数组不断递增,适当的源文 记住Lex{userrulesLex定义变量。变量可以在定义部分或者规则部分实现。请记住Lex是将规则转换为一个程序。任何不能被Lex解释的代任何如下的一行被直接拷贝到Lex生成的程序中:不符合Lex展为生成代码中的任意函数;如果紧跟在第一个%%Lex写成的、包含动作的函数中的适当位置。此时它更像程序代码片断,并且应该在第一条Lex序。这种方法可以被用作在Lex代码或者生成代码中添加注释。注释必须符合宿主语言的规1的预处理程序,或者拷贝不像程序的任何在第三个%%Lex输出,无论它具有什么样的格Lex中的定义在第一个%%限制符以前。这一部分的任何一行,如果它不在%{和%}之间,并1,那么会被认为是Lex中替换字符的定义。这样的行的形式如下name它使得作为解释的字符串被关联到name。nametranslation必须至少用一个空白符或者制表符分开。name必须以字母开头。translation由规则(rule)中的语法{name}调用。例如, Fortran35.EQ.I,应该加入一条上下文相关文法型代码程序调节Lex12节的“代码格式总结”中讨论。编译一个Lex源文件程序需要两步。首先,Lex源程序必须转换为宿主目标语言的程序。然后,这个程序被编译和加载,通常这一部结合Lexlex.yy.c中。I/O库的定义在C标准库中[6]。Lex生成程序与OS/370标准稍有不同,因为OS编译器比起UNIXGCOS的编译器稍逊一GCOS和UNIX上生成的C程序是一样的。lexsourcecclex.yy.ca.out文件,用于以后的运行。在Yacc中使用Lex的方法见下。尽管Lex默认的I/O例程使用C标准库,但是Lexinput,outputunput被给定,库会被省略。如果您想在Yacc中使用Lex,请注意Lexyylex()Yacc分析中需要被使用到。通常,Lex库中默认的主程序会调用这个例程,但是如果是使用Yacc加载,并且是它的主程序使用,那么Yaccyylex()Lex规则应returntoken被返回。一种简单的获得Yacctoken名字的方法是将Lex的输出文件作为Yacc输出文件的一部分,这通过在Yacc输入的最后一个部分加入行#include来实现。假设某文法叫做good,而词则是better,那么Unix中的指令序列如下yaccgoodlexccy.tab.c−ly为了获得调用Yacc解析器的主程序,Yacc库(-ly)Lex库使用前被加载。Lex和Yacc的73。这里给出一个适当的Lex源程序int{k=atoi(yytext);if(k%7==0)[0−9]+printf("%d",k+3);}3。为了避免这个,只需要增加一些规则,比如:int{
k=printf("%d",k%7==0?k+3:} 含有“.”和由字母前导的数字字符串被后面两条规则截获,并且不会改变。if-else被一条C语言a?b:c的表达式表示“如果a那么bc”。int[a−z]+ {intprintf("LengthNo.words\n");for(i=0;i<100;i++)if(lengs[i]>0)}行最后处理。如果yywrap返回0(错误),它表示还有输入,程序会继续、处理。提供yywrap会造成无限循环。NL.Schryer撰写,用于将双精度的Fortran转换为abczW[^""[^正则表达式中,引号括住了空白符。其被解释为“50 /*convertconstants*/for(p=yytext;*p!=0;p++){if(*p==¢d¢||*p==*p=+¢e¢−}} {d}{a}{t}{a}{n}… {d}{l}{o}{g}10{d}{m}{i}{n}1{{d}{m}{a}{x}1yytext[0]=+‘a’–}{d}1{m}{a}{c}{h}{yytext[0]=+‘r’– 下面的部分将介绍3种处理不同环境的方法:在环境改变时数规则改变,此时简单的使Lex并不参与其中。而令Lex记住该标志以作为规则的起始状态,可能是更方便的。任何一条规则都可以与一个开始状态联系。只有当Lex处于开始状态时,该条规则才可以被识别。当前amagicfirstbint {flag=‘a’; {flag=‘b’; {flag=‘c’; {flag=0;{switch{case‘a’:printf("first");magiccase‘b’:printf("second");break;case‘c’:printf("third");break;default:ECHO;break;}}%Startname1name2这是一条只有当Lexname1时才执行的规则。为了进入起始状态,执行动作语BEGINBEGIN重新初始化Lex%STARTAABB {ECHO;BEGIN {ECHO;BEGIN {ECHO;BEGIN 这里的逻辑与前一种处理问题的方法一样,但是LexLexinput,outputunput来处理I/O中的字符。因此这些例程中支持的字符能够被Lexyytext返回。在内部,一个字符由一个短整数表示,如果样。如果通过提供I/O例程翻译字符使得翻译模式改变,那么Lex必须被由给定的转换表通告。这必须在定义部分中,并且必须被只包含“%T”的行包括。表格包含形如{integer}{character28293031390,并且不能用大于硬件字符集的整数定义字符。一般的Lex{user1.定义,形式为“namespacetranslation”2.被包含的代码,形式为“spacecode”%Sname1name2...numberspacecharacter-%xnnn是一个十进制整数,表示数组的长度。而x是下列参数之一: 位置positions 状态states 树节点treenodes 转移transitions 打包的字符类packedcharacterclasses 输出数组的长度outputarraysize 字符 符号"x",即使x 符号"x",即使x 字符x或者[x−z]字符x、y或者 除了x 在一行开始处的<
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2023年薄板木船项目筹资方案
- 植物学题库及答案
- 《重症肺炎诊治》课件
- 养老院老人心理咨询师培训制度
- 养老院老人康复理疗师管理制度
- 定制目录Catalog教学课件
- 2024年版重庆地区离婚合同范本一
- 《青春期健康男性》课件
- 房屋装修费转让合同(2篇)
- 2024年汽车抵押贷款合同样本与合同审查要点3篇
- 地铁运营公司工务线路质量评定标准
- 感染性休克急诊处理课件
- 历史七年级上学期期末试卷含答案
- 【基于抖音短视频的营销策略分析文献综述2800字(论文)】
- 2021-2022学年度西城区五年级上册英语期末考试试题
- 《组织行为学》(本)形考任务1-4
- 广东省广州市白云区2022-2023学年九年级上学期期末语文试题
- 剧本-进入黑夜的漫长旅程
- DB43-T 958.3-2023 实验用小型猪 第3部分:配合饲料
- 化肥购销合同范本正规范本(通用版)
- 健康管理专业职业生涯规划书
评论
0/150
提交评论