lex初學總結(二)

2022-03-19 03:31:57 字數 1359 閱讀 7159

iii. lex**格式

這裡以乙個能分析類似c語言的lex程式原始碼+注釋來說明。

%

//在這裡定義re表示式

keyword   ("if

"|"while"|

"do"|

"break"|

"true"|

"false"|

"int"|

"char"|

"bool"|

"real"|

"float"|

"switch"|

"case")

digit    [0-

9]letter [a-za

-z]symbol [\+\

-\*\

/><=!

;,(){}\[\]]

id  +(

|)*number

+(\.+)

?(e[+\

-]?+

)?comment (\/\

*(((\*)

*[^\

*\/]

+(\/)

*)*|(\*)

*|(\/)

*)\*\

/)delim [ \t\n]

ws

+illegal [^]

%%//在這裡定義模式和匹配操作(注意這裡的匹配是安先後順序進行的,順序不當也會導致邏輯錯誤)

%%//在這裡完成c語言程式的其他部分(可以放到其他檔案中),包括yywrap()等函式的具體實現和main()函式等

intyywrap()

intmain()

if(yylex()==1

)}

總結起來如下:

%

re定義部分

%%模式匹配與動作

%%其它c語言**

iv. lex 編譯過程

*.l檔案 —lex編譯器—> lex.yy.c檔案 —c編譯器(正常c編譯過程)—> 可執行檔案

由於這個設計,我們完全可以將其他的c**寫在單獨的檔案裡,在c編譯過程中再統一編譯並鏈結起來,這樣可以方便**的管理和重用。

一次典型的編譯過程如下(採用flex):

user@local:exp_1$ flex exp_1.l

user@local:exp_1$ gcc lex.yy.c -o exp_1

user@local:exp_1$ ./exp_1

不過,每次執行這個步驟還是很麻煩的,所以一般採用make進行編譯和管理。

其實lex很少單獨使用,一般是和yacc配合使用。所以筆記就都到此為止。

lex初學總結(一)

最近在學習編譯原理,寫些lex yacc的總結備忘。根據 lex與yacc 中文第二版 i.re的表示 匹配除 n外的任意字元 匹配符號前表示式的0次或多次出現 閉包 匹配符號前表示式的1次或多次出現 匹配符號前表示式的0或1次出現 表示式間的邏輯或 用來指定範圍,如 a z,0 9,a z等 匹配...

編譯原理之初學Lex

初學編譯原理,老師布置了乙個小task 計算乙個文字中的字元數和行數。想著應該沒多難,結果最後因為種種也是搗鼓了蠻久的。不過有一說一倒是感覺這種先寫出一段 再用別的程式跑出來生成新的 之後執行的感覺蠻有意思的。等過兩天寫個yacc看看 或許到時候就不那麼想了。注意以下為.l檔案中的 a z 0 9 ...

Django初學總結(二)

開發模式 專案和應用的建立 設計資料庫和表結構是做 的基礎,因為python和django能夠直接完成這些操作,所以可以不需要設定先。建立應用後,利用django開發 系統要寫在.blog models.py中寫乙個類,這個類與資料庫中的資料表具有對應關係。一下為編寫blog的資料模型類,本質上是乙...