Flex2.5使用者手冊(二) (轉)
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Flex2.5使用者手冊(一) (轉)Flex
- (轉)sqlmap使用者手冊SQL
- ORACLE分析函式手冊二(轉)Oracle函式
- Linux不完全手冊(二)(轉)Linux
- PHP4使用者手冊:常量 (轉)PHP
- Oracle分析函式參考手冊(轉)二Oracle函式
- mapinfo使用者手冊 第22章(一) (轉)API
- sqlmap使用者手冊SQL
- PHP4使用者手冊:函式->usleep (轉)PHP函式
- PHP4使用者手冊:函式->flock (轉)PHP函式
- PHP4使用者手冊:函式->fputs (轉)PHP函式
- PHP4使用者手冊:函式->fseek (轉)PHP函式
- PHP4使用者手冊:函式->fwrite (轉)PHP函式
- PHP4使用者手冊:函式->trim (轉)PHP函式
- PHP4使用者手冊:函式->file (轉)PHP函式
- PHP4使用者手冊:流程控制->for (轉)PHP
- PHP4使用者手冊:函式->count (轉)PHP函式
- PHP4使用者手冊:函式->CURL (轉)PHP函式
- 職教系統專案開發手冊(二) (轉)
- PHP4使用者手冊:流程控制->while (轉)PHPWhile
- PHP4使用者手冊:流程控制->require (轉)PHPUI
- PHP4使用者手冊:變數->基礎 (轉)PHP變數
- 【轉】[C#] NVelocity 使用者手冊 英文原版C#
- sqlmap使用者手冊[續]SQL
- Oracle VM使用者手冊Oracle
- iptables中文手冊(轉)
- Linux 管理員手冊(7)--管理使用者帳戶(轉)Linux
- PHP4使用者手冊:運算子->字串運算子 (轉)PHP字串
- PHP4使用者手冊:資料型別->arrays (轉)PHP資料型別
- ORACLE分析函式手冊二Oracle函式
- Hprose 2.0 for Golang 使用者手冊ROSGolang
- RMAN使用者手冊總結
- ZYNQ核心板使用者手冊
- oracle函式手冊(轉)Oracle函式
- aptitude 簡明手冊(轉)APT
- RPM命令手冊 (轉)
- XML輕鬆學習手冊(5)XML語法之二(轉)XML
- 阿里Java開發手冊思考(二)阿里Java