
_START_ARTICLE_
Lex
_START_PARAGRAPH_
在计算机科学里面，lex是一个产生词法分析器（lexical analyzer，"扫描仪"（scanners）或者"lexers"）的程序。 Lex常常与yacc 语法分析器产生程序（parser generator）一起使用。Lex(最早是埃里克·施密特和迈克·莱斯克制作）是许多UNIX系统的标准词法分析器（lexical analyzer）产生程序，而且这个工具所作的行为被详列为POSIX标准的一部分。_NEWLINE_Lex读进一个代表词法分析器规则的输入字符串流，然后输出以C语言实做的词法分析器源代码。_NEWLINE_虽然传统上是商业软件，但是有些根据原本AT&T代码这些版本的Lex可以以公开源代码的形式获得，并被视为某些系统的一部分，例如说OpenSolaris和贝尔实验室九号项目。另一个有名的Lex公开源代码版本是flex，代表"快速的词法分析器"（fast lexical analyzer）
_START_SECTION_
lex文件示例
_START_PARAGRAPH_
下面是一个flex版本的lex文件的示例。这个程序可以找出表示数字（整数）的字符串，并将它们打印出来。_NEWLINE_/*** 定義區塊***/_NEWLINE__NEWLINE_%{_NEWLINE_/* 會直接照搬放檔頭的C code */_NEWLINE_#include <stdio.h>_NEWLINE_%}_NEWLINE__NEWLINE_/* 這裡告訴flex只要讀取輸入的檔案（不需要其他檔案）*/_NEWLINE_%option noyywrap_NEWLINE__NEWLINE_%%_NEWLINE_    /*** 規則區塊***/_NEWLINE__NEWLINE_    /* [0-9]+代表包含一個或多個數字的字串*/_NEWLINE_[0-9]+  {_NEWLINE_            /* yytext是一個字串變數，內容是符合規則的字串本身。*/_NEWLINE_            printf("Saw an integer: %s\n", yytext);_NEWLINE_        }_NEWLINE__NEWLINE_.       {   /* 忽略所有其他的字*/   }_NEWLINE__NEWLINE_%%_NEWLINE_/*** C程式碼區塊***/_NEWLINE__NEWLINE_int main(void)_NEWLINE_{_NEWLINE_    /* 呼叫lexer，然後結束程式*/_NEWLINE_    yylex();_NEWLINE_    return 0;_NEWLINE_}_NEWLINE_将这个文件输入给flex，它会将这个文件转换成一个C文件，文件名lex.yy.c。这个C文件可以被编译成一份可执行档，功能为找出并且输出代表整数的字符串。例如，给定输入：_NEWLINE_abc123z.!&*2ghj6_NEWLINE_这只程序会印出：_NEWLINE_Saw an integer: 123_NEWLINE_Saw an integer: 2_NEWLINE_Saw an integer: 6
_START_SECTION_
Lex和语法分析产生程序（parser generator）并用
_START_PARAGRAPH_
Lex和语法分析器产生程序，例如说Yacc或者Bison之类，常常一起使用。语法分析器产生程序使用形式文法来分析输入字符串流（input stream），这是Lex使用简单的正则表达式所作不到的事情（Lex的设计被限制于只能使用有限状态自动机）。然而，语法分析器产生程序不能直接读取简单的输入字符串流–他们需要使用一系列的单词（token）。Lex则常常被使用来提供语法分析器产生程序这一些单词。
_START_SECTION_
Lex和make
_START_PARAGRAPH_
make是一个便利程序（utility），在这里我们用它来维护跟lex相关的程序。make假设扩展名是.l的文件是一个lex源代码文件。make内部的宏LFLAGS可以用来详列make自动触发的lex选项。