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將下一個標記附加到當前標記後。