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和其他工具并用
参考文献
- Levine, John R; Mason, Tony; Brown, Doug. 2. O'Reilly. 1992: 1–2 [2010-03-16]. ISBN 1-56592-000-7. (原始内容存档于2014-12-02).
- Levine, John. . O'Reilly Media. August 2009: 304 [2010-03-16]. ISBN 978-0-596-15597-1. (原始内容存档于2011-08-16).
- , 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)
外部链接
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.