Lex

在计算机科学里面，lex是一个产生词法分析器（lexical analyzer，"扫描仪"（scanners）或者"lexers"）的程序。 Lex常常与yacc 语法分析器产生程序（parser generator）一起使用。Lex(最早是埃里克·施密特和迈克·莱斯克制作）是许多UNIX系统的标准词法分析器（lexical analyzer）产生程序，而且这个工具所作的行为被详列为POSIX标准的一部分。
Lex读进一个代表词法分析器规则的输入字符串流，然后输出以C语言实做的词法分析器源代码。
虽然传统上是商业软件，但是有些根据原本AT&T代码这些版本的Lex可以以公开源代码的形式获得，并被视为某些系统的一部分，例如说OpenSolaris和贝尔实验室九号项目。另一个有名的Lex公开源代码版本是flex，代表"快速的词法分析器"（fast lexical analyzer）

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和语法分析产生程序（parser generator）并用

Lex和语法分析器产生程序，例如说Yacc或者Bison之类，常常一起使用。语法分析器产生程序使用形式文法来分析输入字符串流（input stream），这是Lex使用简单的正则表达式所作不到的事情（Lex的设计被限制于只能使用有限状态自动机）。然而，语法分析器产生程序不能直接读取简单的输入字符串流–他们需要使用一系列的单词（token）。Lex则常常被使用来提供语法分析器产生程序这一些单词。

Lex和make

make是一个便利程序（utility），在这里我们用它来维护跟lex相关的程序。make假设扩展名是.l的文件是一个lex源代码文件。make内部的宏LFLAGS可以用来详列make自动触发的lex选项。