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的資料模型類,本質上是乙...