http://flex.sourceforge.net/manual/java
1. 介紹git
Flex是一個用於生成掃描器(scanners)的工具。輸入是文件或標準輸入,而後根據描述的規則,flex生成C源文件,其中定義函數yylex()。這個C文件就能被編譯了,其就能做爲一個掃描器使用的。正則表達式
2. 輸入文件的格式函數
flex輸入文件包含三個部分,經過一行只包含%%來分隔開,即:工具
definitions %% rules %% user code
(1) definition部分flex
主要包含是聲明一個簡單的name定義來簡化掃描器說明,和聲明一個start條件。.net
name定義有以下形式:code
name definitionget
其中name爲一個以字母或下劃線開頭的單詞,後面有零個或多個字母、數字、下劃線或破折號。definition是從name以後的第一個非空字符開始直到這一行的結束。並且,definition能夠在後面經過"{name}"引用,將會將其擴展爲「(definition)"。it
舉例:
digit [0-9]
id [a-z][a-z0-9]*
這樣就分別定義了name="digit",其definition爲"[0-9]和name="id",其definition爲"[a-z][a-z0-9]*"。
那麼後面能夠經過引用digit的定義使用{digit}+"."{digit}*來表示([0-9])+"."([0-9])*的內容。
另外,沒有縮進的註釋(如/* */)會被直接複製到輸出中。
一個縮進的文本或使用"%{"和"%}"包含的文本也會被複制到輸出中(不包括"%{"和"%}"自己)。
另外,還有"%top"塊,和上面的相似,可是其中的代碼會被複制到輸出的頂部,通常用於在裏面定義一些頭文件或宏等。容許多個%top塊。如:
%top{ /* This code goes at the "top" of the generated file. */ #include <stdint.h> #include <inttypes.h> }
(2) rules部分
rules部分包含一系列形式的規則,其格式爲:
pattern action
簡單理解就是知足某一個模式,執行某一個行爲,後面繼續討論其規則。其中pattern必須是沒有縮進的,action必須在同一行。
在rules部分,任何縮進的或者被%{ %}包含的內容,若是出如今第一條rule以前,可能用於聲明用於掃描時候的局部變量和進入掃描程序時候要執行的代碼,若是出如今rule後面,那麼這些內容會被直接複製到輸出中,其行爲多是未定義的,可能引起錯誤。
(3) user code部分
user code部分會被簡單的複製到輸出文件lex.yy.c中。用於定義一些代碼被掃描器使用。這部分是可選的,若是不須要這部分,那麼第二個%%也不須要。
(4) 註釋
Flex支持/**/的註釋形式。flex遇到註釋,就會將其原封不動的複製到輸出文件中。註釋能夠在任何地方出現,除非:
1. 可能不能出如今rules部分,當flex須要一個正則表達式的時候(好比%%以後的一行就要求是正則表達式等)。
2. 可能不能出如今definiton部分的"%option"的行中。
總之,爲了簡單,儘可能全部的註釋都在單獨的一行開始而且在/*以前有一個以上空格,就不會有任何問題了。