Lex快速入門

2022-07-29 19:42:18 字數 3209 閱讀 1061

用lex語言表達的正規表示式:

. 匹配任意字元,除了 \n (換行)

- 用來指定範圍。例如:a-z 指從 a 到 z 之間的所有字元;

a-z 指從 a 到 z 之間的所有字元;

0-9 指從 0 到 9 之間的所有字元;

* 匹配 0個或者多個上述的模式。例如:ab* 表示:a,ab,abb,abb...

+ 匹配 1個或者多個上述的模式。例如:ab+ 表示:ab,abb,abb,abbb...

? 匹配 0個或1個上述模式。例如:ab? 表示:a或ab

\ 用來轉義元字元。同樣用來覆蓋字元在此表中定義的特殊意義,只取字元的本意。

常見轉義字元:

\a 響鈴(bel)

\b 退格(bs) ,將當前位置移到前一列

\f 換頁(ff),將當前位置移到下頁開頭

\n 換行(lf) ,將當前位置移到下一行開頭

\r 回車(cr) ,將當前位置移到本行開頭

\t 水平製表(ht) (跳到下乙個tab位置)

\\ 代表乙個反斜線字元''\'

\' 代表乙個單引號(撇號)字元

\" 代表乙個雙引號字元

\0 空字元(null)

/ 向前匹配。如果在匹配的模版中的「/」後跟有後續表示式,只匹配模版中「/」前面的部分。例如:如果輸入 a01,那麼在模版 a0/1 中的 a0 是匹配的。

^ 表示否定。例如:[^ab]表示除ab以外的所有字元

[^0-9a-za-z]表示除了數字和字母以外的所有字元

| 表示式間的邏輯或。例如:("a"|"b")表示字元a或字元b

(r|s) 表示正規表示式r或s所表達的所有內容

$ 作為模式的最後乙個字元匹配一行的結尾。

() 將一系列常規表示式分組,並且小括號內的優先順序高於括號外的優先順序

乙個字元集合。匹配括號內的任意字元。如果第乙個字元是 ^ 那麼它表示否定。例如: [abc] 匹配 a, b, 和 c中的任何乙個。

{} 指出乙個模式可能出現的次數。例如: a 表示 a 可能出現1次或3次(即:a或aaa);

a 表示 a 重複兩次(即:aa)

a表示 a 重複十次以上

若包含名稱,則以該名稱替換。例如:正規表示式r [a-z](即:r表示小寫字母) , 那麼+就表示所有以小寫字母構成的字串

認識幾種表示式:

joke[rs] 匹配 jokes 或 joker。這裡的r和s是字母不是表示式,若r或s是表示式,則應改寫為joke

ashis+ 匹配 ashi, ashis, ashiss,ashisss...... aashi,aashis,aashiss,ashisss.....

digit [0-9] 表示式digit表示乙個數字

number + 表示式number表示所有自然數

digit [0-9]

letter [a-za-z]

identifier (|)* 表示有字母開頭,並且又字母和數字組成的所有識別符號

whitespace [" "\t\n\r]+ 表示空白部分(即包含有空格,tab,換行,回車)

compareoperator ["<""="">"]"="? 表示比較運算子(包括:<,=,>,<=,==,>=)

[a-z] 表示任何乙個長度不超過8的字串

("+"|"-")?[0-9]+ 表示有符號整數

("+"|"-")?[0-9]+("."[0-9])? 表示可帶小數點的有符號數

("+"|"-")?[0-9]+("."[0-9])?(e("+"|"-")?[0-9]+)? 表示可帶指數的有符號數

lex源程式結構:(分為三部分,各部分用%%隔開)

(1)說明部分

說明部分用於定義識別規則中要用到的正規表示式名,包括:變數說明、識別符號常量說明、正則定義、c語言的說明資訊。

其中c語言的說明資訊必須用分界符「%」括起來,該部分主要包括將來生成詞法分析程式要使用的一些庫檔案和全域性變數的宣告,%中間的內容

會原封不動地複製到lex生成的詞法分析程式的最前部。

下面是說明部分的一段lex**:

%chars [a-za-z]

numbers ([0-9])+

delim [" "\n\t]

whitespace +

words +

%%(2)識別規則

識別規則用正規表示式給出單詞的定義,以及在識別出該正規表示式以後要執行的程式片段,形式如下:

p1 p2 ..

.p3

這裡的pi(i=1,2...n)表示正規表示式,

表示當識別出pi表示式所表達的字串時,詞法分析應執行的動作的c語言程式語句(該語句一般是返回該字串記號和字串值)

例如:

(3)輔助過程

輔助過程給出使用者所需要的其他操作,它是識別規則的某些動作需要呼叫的過程。如果不是c語言的庫函式,則要在此給出具體的定義。這些程式也可以

存入另外的程式檔案中,單獨編譯,最後和詞法分析程式連線裝配到一起。

例如:void main()

int yywrap()

lex變數和函式:

lex 有幾個函式和變數提供了不同的資訊,可以用來編譯實現複雜函式的程式。下表中列出了一些變數和函式,以及它們的使用。

lex 變數:

yyin file* 型別。 它指向 lexer 正在解析的當前檔案。

yyout file* 型別。 它指向記錄 lexer 輸出的位置。 預設情況下,yyin 和 yyout 都指向標準輸入和輸出。

yytext 匹配模式的文字儲存在這一變數中(char*)。

yyleng 給出匹配模式的長度。

yylineno 提供當前的行數資訊。(lexer不一定支援。)

lex 函式

yylex() 這一函式開始分析。 它由 lex 自動生成。

yywrap() 這一函式在檔案(或輸入)的末尾呼叫。如果函式的返回值是1,就停止解析。 因此它可以用來解析多個檔案。**可以寫在第三段, 這就能夠解析多個檔案。 方法是使用 yyin 檔案指標(見上表)指向不同的檔案,直到所有的檔案都被解析。最後,yywrap() 可以返回 1 來

表示解析的結束。

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

lex和yacc格式入門

lex和yacc格式入門 lex檔案 hi oi n tchau bye n int main void int yywrap void yacc檔案 token hi bye program hi bye hi hi bye bye int yyerror char msg 會發現它們的結構都很相...

Lex與Yacc學習(四)之Lex規範

lex程式由三部分組成 定義段 規則段和使用者子例程式段 定義段.規則段.使用者子例程式段.這些部分由以兩個百分號組成的行分隔開。儘管某一部分可以為空,但前兩部分是必須的,第三部分和前面的 行可以忽略。定義段包括文字塊 定義 內部表宣告 起始條件和轉換。以空白開頭的行被逐字拷貝到c檔案中,通常,這用...

lex學習筆記

yyleng 只要掃瞄程式匹配標記時,標記的文字就儲存在以空字元終止的字串yytext中,而且它的長度儲存在yyleng中,yyleng中的長度與由strlen yytext 返回的值是相同的。yyless 從與規則相關的 中呼叫yyless n 這條規則推回除標記開頭的幾個字元以外的所有字元。當決...