在delphi中用TParser 类解析字符串

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/do2008/article/details/1345104
BDN参考的写法:http://bdn.borland.com/article/26380

procedure TForm1.Button6Click(Sender: TObject);
var
  theParser: TParser;
  oString: TStringStream;
  str:AnsiString;
  Pos,Line:integer;
begin
  oString := TStringStream.Create(Memo1.Lines.text);
  oString.Position := 0;
  theParser:= TParser.Create(oString);

  while (theParser.Token <> toEOF) do //while we're in the file
  begin
    //Get Token
    str:=theParser.TokenString();
    //Get the position in the stream
    Pos:=theParser.SourcePos();
    //Get the line number
    Line:=theParser.SourceLine;
    //Get token type
    case (theParser.Token) of
      toSymbol:
        Memo2.Lines.Add(str+' is a symbol at line : '+IntToStr(Line)+'   position : '+IntToStr(Pos));

      toInteger:
        Memo2.Lines.Add(str+' is an integer at line : '+IntToStr(Line)+' position : '+IntToStr(Pos));

      toFloat:
        Memo2.Lines.Add(str+' is an float at line : '+IntToStr(Line)+' position : '+IntToStr(Pos));

      toString:
        Memo2.Lines.Add(str+' is an string at line : '+IntToStr(Line)+' position : '+IntToStr(Pos));
    end;
    theParser.NextToken();
  end;
  theParser.Free;
  oString.Free;

end;



==========================================================================
当用于词频统计时,zswang(伴水清清)(专家门诊清洁工) 提供了一个写法
参考:http://community.csdn.net/Expert/TopicView3.asp?id=5097298
procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
vStringStream: TStringStream;
vWords: TStringList;
vStr: string;
begin
I := 0;
vStringStream := TStringStream.Create(Memo1.Lines.text);
vWords := TStringList.Create;
with TParser.Create(vStringStream) do try
vWords.Sorted := True;
while(Token <> toEOF) do
begin
if TokenSymbolIs(TokenString) then
begin
vStr := TokenString;
if vWords.IndexOf(vStr) < 0 then // 如果单词已经添加了
vWords.Add(vStr);
Inc(I);
end;
NextToken;
end;

Label1.Caption := Format('单词共: %d个', [I]);
Label2.Caption := Format('不同的单词共: %d个', [vWords.Count]);
//show Memo2.Lines.Assign(vWords);
finally
vWords.Free;
Free;
vStringStream.Free;
end;
end;

==========================================================================
注:TParser类,解析字符串时,若字符串中只有一个',会产生异常,提示(Invalid string constant on line 1),
这是因为TParser这个为DFM解析而写的类,关于'号的处理,有有特殊要求的,那就是要成对出现,并且两个''之字符,将认为是字符串.

也就是说,在用来解析普通字符串时,会因为如Teacher's day这样的句中,
因为只有一个',那是不完整的字符串表达式,是无效的表达式,
所以必然产生解析异常;
展开阅读全文

Delphi中用Excel报表

05-14

本来想发在Blog上的,但不会用Blog(菜死了...晕!!!),那位看官能教教我。。rn------------------rn在Delphi中用Excel报表rn作为一个开发各种信息系统的程序员,写报表是家常便饭的事,以至于曾经写个一个为报表而报表的项目^_^rn我用过报表的控件不多,用过Quick Report,Rave Report还有以前用VB时用过十分低版本的Crystal Report,当然还有这篇文章的主角Excel。Excel做报表有什么好处与坏处。我就不说了,大家都明白。(写了浪费大家时间)rn在Delphi中有专门的控件去调用Word、Excel等的Office组件。但这些控件的功能太多了,之间又有不少的联系,如果只是为调用Excel生成报表的话,我觉得还不如我自己这个类方便。rn我先来介绍一下我这个类的用法,各位看官,主看以下代码:rnrnprocedure TForm1.FormCreate(Sender: TObject);rnbeginrn AFER := TFlexExcelReport.Create;rn AFER.ModelFile := ExtractFilePath(Application.ExeName) + 'Book1.xls';rnend;rnrnprocedure TForm1.FormDestroy(Sender: TObject);rnbeginrn AFER.Free;rnend;rnrnprocedure TForm1.Button2Click(Sender: TObject);rnvarrn p1, p2 : TPoint;rnbeginrn p1.X := 2;rn p1.Y := 3;rn p2.X := 10;rn p2.Y := 20;rn AFER.Connect;rn AFER.Cells[1, 2] := 'FlexExcelReport Test';rn AFER.SelectCell(1, 2);rn AFER.Copy;rn AFER.SelectRange(p1, p2);rn AFER.Paste;rn AFER.SelectCell(1, 2);rn AFER.Clear;rn AFER.SetPrintArea(p1, p2);rnend;rn程序运行后,点击Button2,就会马上创建一个Excel的实例,这个实例是以Book1.xls为模板来打开的,打开后Excel会自动把这个文档命名为Book11。然后在1,2这个格里面填入内容,选择这个格子,复制,跟着选择2,3 -10,20这个区域,把刚才复制在剪贴板的内容复制进去。接下来就清除掉1,2中的内容,最后设置打印区域。rn每次点击Button2都会重复上面的操作。反正用户点击多少次Button2,就会生成多少个Excel的实例。你不必担心,当你退出这个程序时,这些Excel都会随之关闭并释放对像。这里为什么要以Book1.xls为模板呢?原因是我懒,我不想用Delphi操纵VBScript,在空白的WorkSheet中画报表(这是一件会做死人的事)。而是先把报表的式样画好在Book1.xls中,这样每次只要用Delphi填内容就可以了。rn是不是很简单呢?(我不是黄婆,不过还是要自夸一下!)rn 论坛

没有更多推荐了,返回首页