編譯原理之初學Lex

2021-10-22 19:16:25 字數 942 閱讀 8384

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

//注意以下為.l檔案中的**。%%

%[a-z]}[

0-9]

}[a-z]

}\n ./*

前三種情況下字元數都加一。如果flag是1,則單詞數加一,再把flag變成0.

如果為\n,說明換行了。行數加一,字元數加一。flag變為1.

如果為.,則字元數加一,flag變為1(空格後即為新詞)*/%

%int

main()

yyin = file;

yylex()

;printf

("行數: %d\n"

, linenum)

;printf

("字元個數: %d\n"

, charnum)

;printf

("單詞個數: %d\n"

, wordnum)

;return0;

}

**部分反倒沒那麼難,直接匹配規則即可。我舍友沒這麼寫,用了一大堆yylex庫函式,反倒顯得我這麼寫比較取巧。。。

主要耗費我時間的地方在於一開始的環境配置。在我第一次做的時候,前面一路順風順水,直到最後一步,在visual studio中執行的時候一直提示yylex()未宣告,以及其他的幾個yy變數未定義。我一開始認為是我的庫有問題,於是更換了庫重新做,還是不行。之後懷疑是路徑問題,於是用了個全新的路徑,也不行。。。在忙了2個小時以後我放棄了,直接在舍友的電腦上重新做了一次,一遍過。。。。。。可能真就是我電腦的問題(無語)。之後我把生成的.l、.c、.h拷到我電腦上,之後再用這些執行就成功了。

lex初學總結(二)

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 s...

lex初學總結(一)

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

編譯原理 用Lex做詞法分析

08年9月入學,12年7月畢業,結束了我在軟體學院愉快豐富的大學生活。此系列是對四年專業課程學習的回顧,索引參見 用lex建立乙個詞法分析器 衝突解決規則 1 總是選擇最長的字首 2 如果最長的可能字首與多個模式匹配,總是選擇lex中先被列出的模式。安裝parser generator,並編譯lex...