`

Lex 编译器入门

阅读更多
Lex工具
-------
Lex工具是一种词法分析程序生成器,它可以根据词法规则说明书的要求来生成单词识别程序,由该程序识别出输入文本中的各个单词。
1 、lex程序的结构

-定义部分
-规则部分
-用户子程序部分

其中规则部分是必须的,定义和用户子程序部分是任选的。

(
1 ) 定义部分
定义部分起始于
" %{ " 符号,终止于 " %} " 符号,其间可以是包括include语句、声明语句在内的C语句。
%{
#include 
" stdio.h "
#include 
" y.tab.h "
extern int lineno
;
%}

(
2 ) 规则部分
规则部分起始于
" %% " 符号,终止于 " %% " 符号,其间则是词法规则。词法规则由模式和动作两部分组成。模式部分可以由任意的正则表达式组成,动作部分是由C语言语句组成,这些语句用来对所匹配的模式进行相应处理。需要注意的是,lex将识别出来的单词存放在yytext  [] 字符数据中,因此该数组的内容就代表了所识别出来的单词的内容。

%%
[ ]  { ; }
[ 0-9 ] +.? [ 0-9 ] *. [ 0-9 ] +
{ sscanf(yytext
, " %1f " ,  &yylval.val) ;
return NUMBER ;  }
 { lineno++ ; return '' ''; }
. { return yytex+ [ 0 ] ;  }
%%

(
3 ) 用户子程序部分
用户子程序部分可以包含用C语言编写的子程序,而这些子程序可以用在前面的动作中,这样就可以达到简化编程的目的。下面是带有用户子程序的lex程序片段。
" /* "  skipcmnts() ;
. /* rest of rules */
%%
skipcmnts()
{
for ( 
;  ; )
{
while (input()!
= ''*'') ;
if(input()! = ''/'')
unput(yytext
[ yylen-1 ] ) ;
else return ;

 以上是这个工具的简要说明。

我在这里以《编译原理》(龙书)的习题为例,
3.11 编写一个Lex程式,该程式复制一个文件,并将每一个非空的空白符序列用一个空格代替。
首先,这个“非空的空白符序列”是指由空格和制表符号组成的序列,其正则表达式是[ \t],大家注意在前面有一个空格。
再则就是做一个替换操作了。

代码为:

%{
#include 
" stdio.h "
%}

delim    
[   ]
ws    {delim}+

%%
{ws} printf(
"   " ) ;
. printf( " %c " , yytext [ 0 ] ) ;
%%

存为  P3-11.l
编译过程
lex P3-11.l
cc -c lex.yy.c
cc lex.yy.o -ll -o run

使用过程
run < in.txt
输入文件内容

I am     a best player   in the   world ,
And         I  am very    sorry     to trouble you.

Hehe.


输出结果为

I am a best player in the world ,
And I am very sorry to trouble you.

Hehe.


最后我提供一个脚本,方便编译。
我的系统环境是
Ubuntu 7.10
flex 2.5.33

安装Lex过程
sudo apt-get install flex

#  Copyright (C) 2003-2008 Wang Pengcheng <wpc0000@gmail.com>
#!/usr/bash

lex $ 1  
cc 
- c lex . yy . c
cc lex
. yy . - ll  - o run
rm lex
. yy .*
rm 
*~

 

分享到:
评论

相关推荐

    lex Lex 入门学习

    ### Lex入门学习知识点详解 #### 1. 什么是Lex? **Lex** 是一个词法分析器的生成器,主要用于从输入流中识别出基于正则表达式的模式,并将其分割成可处理的部分。它广泛应用于文本处理和编程语言的词法分析阶段。...

    Yacc与Lex快速入门

    ### Yacc与Lex快速入门知识点详解 #### 一、Lex简介 - **Lex** 是一个用于生成词法分析器的工具。词法分析器的主要作用是从输入文本中识别出有意义的词汇模式,这些模式通常是由正则表达式定义的。 - 当Lex接收到...

    Yacc 与 Lex 快速入门

    【Yacc 与 Lex 快速入门】 Yacc 和 Lex 是在 UNIX 系统中用于构建编译器和解析器的两个强大工具。对于初学者来说,了解这两个工具的基础知识至关重要。本文由软件工程师 Ashish Bansal 提供,他详细介绍了如何使用 ...

    yacc,lex从入门到精通

    ### Lex和Yacc从入门到精通 #### 一、环境配置篇 在开始学习如何使用Lex和Yacc之前,首先需要确保已经正确地配置好了所需的开发环境。由于本教程主要面向的是Windows系统的用户,因此接下来将详细介绍如何在...

    20200213-编译器入门-Wangtianran.pdf

    这篇文档“20200213-编译器入门-Wangtianran.pdf”主要介绍了编译器的基础知识,包括词法分析、语法分析等核心概念。 首先,文档以《编译器设计》和《现代编译原理C语言描述》两本书作为理论基础,这两本书都是...

    Yacc 与 Lex 快速入门1

    《Yacc与Lex快速入门》 Yacc与Lex是UNIX操作系统中用于开发编译器和解析器的两个重要工具。本文将对这两个工具进行简要介绍,并探讨它们的基本使用方法和核心概念。 首先,让我们从Lex开始。Lex是一款用于生成词法...

    Lex和Yacc从入门到精通pdf

    《Lex和Yacc从入门到精通》是一本深入解析Unix工具Lex和Yacc的专业书籍,旨在帮助读者逐步掌握这两款强大的编程工具,从而构建出功能丰富的解析程序。Lex(也称为lex或flex)和Yacc(也称为yacc或bison)是经典的...

    编译原理的Yacc 与 Lex 快速入门

    【编译原理的Yacc与Lex快速入门】 在编译原理的学习中,了解和掌握Yacc与Lex是非常关键的步骤。这两个工具是UNIX系统中用于编译器开发的重要组件,对于构建FORTRAN和C编译器有着极大的便利性。本文将提供一个初级...

    LexAndYacc入门教程源代码

    3. **源代码示例**:提供简单的编程例子,展示如何使用Lex和Yacc创建一个简单的解释器或编译器。 4. **错误处理**:在描述中提到,教程中的原始代码存在编译问题,这可能是由于语法错误、未定义的符号或者其他常见...

    Lex yacc从入门到精通

    ### Lex Yacc从入门到精通——关键知识点概览 #### 一、Lex与Yacc简介 - **Lex**(词法分析器生成器)与**Yacc**(又名Yet Another Compiler Compiler,语法分析器生成器)是两款强大的工具,主要用于帮助开发者...

    lex_yacc入门资料

    《LEX&YACC入门资料》是一份详尽的教程,由Tom Niemann撰写,旨在指导读者如何使用LEX和YACC工具构建编译器。LEX和YACC是编程领域内广泛使用的工具,分别用于生成词法分析器和解析器,它们在编译器设计和实现中扮演...

    Lex和Yacc入门(A COMPACT GUIDE TO Lex&Yacc)含源码

    该文档主要讲解了如何用lex和yacc组建一个编译器。并描述了如何做一个复杂的计算器。 This document explains how to construct a compiler using lex and yacc. Lex and yacc are tools used to generate lexical ...

    Lex和Yacc从入门到精通

    ### Lex和Yacc从入门到精通 #### 一、引言与环境配置 Lex和Yacc是用于构建词法分析器和语法分析器的强大工具,它们通常被用于编译器和解释器的开发中。Lex负责词法分析,即识别输入流中的词汇单元;而Yacc则负责...

    Lex与Yacc学习资料

    包含的三份PDF文档分别为“Lex与yacc.pdf”、“Lex和yacc从入门到精通.pdf”以及“编译的重要性.pdf”,旨在帮助读者理解和掌握这两个重要的编译器构造工具。 首先,让我们来探讨一下Lex。Lex是一种用于生成词法...

    Yacc+与+Lex+快速入门

    ### Yacc与Lex快速入门详解 #### 一、引言 Lex与Yacc是Unix世界中极为重要的两个工具,它们广泛应用于编译器的设计与开发过程中。...对于想要学习编译器设计的初学者来说,Lex和Yacc无疑是最好的入门工具之一。

    Yacc_与_Lex_快速入门

    ### Yacc与Lex快速入门详解 #### 一、引言 Lex 和 Yacc 是 UNIX 下两个极其重要的工具,它们在语言处理和编译器构建领域扮演着核心角色。熟悉这两款工具不仅能够帮助开发者理解语言解析的基础原理,还能够极大地...

    lex和yacc学习资料

    《lex和yacc学习资料》包含了关于编译器构造领域两个关键工具——lex和yacc的深入学习资源,以及它们的现代替代品flex与bison的相关书籍和源代码。这些工具在软件开发中扮演着重要角色,特别是对于理解编译原理和...

Global site tag (gtag.js) - Google Analytics