lex
在计算机科学里面,lex是一个产生词法分析器(lexical analyzer,"扫描仪"(scanners)或者"lexers")的程序。[1][2] Lex常常与yacc 语法分析器产生程序(parser generator)一起使用。Lex(最早是埃里克·施密特和迈克·莱斯克制作)是许多UNIX系统的标准词法分析器(lexical analyzer)产生程序,而且这个工具所作的行为被详列为POSIX标准的一部分。
原作者 | Mike Lesk, Eric Schmidt |
---|---|
首次发布 | 1975年 |
源代码库 | |
操作系统 | Unix和类Unix系统 |
类型 | 命令 |
Lex读进一个代表词法分析器规则的输入字符串流,然后输出以C语言实做的词法分析器源代码。
虽然传统上是商业软件,但是有些根据原本AT&T代码这些版本的Lex可以以公开源代码的形式获得,并被视为某些系统的一部分,例如说OpenSolaris和贝尔实验室九号项目。另一个有名的Lex公开源代码版本是flex,代表"快速的词法分析器"(fast lexical analyzer)
lex文件的结构
编辑lex的文件结构故意设计的与yacc的文件格式相似;文件分成三个区块,均以一个只有两个百分比符号(%)的单行来分隔,如下:
定義區塊 %% 規則區塊 %% 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)