以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 C/C++编程思想 』  (http://bbs.xml.org.cn/list.asp?boardid=61)
----  将小写字母换为大写字母的程序  (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=48752)


--  作者:Arica
--  发布时间:6/20/2007 3:40:00 PM

--  将小写字母换为大写字母的程序
[ 将小写字母换为大写字母的程序
    设计内容
编写一个程序,它将一个正文文件中的全部小写字母均换为大写字母,并将其中的制表字符、空白字符序列均用单个空格字符进行替换。]
   
哪位大哥帮帮我嘛,我编不出来啊~~T-T
--  作者:一分之千
--  发布时间:6/20/2007 4:51:00 PM

--  
从我程序里截取的一部分  能够转换为大写
===========
fstream myFile("Text.txt",ios::out|ios::in);
 if(myFile.fail())
 {
  cerr<<"error opening file!\n";
  return;
 } 
 cout<<"The content of the file is:"<<endl<<endl;
 letter=myFile.get(); 
 while (!myFile.eof())
 {   
  letter=toupper(letter);//字母大写
                    cout.put(letter);//输出内容

--  作者:一分之千
--  发布时间:6/20/2007 4:56:00 PM

--  
替换的时候就是判断了 如果等于制表符 就替换为空格
如果是空格  并且前一个字符也是空格就跳过该字符 不保存 否则也等于空格

大体是这个意思吧 可能不太严谨 在实际编程的时候你再看看是不是包括完全了~


--  作者:Arica
--  发布时间:6/21/2007 3:17:00 PM

--  
将小写字母换为大写字母的LEX源程序,什么是LEX源程序?和编译有关?
--  作者:一分之千
--  发布时间:6/22/2007 8:07:00 PM

--  
lex是一个词法分析程序的生成程序,它是为了对字符输入流进行词法分析而设计的,在lex源程序里,用户说明正则表达式,lex对用户使用lex语言写的源程序进行处理,得到一个程序,该程序从输入流中识别出与某个用户所提供的正则表达式匹配的字符串,并在识别出字符串时执行由用户提供的程序。
   与c,pascal等语言不同,lex语言并不是一个完整的语言:lex只是把用户的lex语言源程序转换为一个C语言源程序,用户再用c语言编译程序编译lex生成的c语言源程序,才能得到最终的可执行程序。因此,我们把c语言叫做lex语言的宿主语言。我们也可以把lex语言看作是对c语言的补充,在lex语言中,用户除了可以以c语言的形式来写函数外,还可以以一种非常高级的形式来描述想要从输入流中识别出的字符串和档这些字符串被识别出来时要执行的动作,实际上就是执行一段c语言程序,在unix系统中,fortran语言的一种改进形式ratfor也是可以用lex语言的宿主语言。


lex自动地把表示输入串词法结构的正则表达式及相应的动作的lex源文件转换成一个C语言源文件lex.yy.c,在该源文件中,有一个函数yylex,他就是语法分析程序。他可以识别出输入串中的单词(token),并且在识别出某单词完成指定的动作(执行一段c语言程序)。
   lex的工作原理是把源程序中的正则表达式转换成相应的确定有限自动机DFA,而相应的动作则插入到词法分析程序yylex中适当的地方,控制流则由该DFA的解释程序掌握,对于不同的源程序,这个解释程序是相同的。
   作为一个简单的例子,我们看一个统计文本文件行数的程序:
   $cat lex.l
%{
int nline=0;
%}
%%
\n {++nline;}
. ;
%%
int yywrap()
{
printf("%d\n",nline);
}


$lex lex.l
$cc lex.yy.c -ll
$a.out </usr/include/stdio.h
271
$

在lex源程序中,用户用正则表达式来描述输入串的词法结构的。一个正则表达式表示一个字符串的集合,换句话说,他秒数了一组要匹配的字符串。正则表达式由正文字符与运算符组成。正文字符组成了基本的正则表达式,表示某一个字符串,运算符则把基本的正则表达式组合成为更复杂的正则表达式,表示字符串的集合。
  例如:正则表达式ab仅表示字符串ab,而正则表达式(ab)+则表示字符串的集合;(ab,abab,ababab,.......}.
   在lex中,正则表达式运算符共有20个:
“ \  [ ] ^ - ? . * + | ( ) $ / { } % < >;
   上述运算符需要作为正文字符出现在正则表达式中时,必须借助于双引号“或者反斜线\,如:正则表达式ab"++"或ab\+\+都表示字符串ab++,而正则表达式ab+则表示字符串的集合:{ab,abb,abbb,.......}。为了避免死记上述20个运算符,建议在使用非字母和数字字符时都使用双引号或者反斜线。要表示双引号本身可以用\“,要表示反斜线本身用"\"或者\\。用\还可以表示几个特殊符号:\n是回车还行,\t是制表符,\b是退格符。
   未完-----待续

下面分别按照功能介绍上述的运算符

1、字符的集合
    [xyz]:方括号表示字符的集合,即x,y,z单个字符匹配。
    -:表示字符的范围
    ^:必须写在第一个位置,它的作用是求方括号中除了^之外的字符组成的字符集合相对于计算机字符集的补集,如正则表达式[^abc]和除去a,b,c外的所有符号匹配。
   2、闭包运算
    运算符*和+是lex正则表达式中的闭包运算符,他们表示正则表达式中某子式的重复,例如a*表示由0个或者多个a组成的字符串的集合,而a+表示由1个或者多个a组成的字符串的集合,如[_a-zA-Z][_a-zA-Z0-9]*表示第一个字符是字母或者下划线,其余字符是字母,下划线或者数字的字符串,如c语言中的标识符。
   3、选择和字符组
    运算符|表示选择,如正则表达式(ab|cb)与字符串ab或者cb匹配。运算符()表示一组字符。注意()和[]的不同:(ab)表示字符串ab,而[ab]则表示单个字符a或者b。圆括号()用于表示复杂的正则表达式,例如:正则表达式(ab|cd+)?(ef)*与字符串abefef,efef,cdef,cddd等匹配,但不与字符串abc,abcd,或者abcdef匹配。
   4、重复和辅助定义
   当被{}括起来的是数字时,{}表示重复,当他括起来的是第一个标识符时,则表示辅助定义的展开。例如正则表达式a{1,5}表示字符串集合{a,aa,aaa,aaaa,aaaaa}。而{digit}则把digit所定义的正则表达式插入到他所在的位置上。
   5、其他
   运算符.匹配除了\n外的所有字符。运算符?指出正则表达式中可有可无的子式,例如正则表达式ab?c与字符串ac或者abc匹配,即b是可有可无的。


常用的一些运算符:
x                     字符x
"x"                  字符x
\x                    字符x
[xy]                 字符x或者字符y
[x-z]                字符x,y或者z
[^x]                 除了x外的所有字符
.                       除了\n外的所有字符
^x                   出现在一行开始处的字符x
<S>;x               当lex处于开始条件S下时的x
x$                    出现在行尾的x
x?                    可有可无的x
x*                    0个或者多个x
x+                    1个或者多个x
x|y                    x或者y
(x)                    字符x
x/y                    其后紧随y的字符x
x{m,n}              m到n个x

lex程序的输入和输出
lex生成的lex.yy.c里边,所有的输入都是从流yyinput读,写道流yyoutput的,不过在初始化时,yyinput被初始化成stdin,故和标准输出相连,yyoutput被初始化成stdout,故和标准输出相连,lex.yy.c的片断如下:FILE *yyin = {stdin},*yyout = {stdout};
因此当我们想从另外一个文件而不是标准输入读入时,只要在程序中打开该文件,把fopen返回的指针付给yyin即可

lex从字符串中读输入的方法
有时候lex从字符串中读输入,而不是从文件中读输入,我们可以修改lex锁调用的lex锁调用的I/O函数这些函数是:
input()        返回下一个输入字符
output(c)    把字符c写到输出上
unput(c)      把字符c放回输入流,以便让下一个input()可以读取他
实际上这些函数都是用宏来定义的,用户可以重定义这些宏
例如:
%{
char s[256];
char *sptr = s;

#define input()                (*sptr++)
#define unput(c)             (*--sptr = (c))
#define output(c)             /*null*/
%}


--  作者:Arica
--  发布时间:6/26/2007 5:18:00 PM

--  
将小写字母换为大写字母的LEX程序要怎么实现呢?怎么编呢?

W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
79.102ms