Lex 编译器入门
来源:互联网 发布:linux 关闭程序 编辑:程序博客网 时间:2024/05/13 11:18
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;
}
-------
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]);
%%
#include "stdio.h"
%}
delim [ ]
ws {delim}+
%%
{ws} printf(" ");
. printf("%c",yytext[0]);
%%
编译过程
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.
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.
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.o -ll -o run
rm lex.yy.*
rm *~
#!/usr/bash
lex $1
cc -c lex.yy.c
cc lex.yy.o -ll -o run
rm lex.yy.*
rm *~
- Lex 编译器入门
- lex入门
- LEX入门
- Lex 入门
- yacc与lex入门
- Lex和Yacc入门
- lex 和 yacc 入门
- lex 和 yacc 入门
- Lex Yacc (一) 入门
- LEX与YACC入门
- 从lex&yacc说到编译器--Javacc
- Yacc 与 Lex 快速入门
- Yacc 与 Lex 快速入门
- lex和yacc快速入门
- Yacc 与 Lex 快速入门
- Yacc 与 Lex 快速入门
- Yacc 与 Lex 快速入门
- lex和yacc快速入门
- linux:C编写基础
- aaa
- [老文章]SQLite数据库安全
- Java反射机制
- SQLite第三版中的数据类型
- Lex 编译器入门
- 数据库连接错误笔记(ASP.NET+SQL2005)--auto attach
- prjCDDoorControl(光驱门控制) - Win32 Application - VC++6 - HackerJLY
- 2008-3-3大盘分析
- SQLite语法 SELECT
- SQLite语法 VACUUM
- SQLite语法 UPDATE
- SQLite语法 REPLACE
- SQLite语法 REINDEX