Flex2.5使用者手冊(二) (轉)

worldblog發表於2007-08-17
Flex2.5使用者手冊(二) (轉)[@more@]

Flex2.5手冊(二):namespace prefix = o ns = "urn:schemas--com::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 key: %s ", yytext );

  }

  {ID}  printf( "An ntifier: %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;  /* skover program name */

  if ( argc > 0 )

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

   else

  yyin = stdin;

 

  yylex();

  }

這個例子是一個針對類Pascal語言的掃描器的雛形,它可識別不同型別的記號(token)並且能報告它看到的東西。

接下來的部分將解釋這個例子的細節。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-963047/,如需轉載,請註明出處,否則將追究法律責任。

相關文章