lex
原作者 | Mike Lesk, Eric Schmidt |
---|---|
首次发布 | 1975年 |
源代码库 | |
操作系统 | Unix和类Unix系统 |
类型 | 命令 |
在电脑科学里面,lex是一个产生词法分析器(lexical analyzer,"扫描器"(scanners)或者"lexers")的程式。[1][2] Lex常常与yacc 语法分析器产生程式(parser generator)一起使用。Lex(最早是埃里克·施密特和迈克·莱斯克制作)是许多UNIX系统的标准词法分析器(lexical analyzer)产生程式,而且这个工具所作的行为被详列为POSIX标准的一部分。
Lex读进一个代表词法分析器规则的输入字串流,然后输出以C语言实做的词法分析器原始码。
虽然传统上是商业软体,但是有些根据原本AT&T程式码这些版本的Lex可以以公开原始码的形式获得,并被视为某些系统的一部份,例如说OpenSolaris和贝尔实验室九号计画。另一个有名的Lex公开原始码版本是flex,代表"快速的词法分析器"(fast lexical analyzer)
lex档案的结构
[编辑]lex的档案结构故意设计的与yacc的档案格式相似;档案分成三个区块,均以一个只有两个百分比符号(%)的单行来分隔,如下:
定義區塊 %% 規則區塊 %% C程式碼區塊
- 定义区块是用来定义巨集以及汇入C写成的表头档所在区块。在这里面也可以写一些C程式码,这一些程式码会被复制到产生出来的C原始码的开头部份。
- 规则区块是最重要的区块;这里将样式与C的陈述(statement)串连在一起。这一些样式都是正规表式。当lexer看到输入里面有合乎给定的样式时,则会操作相对应的C程式码。这就是lex运作的基础。
- C程式码区块包含C的陈述与函式(function)会原封不动的照搬到产生出来的C原始码里面。这些陈述一般假设包含了在规则区块里面,各个规则分别呼叫的原始码。在大型程式里面,将这一些程式放在其他分开的档案并且在编译阶段作连接会更方便(在进行修改跟扩充的时候)。
lex文件示例
[编辑]下面是一个flex版本的lex文件的示例。这个程序可以找出表示数字(整数)的字符串,并将它们打印出来。
/*** 定義區塊***/
%{
/* 會直接照搬放檔頭的C code */
#include <stdio.h>
%}
/* 這裡告訴flex只要讀取輸入的檔案(不需要其他檔案)*/
%option noyywrap
%%
/*** 規則區塊***/
/* [0-9]+代表包含一個或多個數字的字串*/
[0-9]+ {
/* yytext是一個字串變數,內容是符合規則的字串本身。*/
printf("Saw an integer: %s\n", yytext);
}
. { /* 忽略所有其他的字*/ }
%%
/*** C程式碼區塊***/
int main(void)
{
/* 呼叫lexer,然後結束程式*/
yylex();
return 0;
}
将这个档案输入给flex,它会将这个档案转换成一个C档案,档名lex.yy.c。这个C档案可以被编译成一份可执行档,功能为找出并且输出代表整数的字串。例如,给定输入:
abc123z.!&*2ghj6
这只程式会印出:
Saw an integer: 123 Saw an integer: 2 Saw an integer: 6
Lex和其他工具并用
[编辑]Lex和语法分析产生程式(parser generator)并用
[编辑]Lex和语法分析器产生程式,例如说Yacc或者Bison之类,常常一起使用。语法分析器产生程式使用形式文法来分析输入字串流(input stream),这是Lex使用简单的正规表示式所作不到的事情(Lex的设计被限制于只能使用有限状态自动机)。然而,语法分析器产生程式不能直接读取简单的输入字串流–他们需要使用一系列的单词(token)。Lex则常常被使用来提供语法分析器产生程式这一些单词。
Lex和make
[编辑]make是一个便利程式(utility),在这里我们用它来维护跟lex相关的程式。make假设副档名是.l
的档案是一个lex原始码档案。make内部的巨集LFLAGS
可以用来详列make自动触发的lex选项。[3]
相关条目
[编辑]参考文献
[编辑]- ^ Levine, John R; Mason, Tony; Brown, Doug. LEX & YACC 2. O'Reilly. 1992: 1–2 [2010-03-16]. ISBN 1-56592-000-7. (原始内容存档于2014-12-02).
- ^ Levine, John. flex & bison. O'Reilly Media. August 2009: 304 [2010-03-16]. ISBN 978-0-596-15597-1. (原始内容存档于2011-08-16).
- ^ make, The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition (The IEEE and The Open Group), 2004 [2010-03-16], (原始内容存档于2010-10-31)