Flex2.5用户手册(二) (转)

Flex2.5用户手册(二) (转)[@more@]

Flex2.5用户手册(二)XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />

Flex概要

flex是一个用于生成扫描器的工具,扫描器可识别文本中的词法模式。flex从给定的文件中读取,或者从标准输入中读取(当没有给定文件时)有关要生成的扫描器的说明。这种说明的格式是一对正规表达式和C代码,称之为规则。flex的输出是名为lex.yy.c的C源程序,在lex.yy.c中定义了一个名为yylex()的函数。lex..yy.c可以被编译,并使用-lfl链接选项同flex库链接,以生成可执行文件。执行该文件,它会分析它的输入,察看是否满足正规表达式,只要它发现一个,就会执行相应的C代码。

简单的例子

  首先介绍一些简单的例子来演示如何使用flex。下面的flex输入规范定义了一个扫描器,每当它遇到字符串“username”时,就要用户的登陆名替换掉该字符串。

  %%

  username  printf( "%s", getlogin() );

  默认情况下,任何被该扫描器匹配的文本都被拷贝到输出中,因此该扫描器的作用就是将它的输入内容拷贝到输出中,当遇到“username”时将其扩展。在本例中,输入中只有一个规则。“username”就是一个模式而“printf”就是该模式对应的动作。“%%”表示规则的开始。

在看另外一个例子:

  int num_lines = 0, num_chars = 0;

  %%

    ++num_lines; ++num_chars;

  .  ++num_chars;

  %%

  main()

  {

  yylex();

  printf( "# of lines = %d, # of chars = %d ",

  num_lines, num_chars );

  }

  这个扫描器统计输入中的字符数和行数(除了最后报告统计结构,它不产生其他输出)。第一行声明了两个全局变量,”num_lines”和”num_chars”,yylex()和在第二个” %%”后定义的main()均可访问这两个全局变量。该扫描器有两个规则,一个匹配一个换行符(” ”)如果匹配则累加num_lines和num_chars,另一个规则匹配除换行符之外的任何字符(由正规表达式”.”表示)。

一个稍微复杂点的例子:

/* scanner for a toy Pascal-like language */

  %{

  /* need this for the call to atof() below */

  #include

%}

  DIGIT  [0-9]

ID  [a-z][a-z0-9]*

  %%

  {DIGIT}+  {

  printf( "An integer: %s (%d) ", yytext,

  atoi( yytext ) );

   }

  {DIGIT}+"."{DIGIT}*  {

  printf( "A float: %s (%g) ", yytext,

  atof( yytext ) );

  }

  if|then|begin|end|procedure|function  {

  printf( "A keyword: %s ", yytext );

  }

  {ID}  printf( "An identifier: %s ", yytext );

  "+"|"-"|"*"|"/"  printf( "An operator: %s ", yytext );

  "{"[^} ]*"}"  /* eat up one-line comments */

  [ ]+  /* eat up whitespace */

  .   printf( "Unrecognized character: %s ", yytext );

  %%

  main( argc, argv )

  int argc;

  char **argv;

  {

  ++argv, --argc;  /* skip over program name */

  if ( argc > 0 )

  yyin = fopen( argv[0], "r" );

   else

  yyin = stdin;

 

  yylex();

  }

这个例子是一个针对类Pascal语言的扫描器的雏形,它可识别不同类型的记号(token)并且能报告它看到的东西。

接下来的部分将解释这个例子的细节。


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-963047/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10752043/viewspace-963047/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值