lex 編程

 

lex 編程

lex編程分三步

1.以Lex可以理解的格式指定模式相關的動作。

2.在這一文件上運行lex 生成掃碼器的C代碼。

3.編譯和鏈接C代碼,生成可執行的掃描器。

 

C和Lex的全局聲明

可以增加C變量聲明,及Lex的標記聲明如:

%{

int wordCount =0;

%}

chars [A-Za-z\_\'\.\"]

numbers ([0-9])+

delim [" "\n\t]

whilespace {delim}+

words {chars}+

%%

兩個百分號標記指出了Lex程序中這一段的結束和三段中第二段的開始。

 

Lex的模式匹配規則

{words} {wordCount++;}

{whitespace} {}

{numbers} {}

%%

 

C代碼

Lex編程的第三段,也就是最後一段覆蓋了C的函數聲明(有時是主函數)。注意這一段必須包括yywrap()函數。Lex有一套可供使用的函數和變量。其中之一就是yywrap.

例:

void main()

{

        yylex();

         printf("no of words:%d\n",wordCount);

}

int yywrap()

{

return 1;

}

 

Lex編譯

$lex <filename.l>

生成lex.yy.c文件,它可以用C編譯器來進行編譯。

這裏是一些Lex的標誌:

-c 表示C動作,缺省

-t 寫入lex.yy.c程序來代替標準輸出。

-v 提供一個兩行的統計彙總。

-n 不打印-v的彙總。

 

高級Lex

Lex有幾個函數和變量提供了不同的信息,可以用來編譯實現複雜函數的程序。詳情參考lex或flex手冊

Lex變量

yyin            FILE *類型,指向lex正在解析的當前文件。

yyout          FILE* 類型,指向記錄lex輸出的位置。缺省情況下,yyin和yyout都指向標準輸入和輸出。

yytext         匹配模式的文件存儲在這一變量中(char *)

yyleng        給出匹配模式的長度。

yylineno     提供當前的行數信息。

Lex函數

yylex()          這一函數開始分析。有lex自動生成。

yywrap()       這一函數在文件的末尾調用。如果函數的返回值是1.就停止解析。

yyless(int n)  這一函數可以用來送回出了前n?這個字符外的所以讀出標記。

yymore()        這一函數告訴Lex將下一個標記附加到當前標記後。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章